mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-18 10:53:40 +00:00
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.
41 lines
876 B
Mathematica
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"]).
|