Files
mercury/tests/valid/bug128.m
Zoltan Somogyi c03b11ca48 Update the style of more test cases.
And updated expected outputs for changed line numbers.
2021-07-27 19:29:21 +10:00

67 lines
1.5 KiB
Mathematica

% vim: ts=4 sw=4 et ft=mercury
%
% This a regression test for Mantis bug #128. The bug was that the loop
% invariants pass considered the unification that constructed a partially
% instantiated term (_L3 - comma in parse_enum0) to be an invariant goal,
% and attempted to hoist it out of parse_enum0's loop. Due to the free
% variable inside the term, this yielded a compiler abort.
:- module bug128.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
%---------------------------------------------------------------------------%
:- implementation.
:- import_module assoc_list.
:- import_module int.
:- import_module list.
:- import_module maybe.
:- import_module pair.
:- import_module string.
:- type tokens == assoc_list(int, token).
:- type token
---> comma
; symbol(string)
; eof.
main(!IO) :-
write_string("Hello, world!\n", !IO).
:- type value
---> value(int, value0).
:- type value0
---> value_sym(string).
:- type parse_res(T)
---> ok(T)
; error.
:- pred parse_enum0(int::in, assoc_list(string, maybe(value))::in,
parse_res(value)::out, tokens::in, tokens::out) is det.
parse_enum0(L, Vs0, Res, !Ts) :-
( if next(_L2 - symbol(Sym), !Ts) then
( if next(_L3 - comma, !Ts) then
Vs = [Sym - no | Vs0],
parse_enum0(L, Vs, Res, !Ts)
else
Res = error
)
else
Res = error
).
:- pred next(pair(int, token)::out, tokens::in, tokens::out) is det.
next(L - T, [L - T | Ts], Ts).
next(0 - eof, [], []).