mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-16 06:14:59 +00:00
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.
This commit is contained in:
@@ -163,11 +163,14 @@ OTHER_SOURCES= \
|
||||
vn_float.m \
|
||||
zero_arity.m
|
||||
|
||||
# The mode system can't handle the following test cases yet:
|
||||
# XXX The mode system can't handle the following test cases yet:
|
||||
# assoc_list.m
|
||||
# determinism.m
|
||||
# mode_merge_insts.m
|
||||
# inst_perf_bug_2.m
|
||||
#
|
||||
# XXX We also don't pass this one (see the comments in it for details):
|
||||
# mode_selection.m
|
||||
|
||||
# There used to be problems with compiling typeclass
|
||||
# and AGC stuff in grades jump.* and fast.*, but they should
|
||||
|
||||
45
tests/valid/mode_selection.m
Normal file
45
tests/valid/mode_selection.m
Normal file
@@ -0,0 +1,45 @@
|
||||
:- 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").
|
||||
Reference in New Issue
Block a user