mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-20 03:43:51 +00:00
50 lines
1.3 KiB
Mathematica
50 lines
1.3 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% The predicate foo caused the following assertion failure in
|
|
% rotd-2006-08-03:
|
|
%
|
|
% Uncaught Mercury exception:
|
|
% Software Error: equiv_type_hlds.m: Unexpected: replace_in_goal_expr:
|
|
% info not found
|
|
%
|
|
% The problem was that when switch detection copied the bodies of the
|
|
% arms for Kind = b and Kind = c, it requantified the goals. The
|
|
% requantification introduced some new variables but the entries in the
|
|
% RTTI varmaps were not updated at the same time. The fix was to make
|
|
% sure that when quantification might introduce new variables, the RTTI
|
|
% varmaps are updated.
|
|
%
|
|
% The test case was supplied by Peter Hawkins.
|
|
|
|
:- module hawkins_switch_bug.
|
|
:- interface.
|
|
|
|
:- import_module int.
|
|
:- import_module map.
|
|
:- import_module set.
|
|
|
|
:- type kind
|
|
---> a
|
|
; b
|
|
; c.
|
|
|
|
:- pred foo(kind::in, map(int, set(int))::in) is det.
|
|
|
|
:- implementation.
|
|
|
|
foo(Kind, B) :-
|
|
(
|
|
Kind = a
|
|
;
|
|
( Kind = b
|
|
; Kind = c
|
|
),
|
|
( if map.search(B, 0, PDeps0) then
|
|
_PDeps = PDeps0
|
|
else
|
|
_PDeps = set.init : set(int)
|
|
)
|
|
).
|