Files
mercury/tests/valid/mode_selection.m
Fergus Henderson 2e85d6c887 Add a test case (currently disabled, since we don't pass it)
Estimated hours taken: 0.5
Branches: main

tests/valid/Mmakefile:
tests/valid/mode_selection.m:
	Add a test case (currently disabled, since we don't pass it)
	which tests that we do flattening bottom-up rather than top-down.
2001-05-16 17:46:22 +00:00

46 lines
1.3 KiB
Mathematica

:- module mode_selection.
:- interface.
:- import_module io.
:- pred main(io__state::di, io__state::uo) is det.
:- implementation.
:- import_module require.
% Currently (May 2001) we don't pass this test case,
% because the compiler's expression flattening puts
% the sub-goals in top-down order, rather than
% (as the language reference manual requires)
% ordering them bottom-up. This means that the call to
% func2 gets flattened as
% { V_1 = func2(In, V_2) },
% { V_2 = In },
% { print(V_1) }
% rather than as
% { V_1 = func2(In, V_2) },
% { V_2 = In },
% { print(V_1) }
% which causes mode analysis to select the wrong mode in the
% call to func2, which in turn causes a determinism error.
%
% The rationale for keeping the current behaviour is that
% the naive fix of just flattening to bottom-up order
% causes performance problems in type checking, in particular
% when compiling compiler/options.m.
% Eventually we ought to change the type checker to use
% a different algorithm that doesn't have this performance
% problem, then we can fix flattening, and this test case
% will then pass.
main -->
{ In = 42 },
print(func2(In, In)), nl.
:- func func2(int, int) = string.
:- mode func2(in, in) = out is det.
:- mode func2(in, out) = out is det.
:- mode func2(out, in) = out is det.
:- mode func2(out, out) = out is det.
func2(_, _) = _ :-
error("called func2/2").