Files
mercury/tests/invalid/record_syntax_errors.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

63 lines
1.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module record_syntax_errors.
:- interface.
:- type exist_cons
---> some [T] exist_cons(field1::int, field2::T, field3::T).
:- type cons
---> cons(field4::int, field5::int, field6::cons2).
:- type cons2
---> cons2(field7::int, field8::int).
:- pred dcg_syntax(cons::in, cons::out) is det.
:- pred dcg_syntax_2(cons::in, cons::out) is det.
:- pred dcg_type_error(cons::in, cons::out) is det.
:- pred construct_exist_cons(exist_cons::out) is det.
:- pred arg_type_error(cons::out) is det.
:- mode field8(in) = out is det.
:- implementation.
dcg_syntax -->
{ Field = field4 },
^ Field := 1.
dcg_syntax_2 -->
X := Y.
dcg_type_error -->
^ field4 := 2.
construct_exist_cons(ExistCons) :-
ExistCons0 = 'new exist_cons'(1, 'b', 'c'),
% This field cannot be updated because it shares
% an existentially quantified type variable
% with another field - updating the field changes
% the type of the field.
ExistCons = ExistCons0 ^ field2 := 1.
arg_type_error(Cons) :-
Cons0 = cons(1, 2, cons2(3, 4)),
Cons = Cons0 ^ field6 ^ field7 := "invalid value".
term_type_error(Cons) :-
Cons0 = cons(1, 2, cons2(3, 4)),
Cons = Cons0 ^ field6 ^ field4 := 1.
% Check error message for local declarations for access functions
% for exported fields.
:- func field4(cons) = int.
% Check error message for clauses for automatically generated access functions.
field4(_) = 1.