mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
79 lines
1.7 KiB
Mathematica
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")
|
|
).
|