Files
mercury/tests/valid/static.m
Julien Fischer f3a34e4651 Replace uses of __ as a module qualifier.
samples/muz.zbstract.m:
tests/*/*.m:
    As above.
2022-04-14 20:25:10 +10:00

121 lines
2.8 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% mmc -c --grade hlc.gc static.c
% static.c(455) : error C2065: 'static__const_Result_5' : undeclared identifier
:- module static.
:- interface.
:- type t.
:- type t4.
:- type t5.
:- pred q(t::in, t5::out) is det.
:- pred r(t::in, t5::out, int::out) is multi.
:- pred s(int::in, t5::out) is cc_nondet.
:- pred t(t::in, t4::out, t5::out) is semidet.
:- pred u(t4::out, t5::out, int::out) is nondet.
:- pred v(t4::out, t5::out, int::out) is nondet.
:- implementation.
:- import_module int.
:- import_module list.
:- type t
---> a
; b
; c.
:- type t4
---> f(string, int).
:- type t5
---> g(t4, t4)
; i.
% Test for ordinary if-then-else
q(X, Y) :-
( if
X = a,
% This line causes the problem. Move it into the then part
% to avoid the above code gen problem. We can move it into the
% then part because this line isn't part of the test.
Result = f("hello", 0)
then
Y = g(Result, Result)
else
Y = i
).
% Test for if-then-else with nondet condition
r(X, Y, Z) :-
( if
X = a,
(Z0 = 1 ; Z0 = 2),
% This line causes the problem. Move it into the then part
% to avoid the above code gen problem. We can move it into the
% then part because this line isn't part of the test.
Result = f("hello", 0)
then
Z = Z0,
Y = g(Result, Result)
else
Z = 0,
Y = i
).
% Test for commit
s(X, Y) :-
some [Z] (
(Z = 1 ; Z = 2),
X = Z * Z,
Result = f("hello", 0)
),
Y = g(Result, Result).
% Test same variable having different constant values
% in different branches (semidet)
t(X, Result, Y) :-
(
X = a,
Result = f("hello", 0),
Y = g(Result, Result)
;
X = b,
Result = f("goodbye", 0),
Y = g(Result, Result)
).
% Test same variable having different constant values
% in different branches (nondet)
u(Result, Y, Z) :-
(
Result = f("hello", 0),
list.member(Z, [1, 2]),
Y = g(Result, Result)
;
Result = f("hello again", 0),
Result2 = f("GoodBye", 0),
list.member(Z, [3, 4]),
Y = g(Result, Result2)
).
% Exactly the same as u/3, but with different constants;
% this tests to ensure that any constant values hoisted
% out to the top level are given distinct names.
v(Result, Y, Z) :-
(
Result = f("xxxxx", 0),
list.member(Z, [1, 2]),
Y = g(Result, Result)
;
Result = f("yyyyyyyyyyy", 0),
Result2 = f("zzzzzzz", 0),
list.member(Z, [3, 4]),
Y = g(Result, Result2)
).