mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
... in the general and hard_coded test case directories.
tests/general/Mercury.options:
tests/general/Mmakefile:
tests/general/commit_bug_1.exp:
tests/general/commit_bug_1.m:
Rename the commit_bug test case as commit_bug_1, due to the existence
of commit_bug_2.
tests/general/intermod_type.m:
tests/general/intermod_type_helper_1.m:
Rename intermod_type2.m as intermod_type_helper_1.m.
tests/general/nondet_ite_1.exp:
tests/general/nondet_ite_1.m:
Rename the nondet_ite test case as nondet_ite_1, due to the existence
of nondet_ite_[234].
tests/general/string_format_test_1.exp:
tests/general/string_format_test_1.exp2:
tests/general/string_format_test_1.exp3:
tests/general/string_format_test_1.m:
Rename the string_format_test test case as string_format_test_1,
due to the existence of string_format_test_[23].
tests/general/string_test_1.exp:
tests/general/string_test_1.m:
Rename the string_test test case as string_test_1,
due to the existence of string_test_2.
tests/hard_coded/Mercury.options:
tests/hard_coded/Mmakefile:
tests/hard_coded/array_test_1.exp:
tests/hard_coded/array_test_1.m:
tests/hard_coded/array_test_2.exp:
tests/hard_coded/array_test_2.m:
Rename the array_test and array_test2 test cases as
array_test_1 and array_test_2.
tests/hard_coded/bad_indirect_reuse_1.exp:
tests/hard_coded/bad_indirect_reuse_1.m:
tests/hard_coded/bad_indirect_reuse_2.exp:
tests/hard_coded/bad_indirect_reuse_2.m:
tests/hard_coded/bad_indirect_reuse_3.exp:
tests/hard_coded/bad_indirect_reuse_3.m:
tests/hard_coded/bad_indirect_reuse_4.exp:
tests/hard_coded/bad_indirect_reuse_4.m:
Rename the bad_indirect_reuse and bad_indirect_reuse[234] test cases
as bad_indirect_reuse_[1234].
tests/hard_coded/copy_pred_1.exp:
tests/hard_coded/copy_pred_1.m:
Rename the copy_pred test case as copy_pred_1, due to the existence
of copy_pred_2.
tests/hard_coded/curry_1.exp:
tests/hard_coded/curry_1.m:
tests/hard_coded/curry_2.exp:
tests/hard_coded/curry_2.m:
tests/hard_coded/curry_2_helper_1.m:
Rename the curry and curry2 test cases as curry_1 and curry_2,
and rename the curry2_test module as curry_2_helper_1.
tests/hard_coded/cycles_1.exp:
tests/hard_coded/cycles_1.m:
tests/hard_coded/cycles_2.exp:
tests/hard_coded/cycles_2.m:
Rename the cycles and cycles2 test cases as cycles_1 and cycles_2.
tests/hard_coded/delay_partial_test_1.exp:
tests/hard_coded/delay_partial_test_1.m:
tests/hard_coded/delay_partial_test_2.exp:
tests/hard_coded/delay_partial_test_2.m:
Rename the delay_partial_test and delay_partial_test2 test cases
as delay_partial_test_1 and delay_partial_test_2.
tests/hard_coded/dense_lookup_switch_1.exp:
tests/hard_coded/dense_lookup_switch_1.m:
tests/hard_coded/dense_lookup_switch_2.exp:
tests/hard_coded/dense_lookup_switch_2.m:
tests/hard_coded/dense_lookup_switch_3.exp:
tests/hard_coded/dense_lookup_switch_3.m:
tests/hard_coded/dense_lookup_switch_4.exp:
tests/hard_coded/dense_lookup_switch_4.m:
Rename the dense_lookup_switch and dense_lookup_switch[234] test cases
as dense_lookup_switch_[1234].
tests/hard_coded/dense_lookup_switch_non_1.exp:
tests/hard_coded/dense_lookup_switch_non_1.m:
tests/hard_coded/dense_lookup_switch_non_2.exp:
tests/hard_coded/dense_lookup_switch_non_2.m:
Rename the dense_lookup_switch_non and dense_lookup_non2 test cases
as dense_lookup_switch_non_[12].
tests/hard_coded/direct_arg_partial_inst_1.exp:
tests/hard_coded/direct_arg_partial_inst_1.m:
tests/hard_coded/direct_arg_partial_inst_2.exp:
tests/hard_coded/direct_arg_partial_inst_2.m:
Rename the direct_arg_partial_inst and direct_arg_partial_inst2 test cases
as direct_arg_partial_inst_[12].
tests/hard_coded/direct_arg_tags_1.exp:
tests/hard_coded/direct_arg_tags_1.m:
Rename the direct_arg_tags test case as direct_arg_tags_1, due to
the existence of direct_arg_tags_2.
tests/hard_coded/export_test_1.exp:
tests/hard_coded/export_test_1.m:
tests/hard_coded/export_test_2.exp:
tests/hard_coded/export_test_2.m:
Rename the export_test and export_test2 test cases as export_test_[12].
tests/hard_coded/follow_code_bug_1.exp:
tests/hard_coded/follow_code_bug_1.m:
Rename the follow_code_bug test case as follow_code_bug_1, due to
the existence of follow_code_bug_2.
tests/hard_coded/foreign_type_1.exp:
tests/hard_coded/foreign_type_1.m:
tests/hard_coded/foreign_type_2.exp:
tests/hard_coded/foreign_type_2.m:
tests/hard_coded/foreign_type_3.exp:
tests/hard_coded/foreign_type_3.m:
Rename the foreign_type and foreign_type[23] test cases
as foreign_type_[123].
tests/hard_coded/functor_ho_inst_1.exp:
tests/hard_coded/functor_ho_inst_1.m:
Rename the functor_ho_inst test case as functor_ho_inst_1, due to
the existence of functor_ho_inst_2.
tests/hard_coded/functor_ho_inst_excp_1.exp:
tests/hard_coded/functor_ho_inst_excp_1.m:
Rename the functor_ho_inst_excp test case as functor_ho_inst_excp_1,
due to the existence of functor_ho_inst_excp_2.
tests/hard_coded/higher_order_syntax_1.exp:
tests/hard_coded/higher_order_syntax_1.m:
tests/hard_coded/higher_order_syntax_2.exp:
tests/hard_coded/higher_order_syntax_2.m:
Rename the higher_order_syntax and higher_order_syntax2 test cases
as higher_order_syntax_[12].
tests/hard_coded/ho_order_1.exp:
tests/hard_coded/ho_order_1.m:
tests/hard_coded/ho_order_2.exp:
tests/hard_coded/ho_order_2.m:
Rename the ho_order and ho_order2 test cases as ho_order_[12].
tests/hard_coded/lco_pack_args_1.exp:
tests/hard_coded/lco_pack_args_1.m:
Rename the lco_pack_args test case as lco_pack_args_1, due to
the existence of lco_pack_args_[23].
tests/hard_coded/loop_inv_extra_test_1.inp:
tests/hard_coded/loop_inv_extra_test_1.m:
tests/hard_coded/loop_inv_extra_test_2.inp:
tests/hard_coded/loop_inv_extra_test_2.m:
Rename the loop_inv_test0 and loop_inv_test2 test cases as
loop_inv_extra_test_1 and loop_inv_extra_test_2 respectively.
Both these test cases test "extra" functionality that the compiler
does not currently have, and thus neither is currently enabled.
tests/hard_coded/loop_inv_test_2.exp:
tests/hard_coded/loop_inv_test_2.inp:
tests/hard_coded/loop_inv_test_2.m:
Rename the loop_inv_test test case as loop_inv_test_2,
because loop_inv_test_1 was already taken (see below).
tests/hard_coded/loop_inv_test_1.exp:
tests/hard_coded/loop_inv_test_1.inp:
tests/hard_coded/loop_inv_test_1.m:
tests/hard_coded/loop_inv_test_3.exp:
tests/hard_coded/loop_inv_test_3.m:
tests/hard_coded/loop_inv_test_4.exp:
tests/hard_coded/loop_inv_test_4.m:
Rename the loop_inv_test[134] test cases as loop_inv_test_[134].
tests/hard_coded/pprint_test_1.exp:
tests/hard_coded/pprint_test_1.m:
tests/hard_coded/pprint_test_2.exp:
tests/hard_coded/pprint_test_2.m:
Rename the pprint_test and pprint_test2 test cases as pprint_test_[12].
tests/hard_coded/quantifier_1.exp:
tests/hard_coded/quantifier_1.m:
tests/hard_coded/quantifier_2.exp:
tests/hard_coded/quantifier_2.m:
Rename the quantifier and quantifier2 test cases as quantifier_[12].
tests/hard_coded/random_1.exp:
tests/hard_coded/random_1.m:
tests/hard_coded/random_2.exp:
tests/hard_coded/random_2.m:
tests/hard_coded/random_3.exp:
tests/hard_coded/random_3.m:
Rename the random[123] test cases as random_[123].
tests/hard_coded/random_shuffle_1.exp:
tests/hard_coded/random_shuffle_1.m:
tests/hard_coded/random_shuffle_2.exp:
tests/hard_coded/random_shuffle_2.m:
Rename the random_shuffle[12] test cases as random_shuffle_[12].
tests/hard_coded/string_split_1.exp:
tests/hard_coded/string_split_1.m:
Rename the string_split test case as string_split_1, due to
the existence of string_split_2.
tests/hard_coded/string_switch_1.exp:
tests/hard_coded/string_switch_1.m:
tests/hard_coded/string_switch_2.exp:
tests/hard_coded/string_switch_2.m:
tests/hard_coded/string_switch_3.exp:
tests/hard_coded/string_switch_3.m:
tests/hard_coded/string_switch_4.exp:
tests/hard_coded/string_switch_4.m:
Rename the string_switch and string_switch[233] test cases
as string_switch_[1234].
tests/hard_coded/test_cord_1.exp:
tests/hard_coded/test_cord_1.m:
tests/hard_coded/test_cord_2.exp:
tests/hard_coded/test_cord_2.m:
tests/hard_coded/test_cord_3.exp:
tests/hard_coded/test_cord_3.m:
Rename the test_cord and test_cord[23] test cases as test_cord_[123].
tests/hard_coded/trace_goal_opt.m:
tests/hard_coded/trace_goal_opt_helper_1.m:
Rename the trace_goal_opt_2 module as trace_goal_opt_helper_1.
tests/hard_coded/tuple_test_1.exp:
tests/hard_coded/tuple_test_1.m:
tests/hard_coded/tuple_test_2.exp:
tests/hard_coded/tuple_test_2.m:
Rename the tuple_test and tuple_test2 test cases as tuple_test_[12].
tests/hard_coded/version_hash_table_test_1.exp:
tests/hard_coded/version_hash_table_test_1.m:
tests/hard_coded/version_hash_table_test_2.exp:
tests/hard_coded/version_hash_table_test_2.m:
Rename the version_hash_table_test and version_hash_table_test2
test cases as version_hash_table_test_[12].
tests/hard_coded/write_reg_1.exp:
tests/hard_coded/write_reg_1.m:
tests/hard_coded/write_reg_2.exp:
tests/hard_coded/write_reg_2.m:
Rename the write_reg[12] test cases as write_reg_[12].
210 lines
5.5 KiB
Mathematica
210 lines
5.5 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% This is a regression test: the compiler of May 4, 1998 generated
|
|
% incorrect code for the disjunction within the first branch of the
|
|
% switch on StartNode in cycle/2, resulting in an infinite loop.
|
|
%
|
|
% The problem is that in some cases if a variable is cached on entry
|
|
% to a disjunction, it is evaluated in between the mark_hp at the
|
|
% start of the disjunction and the restore_hp at the start of the first
|
|
% disjunct. It should be either be flushed before the mark_hp, or in each
|
|
% branch after the restore_hp.
|
|
|
|
:- module cycles_2.
|
|
|
|
:- interface.
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module bool.
|
|
:- import_module char.
|
|
:- import_module list.
|
|
:- import_module solutions.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
main(!IO) :-
|
|
cycles(a, Cycles),
|
|
write_cycles(Cycles, !IO).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- type node ---> a ; b ; c ; d ; e ; f ; g ; h ; i ; j ; k ; l.
|
|
|
|
:- type status
|
|
---> traverse
|
|
; cycle
|
|
; no_cycle.
|
|
|
|
:- pred cycle(node::in, list(node)::out) is nondet.
|
|
|
|
cycle(StartNode, NodeLs) :-
|
|
( if
|
|
NodeLs0 = [StartNode],
|
|
(
|
|
StartNode = a,
|
|
%**************************************************
|
|
% Incorrect code is generated for this disjunction.
|
|
%**************************************************
|
|
(
|
|
AdjNode = b
|
|
;
|
|
AdjNode = d
|
|
)
|
|
;
|
|
StartNode = b,
|
|
AdjNode = c
|
|
;
|
|
StartNode = c,
|
|
AdjNode = c
|
|
;
|
|
StartNode = d,
|
|
AdjNode = d
|
|
)
|
|
then
|
|
( if not list.member(AdjNode, NodeLs0) then
|
|
Status1 = traverse
|
|
else
|
|
Status1 = cycle
|
|
),
|
|
NodeLs1 = [AdjNode | NodeLs0],
|
|
cycle1(StartNode, AdjNode, NodeLs1, NodeLs, Status1)
|
|
else
|
|
NodeLs2 = [StartNode],
|
|
cycle1(StartNode, StartNode, NodeLs2, NodeLs, no_cycle)
|
|
).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred arrow(node, node).
|
|
:- mode arrow(in, in) is semidet.
|
|
:- mode arrow(in, out) is nondet.
|
|
:- mode arrow(out, out) is multi.
|
|
|
|
:- pragma inline(arrow/2).
|
|
|
|
arrow(a, b).
|
|
arrow(b, c).
|
|
arrow(c, c).
|
|
arrow(a, d).
|
|
arrow(d, a).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred cycles(node::in, list(list(node))::out) is det.
|
|
|
|
cycles(N, Nodes) :-
|
|
solutions((pred(C::out) is nondet :- cycle(N, C)), Nodes).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred cycle1(node, node, list(node), list(node), status).
|
|
:- mode cycle1(in, in, in, out, in) is nondet.
|
|
|
|
cycle1(StartNode, CurrNode, NodeLs0, NodeLs, traverse) :-
|
|
( if arrow(CurrNode, AdjNode) then
|
|
( if not list.member(AdjNode, NodeLs0) then
|
|
Status1 = traverse
|
|
else
|
|
Status1 = cycle
|
|
),
|
|
NodeLs1 = [AdjNode | NodeLs0],
|
|
cycle1(StartNode, AdjNode, NodeLs1, NodeLs, Status1)
|
|
else
|
|
cycle1(StartNode, StartNode, NodeLs0, NodeLs, no_cycle)
|
|
).
|
|
cycle1(StartNode, StartNode, NodeLs, NodeLs, cycle).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred node_to_char(node::in, char::out) is det.
|
|
|
|
node_to_char(a, 'a').
|
|
node_to_char(b, 'b').
|
|
node_to_char(c, 'c').
|
|
node_to_char(d, 'd').
|
|
node_to_char(e, 'e').
|
|
node_to_char(f, 'f').
|
|
node_to_char(g, 'g').
|
|
node_to_char(h, 'h').
|
|
node_to_char(i, 'i').
|
|
node_to_char(j, 'j').
|
|
node_to_char(k, 'k').
|
|
node_to_char(l, 'l').
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred write_cycles(list(list(node))::in, io::di, io::uo) is det.
|
|
|
|
write_cycles(Nodes, !IO) :-
|
|
write_cycles1(Nodes, yes, !IO),
|
|
io.write_string("\n", !IO).
|
|
|
|
:- pred write_cycles1(list(list(node))::in, bool::in, io::di, io::uo) is det.
|
|
|
|
write_cycles1([], yes, !IO) :-
|
|
io.write_string("[]", !IO).
|
|
write_cycles1([], no, !IO) :-
|
|
io.write_string("]", !IO).
|
|
write_cycles1([N | Ns], Start, !IO) :-
|
|
(
|
|
Start = yes,
|
|
io.write_string("[", !IO)
|
|
;
|
|
Start = no
|
|
),
|
|
write_nodes(N, !IO),
|
|
(
|
|
Ns = []
|
|
;
|
|
Ns = [_ | _],
|
|
io.write_string(", ", !IO)
|
|
),
|
|
write_cycles1(Ns, no, !IO).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred write_nodes(list(node)::in, io::di, io::uo) is det.
|
|
|
|
write_nodes(Nodes, !IO) :-
|
|
write_nodes1(Nodes, yes, !IO).
|
|
|
|
:- pred write_nodes1(list(node)::in, bool::in, io::di, io::uo) is det.
|
|
|
|
write_nodes1([], yes, !IO) :-
|
|
io.write_string("[]", !IO).
|
|
write_nodes1([], no, !IO) :-
|
|
io.write_string("]", !IO).
|
|
write_nodes1([N | Ns], Start, !IO) :-
|
|
(
|
|
Start = yes,
|
|
io.write_string("[", !IO)
|
|
;
|
|
Start = no
|
|
),
|
|
write_node(N, !IO),
|
|
(
|
|
Ns = []
|
|
;
|
|
Ns = [_ | _],
|
|
io.write_string(", ", !IO)
|
|
),
|
|
write_nodes1(Ns, no, !IO).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- pred write_node(node::in, io::di, io::uo) is det.
|
|
|
|
write_node(N, !IO) :-
|
|
node_to_char(N, C),
|
|
io.write_char(C, !IO).
|
|
|
|
%---------------------------------------------------------------------------%
|