mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-16 06:14:59 +00:00
Estimated hours taken: 1.5 Fix a bug reported by Dominique de Waleffe <ddw@miscrit.be>. compiler/typecheck.m: Fix a bug: it was not applying the type bindings to the constraint proof map. This caused a map__lookup error in polymorphism.m when it tried to look up the constraints in the constraint proof map. tests/valid/Mmakefile: tests/valid/constraint_proof_bug.m: tests/valid/constraint_proof_bug_lib.m: Add a regression test for the above-mentioned bug.
58 lines
1.3 KiB
Mathematica
58 lines
1.3 KiB
Mathematica
:-module constraint_proof_bug_lib.
|
|
|
|
:-interface.
|
|
:-type date.
|
|
:-type code.
|
|
:-type field(T1,T2)---> d(T1);c(T2).
|
|
:-type dep_op==string.
|
|
|
|
:-typeclass constrainable(T)
|
|
where [
|
|
pred apply_op(T::in,dep_op::in,T::in) is semidet
|
|
].
|
|
:-instance constrainable(date).
|
|
:-instance constrainable(code).
|
|
:-instance constrainable(field(T,T2)).
|
|
|
|
:-pred get_date_date(int::out,int::out,int::out,date::in) is det.
|
|
|
|
:- implementation.
|
|
|
|
:-type code==int.
|
|
:-type date--->d(int).
|
|
|
|
get_date_date(Y,M,D,_Date):-Y=1999,M=6,D=25 .
|
|
|
|
:-instance constrainable(date)
|
|
where [
|
|
pred(apply_op/3) is apply_op_dates
|
|
].
|
|
|
|
:-pred apply_op_dates(date::in,dep_op::in,date::in) is semidet.
|
|
apply_op_dates(D1,"=",D2):-
|
|
get_date_date(Y1,M1,Day1,D1),
|
|
get_date_date(Y1,M1,Day1,D2).
|
|
|
|
:-instance constrainable(code)
|
|
where [
|
|
pred(apply_op/3) is apply_op_codes
|
|
].
|
|
|
|
:-pred apply_op_codes(code::in,dep_op::in,code::in) is semidet.
|
|
apply_op_codes(D1,"=",D2):-compare((=),D1,D2).
|
|
|
|
|
|
:-instance constrainable(field(T,T2)) <= (constrainable(T),constrainable(T2))
|
|
where [
|
|
pred(apply_op/3) is apply_op_fields
|
|
].
|
|
|
|
:-pred apply_op_fields(field(T,T2),dep_op,field(T,T2)) <= (constrainable(T),
|
|
constrainable(T2)).
|
|
:-mode apply_op_fields(in,in,in) is semidet.
|
|
|
|
apply_op_fields(d(D1),Op,d(D2)):-apply_op(D1,Op,D2).
|
|
apply_op_fields(c(D1),Op,c(D2)):-apply_op(D1,Op,D2).
|
|
|
|
|