Files
mercury/tests/hard_coded/var_not_found.m
2021-06-27 18:03:55 +10:00

65 lines
1.7 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% This is a regression test -- previous versions of the Mercury compiler
% (Oct 98) got a `var not found' error for this test case, due to
% mode analysis producing incorrect instmap delta annotations
% for the complicated unification in the implied mode in the
% first call to map.from_assoc_list in next/3.
%
:- module var_not_found.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module array.
:- import_module bool.
:- import_module float.
:- import_module int.
:- import_module list.
:- import_module map.
:- import_module pair.
:- import_module require.
:- import_module std_util.
:- import_module string.
main(!IO) :-
map.from_assoc_list([int(1) - int(2)], Map),
( if next(Map, Map, Next) then
io.write_line(Next, !IO)
else
io.write_string("failed (as we should)\n", !IO)
).
:- type data
---> int(int)
; flt(float)
; str(string)
; array(map(data, data))
; void.
:- pred next(map(data, data)::in, map(data, data)::in, map(data, data)::out)
is semidet.
next(Thing, Array, Next) :-
map.to_assoc_list(Thing, [int(0) - Key, int(1) - _]),
map.to_assoc_list(Array, List),
next_pair(List, Key, NewKey - NewValue),
map.from_assoc_list([int(0) - NewKey, int(1) - NewValue], Next).
:- pred next_pair(list(pair(data))::in, data::in, pair(data)::out) is semidet.
next_pair([Pair0 | Pairs], Key, Pair) :-
( if Pair0 = Key - _ then
Pairs = [Pair | _]
else
next_pair(Pairs, Key, Pair)
).