Files
mercury/tests/valid/bug128.m
Zoltan Somogyi 6e336e38f6 Fix Mantis bug #128.
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.
2010-09-15 02:29:01 +00: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, [], []).