Files
mercury/tests/valid/agc_ho_pred.m
Julien Fischer f3a34e4651 Replace uses of __ as a module qualifier.
samples/muz.zbstract.m:
tests/*/*.m:
    As above.
2022-04-14 20:25:10 +10:00

105 lines
3.3 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% Regression test.
% This code was taken from library/getopt.m, and simplified.
%
% Name: agc_ho_pred.m
%
% Description of bug:
% The liveness of a typeinfo variable was being computed
% incorrectly.
% This was caused because the variable TypeInfo_for_OptionType was
% incorrectly added to the initial_liveness. It was assumed that
% all type variables for the types of the input arguments would
% have corresponding typeinfos as input. This is incorrect, higher
% order preds do not have typeinfo variables as input.
%
% Symptom(s) of bug:
% % Generating code for predicate
% `agc_ho_pred:agc_ho_pred__LambdaGoal__1/2'
% Software error: variable TypeInfo_for_OptionType (16) not found
:- module agc_ho_pred.
:- interface.
:- import_module bool.
:- import_module char.
:- import_module list.
:- import_module map.
:- import_module maybe.
:- import_module pair.
:- import_module solutions.
:- type option_ops(OptionType)
---> option_ops(
pred(char, OptionType), % short_option
pred(string, OptionType), % long_option
pred(OptionType, option_data) % option_default
)
; option_ops(
pred(char, OptionType), % short_option
pred(string, OptionType), % long_option
pred(OptionType, option_data), % option_default
pred(OptionType, special_data, % special option handler
option_table(OptionType),
maybe_option_table(OptionType))
).
:- inst option_ops ==
bound((
option_ops(
pred(in, out) is semidet, % short_option
pred(in, out) is semidet, % long_option
pred(out, out) is nondet % option_default
)
; option_ops(
pred(in, out) is semidet, % short_option
pred(in, out) is semidet, % long_option
pred(out, out) is nondet, % option_default
pred(in, in, in, out) is semidet% special handler
)
)).
:- type option_data
---> bool(bool)
; int(int)
; string(string)
; maybe_string(maybe(string))
; accumulating(list(string))
; special
; bool_special
; int_special
; string_special.
:- type special_data
---> none
; bool(bool)
; int(int)
; string(string).
:- type option_table(OptionType) == map(OptionType, option_data).
:- type maybe_option_table(OptionType)
---> ok(option_table(OptionType))
; error(string).
:- pred agc_ho_pred.process_options(option_ops(OptionType)::in(option_ops),
list(pair(OptionType, option_data))::out) is det.
:- implementation.
agc_ho_pred.process_options(OptionOps, Args) :-
(
OptionOps = option_ops(_, _, OptionDefaultsPred)
;
OptionOps = option_ops(_, _, OptionDefaultsPred, _)
),
solutions(
( pred(OptionDataPair::out) is nondet :-
OptionDataPair = Option - OptionData,
call(OptionDefaultsPred, Option, OptionData)
), OptionDefaultsList),
Args = OptionDefaultsList.