Files
mercury/tests/valid/bug128.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

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, [], []).