mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 18:03:36 +00:00
tests/invalid_nodepend/Mercury.options:
tests/invalid_purity/Mercury.options:
Let several test cases proceed to the compiler invocation we want to test.
tests/submodules/impl_def_literal.m:
Comment out the atomic goal in this test case. (See below for the reason.)
tests/valid/big_foreign_type.m:
tests/valid/bug318.m:
tests/valid/flatten_conj_bug.m:
tests/valid/ho_and_type_spec_bug.m:
tests/valid/mert.m:
tests/valid/param_mode_bug.m:
These test cases were missing C# definitions (and in some cases,
Java definitions) of types and/or predicates. Add them.
tests/warnings/Mercury.options:
tests/warnings/Mmakefile:
Update references to a not-long-ago renamed file.
tests/warnings/foreign_singleton.m:
Add Java and C# definitions of some predicates.
tests/warnings/foreign_singleton.exp:
Update the line numbers in the expected output for C.
tests/warnings/foreign_singleton.exp[23]:
Add these expected output files for Java and C#.
compiler/simplify_goal.m:
Generate an error message if we find an atomic goal
but we are targeting a language which has no definitions
for the primitive operations used in the implementation of such goals.
Until now, for tests/submodules/impl_def_literal.m (which until now
contained an atomic goal), the compiler would generate code that
aborted at runtime. We report the problem, which avoids the generation
of code that would abort.
57 lines
1.5 KiB
Mathematica
57 lines
1.5 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% rotd-2006-09-18 and before would not compile the following because
|
|
% the fact that the inst varsets attached to the clauses and the mode
|
|
% declarations are different meant that it couldn't work out which mode
|
|
% belonged to which clause. The fix is to allow for a renaming between
|
|
% inst variables.
|
|
%
|
|
% A similar thing occurs with the inst varset attached to foreign_export
|
|
% pragmas.
|
|
%
|
|
:- module param_mode_bug.
|
|
:- interface.
|
|
|
|
:- type list(T)
|
|
---> []
|
|
; [T | list(T)].
|
|
|
|
:- pred foo(list(T), list(T)).
|
|
:- mode foo(in(I), out(I)) is det.
|
|
:- mode foo(out(I), in(I)) is det.
|
|
|
|
:- pred bar(list(T)::in(I), list(T)::out(I)) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- pragma promise_equivalent_clauses(foo/2).
|
|
|
|
foo(X::in(I), X::out(I)).
|
|
foo(Y::out(I), X::in(I)) :-
|
|
foo_2(Y, X).
|
|
|
|
:- pred foo_2(list(T)::out(I), list(T)::in(I)) is det.
|
|
:- pragma foreign_proc("C",
|
|
foo_2(Y::out(I), X::in(I)),
|
|
[promise_pure, thread_safe, will_not_call_mercury],
|
|
"
|
|
Y = X;
|
|
").
|
|
:- pragma foreign_proc("Java",
|
|
foo_2(Y::out(I), X::in(I)),
|
|
[promise_pure, thread_safe, will_not_call_mercury],
|
|
"
|
|
Y = X;
|
|
").
|
|
:- pragma foreign_proc("C#",
|
|
foo_2(Y::out(I), X::in(I)),
|
|
[promise_pure, thread_safe, will_not_call_mercury],
|
|
"
|
|
Y = X;
|
|
").
|
|
|
|
:- pragma foreign_export("C", bar(in(I), out(I)), "BAR").
|
|
bar(X, X).
|