Files
mercury/tests/invalid_nodepend/bad_foreign_proc.m
Zoltan Somogyi 6413b4fb08 Create invalid_nodepend and invalid_onlydepend.
tests/invalid_onlydepend:
    Move the one test case in tests/invalid for which we want to check
    the error messages generated during the generation of dependencies
    to this new test directory.

tests/invalid_nodepend:
    Move all test cases in tests/invalid which get errors during the
    generation of dependencies but for which we want to check the error
    messages generated during normal compilation to this new test directory.

tests/invalid_nodepend/Mmakefile:
tests/invalid_nodepend/Mercury.options:
tests/invalid_onlydepend/Mmakefile:
tests/invalid_onlydepend/Mercury.options:
    Versions of the same files in tests/invalid, but containing only
    the entries relevant to the moved test cases.

tests/invalid/Mmakefile:
tests/invalid/Mercury.options:
    Delete the entries that refer to the moved test cases.

tests/README:
    Document the two new test directories.

tools/bootcheck:
    Add invalid_onlydepend and invalid_nodepend to the list of
    test directories.
2021-07-28 00:59:04 +10:00

74 lines
1.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
%---------------------------------------------------------------------------%
%
% Test for error messages produced by syntax errors in 'foreign_proc' pragmas.
%
:- module bad_foreign_proc.
:- interface.
:- pred foo(int::in, int::out) is det.
:- implementation.
% Too few arguments.
%
:- pragma foreign_proc("C").
% Too many arguments.
%
:- pragma foreign_proc("C",
foo(A::in, B::ouit),
[promise_pure],
"
B = A;
", "Extra argument").
% Invalid foreign language.
%
:- pragma foreign_proc("InvalidLanuage",
foo(A::in, B::out),
[promise_pure],
"
B = A;
").
% Pred argument is not an atom.
%
:- pragma foreign_proc("C", "foo", [promise_pure], "B = A;").
% Invalid attributes argument
%
:- pragma foreign_proc("C", foo(A::in, B::out), "promise_pure", "B = A;").
% XXX the compiler apparently accepts this.
%
:- pragma foreign_proc("C", foo(A::in, B::out), promise_pure, "B = A;").
% Conflicting foreing_proc attributes.
%
:- pragma foreign_proc("C",
foo(A::in, A::out),
[promise_pure, promise_semipure, thread_safe, not_thread_safe],
"
B = A;
").
% ForeignCode is not a string.
%
:- pragma foreign_proc("C", foo(A::in, B::out), [promise_pure], 5555).
% Check contexts on arguments.
%
:- pragma foreign_proc(
"InvalidLanguage",
"foo",
"promise_pure",
6666
).
foo(X, X).
:- pragma foreign_proc("Erlang", foo(A::in, B::out), [promise_pure], "B = A").