Files
mercury/tests/hard_coded/cycles_2.m
Zoltan Somogyi 2cec289e70 Use test case numbers according to our conventions ...
... 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].
2024-08-05 15:09:33 +02:00

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).
%---------------------------------------------------------------------------%