[m-dev.] diff: fix typeclass bug
Fergus Henderson
fjh at cs.mu.OZ.AU
Fri Jul 23 03:13:38 AEST 1999
Estimated hours taken: 1.5
Fix a bug reported by Dominique de Waleffe <ddw at 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.
cvs diff -N compiler/typecheck.m tests/valid/Mmakefile tests/valid/constraint_proof_bug.m tests/valid/constraint_proof_bug_lib.m
Index: compiler/typecheck.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/typecheck.m,v
retrieving revision 1.264
diff -u -r1.264 typecheck.m
--- typecheck.m 1999/07/13 08:53:36 1.264
+++ typecheck.m 1999/07/22 15:47:02
@@ -3068,10 +3068,12 @@
type_assign_get_typeclass_constraints(TypeAssign,
TypeConstraints),
type_assign_get_constraint_proofs(TypeAssign,
- ConstraintProofs),
+ ConstraintProofs0),
map__keys(VarTypes0, Vars),
expand_types(Vars, TypeBindings, VarTypes0, VarTypes),
+ apply_rec_subst_to_constraint_proofs(TypeBindings,
+ ConstraintProofs0, ConstraintProofs),
%
% figure out how we should rename the existential types
Index: tests/valid/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/tests/valid/Mmakefile,v
retrieving revision 1.37
diff -u -r1.37 Mmakefile
--- Mmakefile 1999/07/14 17:04:31 1.37
+++ Mmakefile 1999/07/22 16:43:26
@@ -20,6 +20,7 @@
semi_fail_in_non_ite.m
TYPECLASS_SOURCES= \
+ constraint_proof_bug.m \
func_method.m \
instance_superclass.m \
instance_unconstrained_tvar.m
Index: tests/valid/constraint_proof_bug.m
===================================================================
RCS file: constraint_proof_bug.m
diff -N constraint_proof_bug.m
--- /dev/null Fri Jul 23 03:05:01 1999
+++ constraint_proof_bug.m Fri Jul 23 02:39:42 1999
@@ -0,0 +1,46 @@
+:- module constraint_proof_bug.
+
+:-interface.
+
+:-import_module io.
+
+:-pred main(io:state::di,io:state::uo) is det.
+
+:- implementation.
+:-import_module constraint_proof_bug_lib,io,string,require.
+
+:-type service==string.
+:-type prestationid==int.
+:-type provider==int.
+
+:-type bevent--->
+ prest(prestationid,date,code,provider)
+ ; day(int,date)
+ ; admit(date,service)
+ ; discharge(date,service)
+ ; transfer(date,service,service)
+ ; wrong(date).
+
+:-some [T] pred get_field(bevent,string,T) => constrainable(T).
+:-mode get_field(in,in,out) is semidet.
+
+get_field(Ev,Field,R) :-
+ Field="date" -> R=d(Dt),get_date_field(Ev,Dt)
+ ;
+ Field="code" -> R=c(Cd),get_code_field(Ev,Cd)
+ ;
+ error("No handler for this field").
+
+:-pred get_date_field(bevent::in,date::out) is det.
+get_date_field(prest(_,Dt,_,_),Dt).
+get_date_field(day(_,Dt),Dt).
+get_date_field(admit(Dt,_),Dt).
+get_date_field(discharge(Dt,_),Dt).
+get_date_field(transfer(Dt,_,_),Dt).
+get_date_field(wrong(Dt),Dt).
+
+:-pred get_code_field(bevent::in,code::out) is semidet.
+get_code_field(prest(_,_,Cd,_),Cd).
+
+main-->
+ print("hello world\n").
Index: tests/valid/constraint_proof_bug_lib.m
===================================================================
RCS file: constraint_proof_bug_lib.m
diff -N constraint_proof_bug_lib.m
--- /dev/null Fri Jul 23 03:05:01 1999
+++ constraint_proof_bug_lib.m Fri Jul 23 02:35:47 1999
@@ -0,0 +1,57 @@
+:-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).
+
+
--
Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh> | of excellence is a lethal habit"
PGP: finger fjh at 128.250.37.3 | -- the last words of T. S. Garp.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list