Files
mercury/tests/hard_coded/delay_partial_test.m
Peter Wang b45b70199b Add a post-processing pass directly after mode checking that tries to transform
Estimated hours taken: 30
Branches: main

Add a post-processing pass directly after mode checking that tries to transform
procedures to avoid intermediate partially instantiated data structures.  The
Erlang backend in particular cannot handle partially instantiated data
structures.

compiler/delay_partial_inst.m:
	New module.

compiler/check_hlds.m:
	Import delay_partial_inst.m

compiler/modes.m:
	Call the delay partial instantiations pass after mode checking succeeds
	if it is enabled.

compiler/options.m:
	Add a new internal option `--delay-partial-instantiations', disabled by
	default.

compiler/handle_options.m:
	Make Erlang target imply --delay-partial-instantiations.

compiler/notes/compiler_design.html:
	Mention delay_partial_inst.m

tests/hard_coded/Mercury.options:
tests/hard_coded/Mmakefile:
tests/hard_coded/delay_partial_test.exp:
tests/hard_coded/delay_partial_test.m:
tests/hard_coded/delay_partial_test2.exp:
tests/hard_coded/delay_partial_test2.m:
	Add test cases for --delay-partial-instantiations.

compiler/goal_util.m:
	Fix a comment.
2007-06-25 00:58:14 +00:00

92 lines
1.7 KiB
Mathematica

% Test the --delay-partial-instantiations option.
:- module delay_partial_test.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
%-----------------------------------------------------------------------------%
:- implementation.
:- import_module char.
:- import_module int.
%-----------------------------------------------------------------------------%
:- type t
---> f(int)
; g(int, int)
; h(t, t).
:- type blah
---> blah(
a :: int,
b :: int,
c :: char
).
main(!IO) :-
test1(!IO),
test2(!IO),
test3(!IO),
test4(!IO).
% Test implied mode calls.
:- pred test1(io::di, io::uo) is det.
test1(!IO) :-
(if foo(h(_, _)) then
io.write_string("implied mode call 1 ok\n", !IO)
else
io.write_string("implied mode call 1 bad\n", !IO)
).
:- pred test2(io::di, io::uo) is det.
test2(!IO) :-
(if foo(g(_, _)) then
io.write_string("implied mode call 2 bad\n", !IO)
else
io.write_string("implied mode call 2 ok\n", !IO)
).
% Test constructing things.
:- pred test3(io::di, io::uo) is det.
test3(!IO) :-
Foo ^ a = 42,
Foo ^ b = 43,
Foo ^ c = 'x',
io.print(Foo, !IO),
io.nl(!IO).
:- pred test4(io::di, io::uo) is det.
test4(!IO) :-
Bar ^ b = Baz ^ b,
Baz ^ c = X,
Bar ^ a = Bar ^ b,
(if foo(f(_)) then
X = Bar ^ c,
Bar ^ c = 'x'
else
X = 'z',
Bar ^ c = 'y'
),
Baz ^ a = 43,
Baz ^ b = -42,
io.print({Bar, Baz}, !IO),
io.nl(!IO).
:- pred foo(t::out) is multi.
:- pragma no_inline(foo/1).
foo(f(42)).
foo(h(f(43), g(44, 45))).
% vim: ft=mercury ts=8 sw=4 et wm=0 tw=0