Files
mercury/tests/invalid/foreign_enum_invalid.m
Julien Fischer 2985037e86 Improve error reporting for foreign_enum pragmas.
Have the parser, rather than the parse tree -> HLDS conversion, check for the
third argument of a foreign_enum pragma being an empty list.  (A enumeration
must define at least one constant in order to be an enumeration so the list
should never be non-empty.)

Parse each argument of a foreign_enum pragma separately and report all of the
errors (well, most of them -- see below) that occur in one go.

Minor improvements and fixes to the wording of parser error messages for
foreign_enum pragmas.

Improve test coverage of error messages for parsing pragmas.

compiler/parse_pragma.m:
    Parse each argument of a foreign_enum pragma separately and report
    all the errors that occur.  The handling of the third argument is
    not as good as it could be -- add an XXX comment about it.

    Check that the third argument of a foreign_enum pragma is not an
    empty list during parsing -- while we currently generate an error
    for this during parse tree -> HLDS conversion, that error is not
    entirely accurate and we may as well catch this error earlier in
    any case.

    Do not incorrectly refer to 'foreign_export_enum' pragmas in error
    messages about 'foreign_enum' pragmas.  Factor out the shared code
    that was the cause of this more thoroughly.

    Improve and fix parser error messages for foreign_enum pragmas.

    Fix spelling in the error message for a misformed pragma declaration.

    Fix a misspelled predicate name: s/unrecogized/unrecognized/

    Fix the wording and spelling in some comments.

tests/invalid/bad_foreign_enum.{m,err_exp}:
    Extend this test case to cover the above.

tests/invalid/foreign_enum_invalid.{m,err_exp}:
    Delete the test for an empty mapping list, that situation is now
    caught earlier.

tests/invalid/invalid_pragma.{m,err_exp}:
    Test the error message for an invalid pragma.

tests/invalid/unrecognized_pragma.{m,err_exp}:
    Test the error message for an unrecognized pragma.

tests/invalid/Mmakefile:
    Add the new test cases.
2016-05-19 23:30:21 +10:00

41 lines
876 B
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module foreign_enum_invalid.
:- interface.
:- type incomplete
---> foo
; bar
; baz.
:- type not_a_bijection
---> a
; b
; c.
:- type in_int
---> in_int.
:- pragma foreign_enum("C", in_int/0, [in_int - "300"]).
:- type dup_foreign_enum ---> dup_foreign_enum.
:- implementation.
:- pragma foreign_enum("C", incomplete/0, [
foo - "3",
bar - "4"
]).
:- pragma foreign_enum("C", not_a_bijection/0, [
a - "30",
a - "40",
b - "60",
c - "60"
]).
:- pragma foreign_enum("C", dup_foreign_enum/0, [dup_foreign_enum - "400"]).
:- pragma foreign_enum("C", dup_foreign_enum/0, [dup_foreign_enum - "500"]).