Files
mercury/tests/hard_coded/switch_detect.m
2020-10-06 19:20:18 +11:00

79 lines
1.7 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% This is a test to check the proper functioning of the code in switch_detect.m
% that looks for switch unifications inside nested disjunctions.
%
% We also test that the compiler doesn't give a warning for the if-then-else
% condition containing X = h(I, F): that unification is equivalent to false
% in one arm of the generated switch and to true in the other, but it is
% not redundant in the source code.
%
:- module switch_detect.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int.
:- import_module require.
:- type t
---> f
; g(int)
; h(int, float).
main(!IO) :-
read_t(X, !IO),
(
X = f,
io.write_string("f\n", !IO)
;
( X = g(_) ; X = h(_, _) ),
io.write_line(X, !IO),
( if X = h(I, F) then
io.write_string("h: ", !IO),
io.write_int(I, !IO),
io.write_string(" ", !IO),
io.write_float(F, !IO),
io.nl(!IO)
else
true
)
),
read_t(Y, !IO),
(
Y = f,
Num = 42
;
Z = Y,
(
Z = g(Num)
;
W = Z,
W = h(Num0, _),
Num = Num0 + 5
)
),
io.write_int(Num, !IO),
io.nl(!IO).
:- pred read_t(t::out, io::di, io::uo) is det.
read_t(X, !IO) :-
io.read(Res, !IO),
(
Res = ok(X)
;
Res = error(_, _),
error("cannot read")
;
Res = eof,
error("eof")
).