mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-27 23:34:52 +00:00
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.
92 lines
1.7 KiB
Mathematica
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
|