mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-24 13:53:54 +00:00
Estimated hours taken: 4 Branches: main Fix Mantis bug #128. compiler/loop_inv.m: Fix the bug. The bug was that the loop invariants pass considered the unification that constructed a partially instantiated term to be an invariant goal, and attempted to hoist it out of its predicate. Due to the free variable inside the term, this yielded a compiler abort. Improve the names of predicates and types. tests/valid/bug128.m: Add the regression test for this bug. tests/valid/Mmakefile: tests/valid/Mercury.options: Enable the test case.
67 lines
1.5 KiB
Mathematica
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, [], []).
|