Files
mercury/tests/valid/constraint_proof_bug_lib.m
Peter Ross e8e1690475 The following code causes code to be generated which seg-faults
Estimated hours taken: 2
Branches: main

The following code causes code to be generated which seg-faults

 :- interface
 :- instance tc(list(T)).
 :- implementation.
 :- instance tc(list(T)) <= tc(T) where [...].

because the exported instance declaration doesn't contain the
typeclass constraint.

mercury/compiler/add_class.m:
       Check that for all the "same" instance declarations
       the instance constraints are exactly the same on each
       declaration.

tests/invalid/incompatible_instance_constraints*:
	Add tests for this code.

tests/invalid/*:
	Fix some headvar name errors.

tests/valid/*:
	Fix some invalid abstract instance declarations.
2007-05-21 04:23:26 +00:00

58 lines
1.4 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)) <= (constrainable(T),constrainable(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).