mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-19 03:13:40 +00:00
105 lines
3.3 KiB
Mathematica
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.
|