Files
mercury/tests/valid/param_mode_bug.m
Zoltan Somogyi fdd141bf77 Clean up the tests in the other test directories.
tests/invalid/*.{m,err_exp}:
tests/misc_tests/*.m:
tests/mmc_make/*.m:
tests/par_conj/*.m:
tests/purity/*.m:
tests/stm/*.m:
tests/string_format/*.m:
tests/structure_reuse/*.m:
tests/submodules/*.m:
tests/tabling/*.m:
tests/term/*.m:
tests/trailing/*.m:
tests/typeclasses/*.m:
tests/valid/*.m:
tests/warnings/*.{m,exp}:
    Make these tests use four-space indentation, and ensure that
    each module is imported on its own line. (I intend to use the latter
    to figure out which subdirectories' tests can be executed in parallel.)

    These changes usually move code to different lines. For the tests
    that check compiler error messages, expect the new line numbers.

browser/cterm.m:
browser/tree234_cc.m:
    Import only one module per line.

tests/hard_coded/boyer.m:
    Fix something I missed.
2015-02-16 12:32:18 +11:00

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("Erlang",
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).