Files
mercury/tests/valid_seq/merge_inst_bug.m
Zoltan Somogyi 7f64f6eae3 Rename X's aux modules as X_helper_N in valid_seq.
Do this after renaming the main modules of tests that either

- had names that did not even attempt to describe what problem
  they were intended to test for, or
- had names that include either a "test_" prefix or a "_main" suffix.

This ended up renaming most of the modules in this directory. The reason
for this is that many tests' names had an "intermod_" or "nested_" prefix.
This was useful in the valid directory, where these tests originally were,
but it is not useful here, since these tests are in the valid_seq directory
to be executed sequentially *precisely because* they involve multiple modules.

The set of renames of main modules are is:

    func_int_bug_main               ->  func_int_bug
    intermod_bug_nested             ->  spurious_match
    intermod_char                   ->  char_escape_opt
    intermod_dcg_bug                ->  dcg_bug
    intermod_impure                 ->  call_impure_in_opt
    intermod_lambda                 ->  exported_lambda
    intermod_nested                 ->  to_submods_opt
    intermod_nested_module          ->  read_submod_opt
    intermod_nested_module_bug      ->  mode_from_int0_opt
    intermod_nested_uniq            ->  head_var_unify_uniq
    intermod_quote                  ->  opt_file_quote
    intermod_record                 ->  field_access_funcs
    intermod_test                   ->  overload_resolution
    intermod_type_spec              ->  type_spec_vars
    intermod_typeclass_exist        ->  typeclass_exist_opt
    intermod_typeclass              ->  typeclass_in_opt
    intermod_pragma_import          ->  foreign_proc_import
    intermod_ua_type_spec           ->  unused_args_type_spec
    intermod_user_equality_nested   ->  user_eq_pred_nested
    intermod_user_equality          ->  user_eq_pred_nonnested
    intermod_user_sharing           ->  sharing_in_opt
    module_a                        ->  indirect_import_two_paths
    module_b                        ->  indirect_import_one_path
    module_c                        ->  DELETED
    module_d                        ->  DELETED
    module_e                        ->  DELETED
    nested_module_bug               ->  nested_module_ambiguity
    nested_mod_type_bug             ->  type_exported_to_submods
    parsing_bug_main                ->  parsing_bug
    test_xmlreader                  ->  xmlreader

Each of the new main modules includes a note about its previous name.

The old files module_[bcd].m were each used by two or more tests,
definitely including module_a and module_b, and including
module_c and module_d for some of them. The module_c and module_d tests
did not test anything that module_b did not test, and the module_e test
did not test anything useful at all, which is why this diff deletes them.
The diff also ensures that the module_a and module_b tests, under their
new names, now used disjoint sets of helper modules.

Add a note to module_a, under its new name, indirect_import_two_paths,
that despite an original log message saying that it tests importing
the same module via both direct and indirect paths, there is no actual
indirect import of the module in question.
2023-09-10 15:54:13 +10:00

71 lines
2.5 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
%
% This is a regression test for a bug reported by Volker Wysk
% in an email to m-rev on 2023 aug 4.
%
% The bug was in equiv_type_hlds.m. It was using the code below to compute
% the final merge_inst_info after expanding out equivalence types in the
% two insts within the initial version of that merge_inst_info:
%
% ( if ChangedA = unchanged, ChangedB = unchanged then
% Changed = unchanged,
% MergeInstInfo = merge_inst_info(InstA, InstB)
% else
% Changed = changed,
% MergeInstInfo = MergeInstInfo0
% ).
%
% The bug is that the changed and the unchanged cases each have the code
% meant for the other. The unchanged case having the code meant for the
% changed case leads to a tiny slowdown. The changed case having the code
% meant for the unchanged case means that the replacement of any equivalence
% types within this merge_inst_info, which occurs as a key in the
% merge_inst_table, does not get done. Since this replacement *does*
% get done to merge_insts that occur both in values in inst tables and in
% the instmap_deltas attached to goals, the latter become dangling references.
% Any later attempt to look up these dangling reference merge_insts in the
% merge inst table will then cause a compiler abort.
%
%---------------------------------------------------------------------------%
:- module merge_inst_bug.
:- interface.
:- import_module merge_inst_bug_helper_1.
:- import_module bool.
:- import_module io.
:- import_module list.
:- type amend_type == pred(pred(io, io), bool,
merge_inst_bug_helper_1.state, merge_inst_bug_helper_1.state).
:- inst amend_inst == (pred(out(pred(di, uo) is det), out, di, uo) is det).
:- pred amend_pred(
list(amend_type)::in(list(amend_inst)),
list(amend_type)::in(list(amend_inst)),
pred(io, io)::out(pred(di, uo) is det),
merge_inst_bug_helper_1.state::di,
merge_inst_bug_helper_1.state::uo
) is det.
%---------------------------------------------------------------------------%
:- implementation.
:- import_module int.
:- import_module uint64.
amend_pred(_, [], (pred(IO::di, IO::uo) is det :- true), !DB).
amend_pred(All, [Amend | Amends], AmendIO, !DB) :-
Amend(AmendIO0, Done, !DB),
(
Done = yes,
AmendIO = AmendIO0
;
Done = no,
amend_pred(All, Amends, AmendIO, !DB)
).