[m-rev.] for review: do not allow non-abstract instance decls in interfaces

Julien Fischer juliensf at cs.mu.OZ.AU
Tue Apr 12 15:10:56 AEST 2005


On Mon, 11 Apr 2005, Julien Fischer wrote:

>
> On Mon, 11 Apr 2005, Ian MacLarty wrote:
>
> > On 11 Apr 2005, at 13:51, Julien Fischer wrote:
> >
> > >
> > > For review by anyone.
> > >
> > > Estimated hours taken: 2
> > > Branches: main, release
> > >
> > > Fix a long standing problem where the compiler would accept
> > > non-abstract instance declarations in module interfaces, despite
> > > the reference manual disallowing these.
> > >
> > > compiler/modules.m:
> > > 	Emit an error message when a non-abstract instance
> > > 	declaration occurs in a module interface.
> > >
> > > tests/invalid/Mmakefile:
> > > tests/invalid/instance_bug.m:
> > > tests/invalid/instance_bug.err_exp:
> > > 	Test case for the above.
> > >
> > > Julien.
> > >
> >
> > This all looks fine to me.
> >
>
> By itself yes; unfortunately there were about 37 test cases that had
> non-abstract instances in their interfaces and parts of the reference
> manual are a bit misleading as well.  I'll post a revised diff of this
> either tonight or tomorrow.
>
Here is a revised diff that fixes the test cases as well as the formatting
of a lot of the error messages regarding typeclasses and instances.

For review by anyone.

Estimated hours taken: 10
Branches: main, release

Do not allow non-abstract instance declarations to occur in module
interfaces.  Emit an error message if this occurs.

Fix the formatting of some error messages regarding typeclasses
and instances.

compiler/check_typeclass.m:
	Use error_util to generate the error messages from this module.
	This fixes a problem where the printing of sym_names and arities
	differed in the same error message.

compiler/error_util.m:
	Add a format component for the pred_or_func type.
	Add the equivalence type format_components.

compiler/make_hlds.m:
	Make the format of some error messages concerning typeclasses
	more consistent.

compiler/modules.m:
	Check for non-abstract instance declarations in module interfaces
	and emit an error message if they do.

tests/invalid/Mmakefile:
tests/invalid/instance_bug.m:
tests/invalid/instance_bug.err_exp:
 	Test case for the above.

tests/hard_coded/typeclasses/*:
tests/invalid/*:
tests/recompilation/*:
tests/valid/*:
	Update test cases as necessary.

Workspace:/home/swordfish/juliensf/ws75
Index: compiler/check_typeclass.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/check_typeclass.m,v
retrieving revision 1.66
diff -u -r1.66 check_typeclass.m
--- compiler/check_typeclass.m	2 Apr 2005 17:10:00 -0000	1.66
+++ compiler/check_typeclass.m	11 Apr 2005 23:35:55 -0000
@@ -59,6 +59,9 @@
 :- pred check_typeclass__check_typeclasses(qual_info::in, qual_info::out,
 	module_info::in, module_info::out, bool::out, io::di, io::uo) is det.

+%---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
 :- implementation.

 :- import_module check_hlds__inst_match.
@@ -92,6 +95,8 @@
 :- import_module term.
 :- import_module varset.

+%---------------------------------------------------------------------------%
+
 check_typeclass__check_typeclasses(!QualInfo, !ModuleInfo, FoundError, !IO) :-
 	check_typeclass__check_instance_decls(!QualInfo, !ModuleInfo,
 		FoundInstanceError, !IO),
@@ -159,13 +164,10 @@
 		Interface = abstract
 	->
 		ClassId = class_id(ClassName, ClassArity),
-		sym_name_and_arity_to_string(ClassName / ClassArity,
-			ClassNameStr),
 		ErrorPieces = [
 			words("Error: no definition for typeclass"),
-			words(string__append_list(["`", ClassNameStr, "'."]))
+			sym_name_and_arity(ClassName / ClassArity)
 		],
-
 		Messages0 = !.CheckTCInfo ^ error_messages,
 		!:CheckTCInfo = !.CheckTCInfo ^ error_messages :=
 			[TermContext - ErrorPieces | Messages0],
@@ -237,12 +239,11 @@
 	(
 		ClassInterface = abstract,
 		ClassId = class_id(ClassName, ClassArity),
-		sym_name_and_arity_to_string(ClassName / ClassArity,
-			ClassNameStr),
 		ErrorPieces = [
 			words("Error: instance declaration for"),
 			words("abstract typeclass"),
-			words(string__append_list(["`", ClassNameStr, "'."]))
+			sym_name_and_arity(ClassName / ClassArity),
+			suffix(".")
 		],
 		!:Errors = [TermContext - ErrorPieces | !.Errors]
 	;
@@ -333,29 +334,29 @@
 		% Construct an appropriate error message.
 		%
 		ClassId = class_id(ClassName, ClassArity),
-		mdbcomp__prim_data__sym_name_to_string(ClassName,
-			ClassNameString),
-		string__int_to_string(ClassArity, ClassArityString),
-		string__append_list([
-			"In instance declaration for `",
-			ClassNameString, "/", ClassArityString, "': ",
-			"incorrect method name(s): "],
-			ErrorMsgStart),
-		BogusInstanceMethodNames = list__map(format_method_name,
+		ErrorMsgStart =  [
+			words("In instance declaration for"),
+			sym_name_and_arity(ClassName / ClassArity),
+			suffix(":"),
+			words("incorrect method name(s):")
+		],
+		ErrorMsgBody0 = list.map(format_method_name,
 			BogusInstanceMethods),
-		ErrorMsgBody0 = list_to_pieces(BogusInstanceMethodNames),
-		ErrorMsgBody = list__append(ErrorMsgBody0, [words(".")]),
-		NewError = Context - [words(ErrorMsgStart) | ErrorMsgBody],
+		ErrorMsgBody1 = list.condense(ErrorMsgBody0),
+		ErrorMsgBody = list__append(ErrorMsgBody1, [suffix(".")]),
+		NewError = Context - ( ErrorMsgStart ++ ErrorMsgBody ),
 		!:Errors = [NewError | !.Errors]
 	).

-:- func format_method_name(instance_method) = string.
+:- func format_method_name(instance_method) = format_components.

-format_method_name(Method) = StringName :-
+format_method_name(Method) = MethodName :-
 	Method = instance_method(PredOrFunc, Name, _Defn, Arity, _Context),
 	adjust_func_arity(PredOrFunc, Arity, PredArity),
-	StringName = hlds_out__simple_call_id_to_string(
-		PredOrFunc - Name/PredArity).
+	MethodName = [
+		pred_or_func(PredOrFunc),
+		sym_name_and_arity(Name / PredArity)
+	].

 %----------------------------------------------------------------------------%

@@ -540,7 +541,7 @@
 			MethodNameString),
 		mdbcomp__prim_data__sym_name_to_string(ClassName,
 			ClassNameString),
-		pred_or_func_to_string(PredOrFunc, PredOrFuncString),
+		PredOrFuncString = pred_or_func_to_string(PredOrFunc),
 		string__int_to_string(Arity, ArityString),
 		InstanceTypesString = mercury_type_list_to_string(
 			InstanceVarSet, InstanceTypes),
@@ -575,22 +576,23 @@
 		OrderedInstanceMethods = OrderedInstanceMethods0,
 		InstanceDefn = InstanceDefn0,
 		ClassId = class_id(ClassName, _ClassArity),
-		mdbcomp__prim_data__sym_name_to_string(MethodName,
-			MethodNameString),
 		mdbcomp__prim_data__sym_name_to_string(ClassName,
 			ClassNameString),
-		pred_or_func_to_string(PredOrFunc, PredOrFuncString),
-		string__int_to_string(Arity, ArityString),
 		InstanceTypesString = mercury_type_list_to_string(
 			InstanceVarSet, InstanceTypes),
-		string__append_list([
-			"In instance declaration for `",
-			ClassNameString, "(", InstanceTypesString, ")': ",
-			"no implementation for type class ",
-			PredOrFuncString, " method `",
-			MethodNameString, "/", ArityString, "'."],
-			NewError),
-		Errors = [InstanceContext - [words(NewError)] | Errors0],
+
+		Error = [words("In instance declaration for"),
+			fixed("`" ++ ClassNameString
+				++ "(" ++ InstanceTypesString
+				++ ")'"),
+			suffix(":"),
+			words("no implementation for type class"),
+			pred_or_func(PredOrFunc),
+			words("method"),
+			sym_name_and_arity(MethodName / Arity),
+			suffix(".")
+		],
+		Errors = [InstanceContext - Error | Errors0],
 		Info = instance_method_info(ModuleInfo, QualInfo, PredName,
 			Arity, ExistQVars, ArgTypes, ClassContext,
 			ArgModes, Errors,
@@ -651,11 +653,6 @@
 		ResultList = MatchingMethods
 	).

-:- pred pred_or_func_to_string(pred_or_func::in, string::out) is det.
-
-pred_or_func_to_string(predicate, "predicate").
-pred_or_func_to_string(function, "function").
-
 :- pred produce_auxiliary_procs(class_id::in, list(tvar)::in, pred_markers::in,
 	list(type)::in, list(prog_constraint)::in, tvarset::in,
 	module_name::in, instance_proc_def::in, prog_context::in,
@@ -1025,3 +1022,6 @@
 add_path_element(class_id(Name, Arity), RevPieces0) =
 	[sym_name_and_arity(Name/Arity), words("<=") | RevPieces0].

+%---------------------------------------------------------------------------%
+:- end_module check_typeclass.
+%---------------------------------------------------------------------------%
Index: compiler/error_util.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/error_util.m,v
retrieving revision 1.35
diff -u -r1.35 error_util.m
--- compiler/error_util.m	7 Apr 2005 06:32:07 -0000	1.35
+++ compiler/error_util.m	11 Apr 2005 08:06:41 -0000
@@ -67,9 +67,15 @@
 				% The output should contain the string form of
 				% the sym_name, followed by '/' and the arity,
 				% all surrounded by `' quotes.
-
-	;	nl.		% Insert a line break if there has been text
+
+	;	nl		% Insert a line break if there has been text
 				% output since the last line break.
+
+	;	pred_or_func(pred_or_func).
+				% Output the string "predicate" or "function"
+				% as appropriate.
+
+:- type format_components == list(format_component).

 	% Convert a list of strings into a list of format_components
 	% separated by commas, with the last two elements separated by `and'.
@@ -128,6 +134,7 @@

 	% Append a punctuation character to a message, avoiding unwanted
 	% line splitting between the message and the punctuation.
+	%
 :- func append_punctuation(list(format_component), char) =
 	list(format_component).

@@ -375,6 +382,9 @@
 			Str = Word ++ " " ++ TailStr
 		)
 	;
+		Component = pred_or_func(PredOrFunc),
+		Str = pred_or_func_to_string(PredOrFunc)
+	;
 		Component = nl,
 		Str = "\n" ++ TailStr
 	).
@@ -389,39 +399,37 @@
 	list(word)::in, list(list(string))::in, list(list(string))::out)
 	is det.

-convert_components_to_word_list([], RevWords0, Paras0, Paras) :-
+convert_components_to_word_list([], RevWords0, !Paras) :-
 	Strings = rev_words_to_strings(RevWords0),
-	list__reverse([Strings | Paras0], Paras).
-convert_components_to_word_list([Component | Components], RevWords0,
-		Paras0, Paras) :-
+	list__reverse([Strings | !.Paras], !:Paras).
+convert_components_to_word_list([Component | Components], RevWords0, !Paras) :-
 	(
 		Component = fixed(Word),
-		RevWords1 = [word(Word) | RevWords0],
-		Paras1 = Paras0
+		RevWords1 = [word(Word) | RevWords0]
 	;
 		Component = suffix(Word),
-		RevWords1 = [suffix_word(Word) | RevWords0],
-		Paras1 = Paras0
+		RevWords1 = [suffix_word(Word) | RevWords0]
 	;
 		Component = words(WordsStr),
-		break_into_words(WordsStr, RevWords0, RevWords1),
-		Paras1 = Paras0
+		break_into_words(WordsStr, RevWords0, RevWords1)
 	;
 		Component = sym_name(SymName),
-		RevWords1 = [word(sym_name_to_word(SymName)) | RevWords0],
-		Paras1 = Paras0
+		RevWords1 = [word(sym_name_to_word(SymName)) | RevWords0]
 	;
 		Component = sym_name_and_arity(SymNameAndArity),
 		Word = sym_name_and_arity_to_word(SymNameAndArity),
-		RevWords1 = [word(Word) | RevWords0],
-		Paras1 = Paras0
+		RevWords1 = [word(Word) | RevWords0]
+	;
+		Component = pred_or_func(PredOrFunc),
+		Word = pred_or_func_to_string(PredOrFunc),
+		RevWords1 = [word(Word) | RevWords0]
 	;
 		Component = nl,
 		Strings = rev_words_to_strings(RevWords0),
-		Paras1 = [Strings | Paras0],
+		list.cons(Strings, !Paras),
 		RevWords1 = []
 	),
-	convert_components_to_word_list(Components, RevWords1, Paras1, Paras).
+	convert_components_to_word_list(Components, RevWords1, !Paras).

 :- func rev_words_to_strings(list(word)) = list(string).

@@ -617,6 +625,10 @@
 	;
 		Piece0 = sym_name_and_arity(SymNameAndArity),
 		String = sym_name_and_arity_to_word(SymNameAndArity),
+		Piece = fixed(string__append(String, char_to_string(Punc)))
+	;
+		Piece0 = pred_or_func(PredOrFunc),
+		String = pred_or_func_to_string(PredOrFunc),
 		Piece = fixed(string__append(String, char_to_string(Punc)))
 	;
 		Piece0 = nl,
Index: compiler/make_hlds.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/make_hlds.m,v
retrieving revision 1.509
diff -u -r1.509 make_hlds.m
--- compiler/make_hlds.m	7 Apr 2005 06:32:09 -0000	1.509
+++ compiler/make_hlds.m	11 Apr 2005 07:56:52 -0000
@@ -9208,7 +9208,8 @@
 unspecified_det_for_method(Name, Arity, PredOrFunc, Context, !IO) :-
     Pieces = [words("Error: no determinism declaration"),
         words("for type class method"),
-        words(simple_call_id_to_string(PredOrFunc, Name, Arity)),
+        pred_or_func(PredOrFunc),
+        sym_name_and_arity(Name / Arity),
         suffix(".")],
     write_error_pieces(Context, 0, Pieces, !IO),
     io__set_exit_status(1, !IO).
@@ -9218,7 +9219,8 @@

 unspecified_det_for_exported(Name, Arity, PredOrFunc, Context, !IO) :-
     Pieces = [words("Error: no determinism declaration for exported"),
-        words(simple_call_id_to_string(PredOrFunc, Name, Arity)),
+        pred_or_func(PredOrFunc),
+        sym_name_and_arity(Name / Arity),
         suffix(".")],
     write_error_pieces(Context, 0, Pieces, !IO),
     io__set_exit_status(1, !IO).
@@ -9228,7 +9230,8 @@

 clause_for_imported_pred_error(Name, Arity, PredOrFunc, Context, !IO) :-
     Pieces = [words("Error: clause for imported"),
-        words(simple_call_id_to_string(PredOrFunc, Name, Arity)),
+        pred_or_func(PredOrFunc),
+        sym_name_and_arity(Name / Arity),
         suffix(".")],
     write_error_pieces(Context, 0, Pieces, !IO),
     io__set_exit_status(1, !IO).
Index: compiler/modules.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/modules.m,v
retrieving revision 1.325
diff -u -r1.325 modules.m
--- compiler/modules.m	11 Apr 2005 02:50:58 -0000	1.325
+++ compiler/modules.m	11 Apr 2005 03:41:26 -0000
@@ -463,7 +463,9 @@
     % - report an error if the `implementation' section of a sub-module
     %   is contained inside the `interface' section of its parent module
     % - check for modules declared as both nested and separate sub-modules.
-
+    % - check for non-abstract typeclass instance declarations in module
+    %   interfaces.
+    %
 :- type module_list == list(pair(module_name, item_list)).

 :- pred split_into_submodules(module_name::in, item_list::in, module_list::out,
@@ -6797,6 +6799,7 @@
     InParentInterface = no,
     split_into_submodules_2(ModuleName, Items0, InParentInterface,
         Items, ModuleList, !IO),
+
     %
     % Check that there are no items after the end_module declaration.
     %
@@ -6896,11 +6899,11 @@
         %
         ( Item = module_defn(_, interface) - _Context ->
             InInterface1 = yes
-        ; Item = module_defn(_, implementation) - Context ->
+        ; Item = module_defn(_, implementation) - ImplContext ->
             (
                 InParentInterface = yes,
-                report_error_implementation_in_interface(ModuleName, Context,
-                    !IO)
+                report_error_implementation_in_interface(ModuleName,
+                    ImplContext, !IO)
             ;
                 InParentInterface = no
             ),
@@ -6909,6 +6912,20 @@
             InInterface1 = InInterface0
         ),
         %
+        % Check to make sure that a non-abstract instance declaration
+        % does not occur in a module interface.
+        %
+        (
+            InInterface1 = yes,
+            Item = instance(_, _, _, Body, _, _) - InstanceContext,
+            Body \= abstract
+        ->
+            report_non_abstract_instance_in_interface(InstanceContext, !IO)
+        ;
+            true
+        ),
+
+        %
         % parse the remaining items for this module,
         %
         split_into_submodules_3(ModuleName, Items1,
@@ -7019,6 +7036,15 @@

 report_items_after_end_module(Context, !IO) :-
     ErrorPieces = [words("Error: item(s) after end_module declaration.")],
+    write_error_pieces(Context, 0, ErrorPieces, !IO),
+    io.set_exit_status(1, !IO).
+
+:- pred report_non_abstract_instance_in_interface(prog_context::in,
+    io::di, io::uo) is det.
+
+report_non_abstract_instance_in_interface(Context, !IO) :-
+    ErrorPieces = [words("Error: non-abstract instance declaration"),
+        words("in module interface.")],
     write_error_pieces(Context, 0, ErrorPieces, !IO),
     io.set_exit_status(1, !IO).

Index: tests/hard_coded/typeclasses/arbitrary_constraint_class.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/arbitrary_constraint_class.m,v
retrieving revision 1.1
diff -u -r1.1 arbitrary_constraint_class.m
--- tests/hard_coded/typeclasses/arbitrary_constraint_class.m	26 Jul 2002 06:33:18 -0000	1.1
+++ tests/hard_coded/typeclasses/arbitrary_constraint_class.m	11 Apr 2005 05:28:05 -0000
@@ -9,12 +9,6 @@

 :- typeclass solver_for_float(U) <= solver_for(float, U) where [].

-:- instance solver_for(float, string) where [
-	coerce(Float) = string__float_to_string(Float)
-].
-
-:- instance solver_for_float(string) where [].
-
 :- pred mg(T, T) <= solver_for_float(T).
 :- mode mg(in, out) is det.

@@ -22,6 +16,12 @@

 :- implementation.
 :- import_module std_util.
+
+:- instance solver_for(float, string) where [
+	coerce(Float) = string__float_to_string(Float)
+].
+
+:- instance solver_for_float(string) where [].

 mg(S0, S) :-
 	( semidet_succeed ->
Index: tests/hard_coded/typeclasses/arbitrary_constraint_pred_1.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/arbitrary_constraint_pred_1.m,v
retrieving revision 1.1
diff -u -r1.1 arbitrary_constraint_pred_1.m
--- tests/hard_coded/typeclasses/arbitrary_constraint_pred_1.m	26 Jul 2002 06:33:18 -0000	1.1
+++ tests/hard_coded/typeclasses/arbitrary_constraint_pred_1.m	11 Apr 2005 05:29:23 -0000
@@ -7,10 +7,6 @@
 	func coerce(B) = S
 ].

-:- instance solver_for(float, string) where [
-	coerce(Float) = string__float_to_string(Float)
-].
-
 :- pred mg(T, T) <= solver_for(float, T).
 :- mode mg(in, out) is det.

@@ -18,6 +14,10 @@

 :- implementation.
 :- import_module std_util.
+
+:- instance solver_for(float, string) where [
+	coerce(Float) = string__float_to_string(Float)
+].

 mg(S0, S) :-
 	( semidet_succeed ->
Index: tests/hard_coded/typeclasses/arbitrary_constraint_pred_2.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/arbitrary_constraint_pred_2.m,v
retrieving revision 1.1
diff -u -r1.1 arbitrary_constraint_pred_2.m
--- tests/hard_coded/typeclasses/arbitrary_constraint_pred_2.m	26 Jul 2002 06:33:19 -0000	1.1
+++ tests/hard_coded/typeclasses/arbitrary_constraint_pred_2.m	11 Apr 2005 05:29:42 -0000
@@ -8,10 +8,6 @@
 	func coerce(B) = S
 ].

-:- instance solver_for(list(T), float) where [
-	coerce(_) = 42.0
-].
-
 :- pred mg(T, T) <= solver_for(list(T), T).
 :- mode mg(in, out) is det.

@@ -19,6 +15,10 @@

 :- implementation.
 :- import_module std_util.
+
+:- instance solver_for(list(T), float) where [
+	coerce(_) = 42.0
+].

 mg(S0, S) :-
 	( semidet_succeed ->
Index: tests/hard_coded/typeclasses/existential_rtti.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/existential_rtti.m,v
retrieving revision 1.2
diff -u -r1.2 existential_rtti.m
--- tests/hard_coded/typeclasses/existential_rtti.m	1 Dec 2003 15:56:10 -0000	1.2
+++ tests/hard_coded/typeclasses/existential_rtti.m	11 Apr 2005 05:31:53 -0000
@@ -8,16 +8,10 @@

 :- typeclass c(T) where [].

-:- instance c(int) where [].
-
 :- typeclass c2(T1, T2) where [].

-:- instance c2(int, string) where [].
-
 :- typeclass c3(T1, T2) where [].

-:- instance c3(int, float) where [].
-
 :- type f(X) ---> some [T] f(int, T, list(X), int).

 :- type myf  ---> some [T] myf(T) => c(T).
@@ -49,6 +43,10 @@
 :- implementation.

 :- import_module std_util.
+
+:- instance c(int) where [].
+:- instance c2(int, string) where [].
+:- instance c3(int, float) where [].

 main -->
 	io__write_string("Writing copies of terms:\n"),
Index: tests/hard_coded/typeclasses/func_default_mode_bug.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/func_default_mode_bug.m,v
retrieving revision 1.1
diff -u -r1.1 func_default_mode_bug.m
--- tests/hard_coded/typeclasses/func_default_mode_bug.m	17 Mar 1999 20:41:48 -0000	1.1
+++ tests/hard_coded/typeclasses/func_default_mode_bug.m	11 Apr 2005 05:32:36 -0000
@@ -61,6 +61,9 @@
 	func minus_one = C
 	].

+% ++++++++++++++++
+:- implementation.
+% ++++++++++++++++

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@@ -79,13 +82,6 @@

 	func( minus_one/0) is my_minus_one
 	].
-
-
-% ++++++++++++++++
-:- implementation.
-% ++++++++++++++++
-
-

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Index: tests/hard_coded/typeclasses/impure_methods.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/impure_methods.m,v
retrieving revision 1.3
diff -u -r1.3 impure_methods.m
--- tests/hard_coded/typeclasses/impure_methods.m	20 Feb 2004 06:01:42 -0000	1.3
+++ tests/hard_coded/typeclasses/impure_methods.m	11 Apr 2005 05:33:11 -0000
@@ -12,20 +12,8 @@

 :- type foo ---> foo.

-	% impure implementations of impure methods
-:- instance c(foo) where [
-	pred(m1/1) is foo_m1,
-	pred(m2/2) is foo_m2
-].
-
 :- type goo ---> goo.

-	% pure implementations of impure methods
-:- instance c(goo) where [
-	pred(m1/1) is goo_m1,
-	pred(m2/2) is goo_m2
-].
-
 :- impure pred foo_m1(foo::in) is det.
 :- semipure pred foo_m2(foo::in, int::out) is det.

@@ -33,6 +21,18 @@
 :- pred goo_m2(goo::in, int::out) is det.

 :- implementation.
+
+% impure implementations of impure methods
+:- instance c(foo) where [
+	pred(m1/1) is foo_m1,
+	pred(m2/2) is foo_m2
+].
+
+% pure implementations of impure methods
+:- instance c(goo) where [
+	pred(m1/1) is goo_m1,
+	pred(m2/2) is goo_m2
+].

 :- pragma promise_pure(main/2).

Index: tests/hard_coded/typeclasses/instance_unconstrained_tvar.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/instance_unconstrained_tvar.m,v
retrieving revision 1.1
diff -u -r1.1 instance_unconstrained_tvar.m
--- tests/hard_coded/typeclasses/instance_unconstrained_tvar.m	10 Apr 2000 07:20:51 -0000	1.1
+++ tests/hard_coded/typeclasses/instance_unconstrained_tvar.m	11 Apr 2005 05:33:28 -0000
@@ -11,11 +11,11 @@
 	mode m(in, di, uo) is det
 ].

+:- implementation.
+
 :- instance p(list(T)) where [
 	pred(m/3) is io__write
 ].
-
-:- implementation.

 main -->
 	m([1,2,3]),
Index: tests/hard_coded/typeclasses/instance_unconstrained_tvar_dup.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/instance_unconstrained_tvar_dup.m,v
retrieving revision 1.1
diff -u -r1.1 instance_unconstrained_tvar_dup.m
--- tests/hard_coded/typeclasses/instance_unconstrained_tvar_dup.m	24 Aug 2000 06:08:21 -0000	1.1
+++ tests/hard_coded/typeclasses/instance_unconstrained_tvar_dup.m	11 Apr 2005 05:33:50 -0000
@@ -19,11 +19,11 @@
 	mode m(in, in, di, uo) is det
 ].

+:- implementation.
+
 :- instance p(list(T), list(T)) where [
 	pred(m/4) is write_list_pair
 ].
-
-:- implementation.

 main -->
 	m([1,2,3], [4,5,6]),
Index: tests/hard_coded/typeclasses/instance_unconstrained_tvar_type_spec.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/instance_unconstrained_tvar_type_spec.m,v
retrieving revision 1.1
diff -u -r1.1 instance_unconstrained_tvar_type_spec.m
--- tests/hard_coded/typeclasses/instance_unconstrained_tvar_type_spec.m	1 Sep 2000 11:48:22 -0000	1.1
+++ tests/hard_coded/typeclasses/instance_unconstrained_tvar_type_spec.m	11 Apr 2005 05:34:14 -0000
@@ -11,11 +11,11 @@
         mode m(in, di, uo) is det
 ].

+:- implementation.
+
 :- instance p(list(T)) where [
         pred(m/3) is io__write
 ].
-
-:- implementation.

 main -->
         call_m([1, 2, 3]),
Index: tests/hard_coded/typeclasses/mode_decl_order_bug.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/mode_decl_order_bug.m,v
retrieving revision 1.1
diff -u -r1.1 mode_decl_order_bug.m
--- tests/hard_coded/typeclasses/mode_decl_order_bug.m	17 Mar 1999 20:41:50 -0000	1.1
+++ tests/hard_coded/typeclasses/mode_decl_order_bug.m	11 Apr 2005 05:35:26 -0000
@@ -65,6 +65,9 @@
 	mode is_null_for_plus( in) is semidet
 	].

+% ++++++++++++++++
+:- implementation.
+% ++++++++++++++++

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@@ -83,13 +86,6 @@

 	func( minus_one/0) is my_minus_one
 	].
-
-
-% ++++++++++++++++
-:- implementation.
-% ++++++++++++++++
-
-

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Index: tests/hard_coded/typeclasses/operator_classname.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/operator_classname.m,v
retrieving revision 1.1
diff -u -r1.1 operator_classname.m
--- tests/hard_coded/typeclasses/operator_classname.m	29 Jan 1998 23:52:01 -0000	1.1
+++ tests/hard_coded/typeclasses/operator_classname.m	11 Apr 2005 05:37:48 -0000
@@ -10,11 +10,11 @@
 	pred p(T::in, io__state::di, io__state::uo) is det
 ].

+:- implementation.
+
 :- instance +(int) where [
 	pred(p/3) is io__write_int
 ].
-
-:- implementation.

 main --> foo(1), io__nl.

Index: tests/hard_coded/typeclasses/recursive_instance_1.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/recursive_instance_1.m,v
retrieving revision 1.1
diff -u -r1.1 recursive_instance_1.m
--- tests/hard_coded/typeclasses/recursive_instance_1.m	26 Jul 2002 06:33:19 -0000	1.1
+++ tests/hard_coded/typeclasses/recursive_instance_1.m	11 Apr 2005 06:26:53 -0000
@@ -1,13 +1,18 @@
 :- module recursive_instance_1.
 :- interface.

-:- import_module int, io.
-:- import_module list.
+:- import_module io.

 :- typeclass foo(T, U) where [
 	func bar(T) = U
 ].

+:- pred main(io::di, io::uo) is det.
+
+:- implementation.
+:- import_module std_util, char.
+:- import_module int, list.
+
 :- instance foo(int, list(T)) <= foo(list(int), T) where [
 	bar(N) = ( N < 0 -> [bar([N+1])] ; [] )
 ].
@@ -22,11 +27,6 @@
 	),
 	( bar([]) = 0 )
 ].
-
-:- pred main(io::di, io::uo) is det.
-
-:- implementation.
-:- import_module std_util, char.

 main -->
 	{ X = bar([0,1,2]) },
Index: tests/hard_coded/typeclasses/type_spec.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/type_spec.m,v
retrieving revision 1.2
diff -u -r1.2 type_spec.m
--- tests/hard_coded/typeclasses/type_spec.m	10 Oct 2000 23:39:35 -0000	1.2
+++ tests/hard_coded/typeclasses/type_spec.m	11 Apr 2005 05:39:55 -0000
@@ -11,9 +11,6 @@
 		pred compare_t(comparison_result::out, T::in, T::in) is det
 ].

-:- instance comparable_t(int) where [
-		pred(compare_t/3) is compare_int
-].
 :- pred compare_int(comparison_result::out, int::in, int::in) is det.

 :- pred type_spec(list(T)::in, list(T)::in, list(T)::out) is det.
@@ -27,14 +24,6 @@
 		pred all_zero(T::in) is semidet
 	].

-:- instance all_zero(list(T)) <= all_zero(T) where [
-		pred(all_zero/1) is list_all_zero
-	].
-
-:- instance all_zero(int) where [
-		pred(all_zero/1) is is_zero
-	].
-
 :- pred is_zero(int::in) is semidet.

 	% This tests the case where higher_order.m must extract
@@ -63,6 +52,18 @@
 :- implementation.

 :- import_module type_spec_2.
+
+:- instance comparable_t(int) where [
+		pred(compare_t/3) is compare_int
+].
+
+:- instance all_zero(list(T)) <= all_zero(T) where [
+		pred(all_zero/1) is list_all_zero
+	].
+
+:- instance all_zero(int) where [
+		pred(all_zero/1) is is_zero
+	].

 main -->
 	{ type_spec([1,2,3], [3,4,5], Result1) },
Index: tests/hard_coded/typeclasses/typeclass_order_bug.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/typeclass_order_bug.m,v
retrieving revision 1.2
diff -u -r1.2 typeclass_order_bug.m
--- tests/hard_coded/typeclasses/typeclass_order_bug.m	15 Jan 2001 07:27:31 -0000	1.2
+++ tests/hard_coded/typeclasses/typeclass_order_bug.m	11 Apr 2005 05:39:06 -0000
@@ -20,11 +20,11 @@
 	mode m(in, in, di, uo) is det
 ].

+:- implementation.
+
 :- instance p(maybe(T), maybe(U)) where [
 	pred(m/4) is write_maybe_pair
 ].
-
-:- implementation.

 main -->
 	m(yes("ok"), yes(1)),
Index: tests/hard_coded/typeclasses/unqualified_method2.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/typeclasses/unqualified_method2.m,v
retrieving revision 1.1
diff -u -r1.1 unqualified_method2.m
--- tests/hard_coded/typeclasses/unqualified_method2.m	3 Dec 1999 12:52:17 -0000	1.1
+++ tests/hard_coded/typeclasses/unqualified_method2.m	11 Apr 2005 05:40:33 -0000
@@ -10,6 +10,10 @@
 		mode print_modified(in, di, uo) is det
 	].

+:- instance class(int).
+
+:- implementation.
+
 :- instance class(int) where [
 		pred(print_modified/3) is print_modified_int
 	].
Index: tests/invalid/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/Mmakefile,v
retrieving revision 1.161
diff -u -r1.161 Mmakefile
--- tests/invalid/Mmakefile	6 Apr 2005 05:08:08 -0000	1.161
+++ tests/invalid/Mmakefile	11 Apr 2005 03:36:49 -0000
@@ -85,6 +85,7 @@
 	impure_method_impl \
 	inline_conflict \
 	inst_list_dup \
+	instance_bug \
 	invalid_export_detism \
 	invalid_import_detism \
 	invalid_main \
Index: tests/invalid/impure_method_impl.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/impure_method_impl.err_exp,v
retrieving revision 1.5
diff -u -r1.5 impure_method_impl.err_exp
--- tests/invalid/impure_method_impl.err_exp	17 Jan 2005 05:01:40 -0000	1.5
+++ tests/invalid/impure_method_impl.err_exp	11 Apr 2005 06:22:50 -0000
@@ -1,15 +1,15 @@
-impure_method_impl.m:017: In call to impure predicate
-impure_method_impl.m:017:   `impure_method_impl.foo_m2/2':
-impure_method_impl.m:017:   purity error: call must be preceded by `impure'
-impure_method_impl.m:017:   indicator.
-impure_method_impl.m:017: In type class method implementation:
-impure_method_impl.m:017:   purity error: predicate is impure.
-impure_method_impl.m:017:   It must be declared `impure' or promised semipure.
-impure_method_impl.m:016: In call to semipure predicate
-impure_method_impl.m:016:   `impure_method_impl.foo_m1/2':
-impure_method_impl.m:016:   purity error: call must be preceded by `semipure'
-impure_method_impl.m:016:   indicator.
-impure_method_impl.m:016: In type class method implementation:
-impure_method_impl.m:016:   purity error: predicate is semipure.
-impure_method_impl.m:016:   It must be declared `semipure' or promised pure.
+impure_method_impl.m:022: In call to impure predicate
+impure_method_impl.m:022:   `impure_method_impl.foo_m2/2':
+impure_method_impl.m:022:   purity error: call must be preceded by `impure'
+impure_method_impl.m:022:   indicator.
+impure_method_impl.m:022: In type class method implementation:
+impure_method_impl.m:022:   purity error: predicate is impure.
+impure_method_impl.m:022:   It must be declared `impure' or promised semipure.
+impure_method_impl.m:021: In call to semipure predicate
+impure_method_impl.m:021:   `impure_method_impl.foo_m1/2':
+impure_method_impl.m:021:   purity error: call must be preceded by `semipure'
+impure_method_impl.m:021:   indicator.
+impure_method_impl.m:021: In type class method implementation:
+impure_method_impl.m:021:   purity error: predicate is semipure.
+impure_method_impl.m:021:   It must be declared `semipure' or promised pure.
 For more information, try recompiling with `-E'.
Index: tests/invalid/impure_method_impl.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/impure_method_impl.m,v
retrieving revision 1.2
diff -u -r1.2 impure_method_impl.m
--- tests/invalid/impure_method_impl.m	7 Nov 2002 16:17:08 -0000	1.2
+++ tests/invalid/impure_method_impl.m	11 Apr 2005 05:45:51 -0000
@@ -12,15 +12,15 @@

 :- type foo ---> foo.

-:- instance c(foo) where [
-	pred(m1/2) is foo_m1,
-	pred(m2/2) is foo_m2
-].
-
 :- semipure pred foo_m1(foo::in, int::out) is det.
 :- impure pred foo_m2(foo::in, int::out) is det.

 :- implementation.
+
+:- instance c(foo) where [
+	pred(m1/2) is foo_m1,
+	pred(m2/2) is foo_m2
+].

 main -->
 	[].
Index: tests/invalid/instance_bug.err_exp
===================================================================
RCS file: tests/invalid/instance_bug.err_exp
diff -N tests/invalid/instance_bug.err_exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ tests/invalid/instance_bug.err_exp	11 Apr 2005 03:37:43 -0000
@@ -0,0 +1,3 @@
+instance_bug.m:009: Error: non-abstract instance declaration in module
+instance_bug.m:009:   interface.
+For more information, try recompiling with `-E'.
Index: tests/invalid/instance_bug.m
===================================================================
RCS file: tests/invalid/instance_bug.m
diff -N tests/invalid/instance_bug.m
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ tests/invalid/instance_bug.m	11 Apr 2005 03:36:21 -0000
@@ -0,0 +1,18 @@
+:- module instance_bug.
+
+:- interface.
+
+:- typeclass foo(T) where [
+	func id(T) = T
+].
+	% Compiler should complain about this.
+:- instance foo(int) where [
+	id(X) = X
+].
+
+:- implementation.
+
+	% Compiler shouldn't complain about this.
+:- instance foo(float) where [
+	id(X) = X
+].
Index: tests/invalid/invalid_typeclass.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/invalid_typeclass.err_exp,v
retrieving revision 1.4
diff -u -r1.4 invalid_typeclass.err_exp
--- tests/invalid/invalid_typeclass.err_exp	20 Mar 2005 02:24:39 -0000	1.4
+++ tests/invalid/invalid_typeclass.err_exp	12 Apr 2005 02:29:29 -0000
@@ -5,7 +5,7 @@
 invalid_typeclass.m:009:   `invalid_typeclass.class2'/1.
 invalid_typeclass.m:017:   The superclass constraints do not match.
 invalid_typeclass.m:007: Error: no definition for typeclass
-invalid_typeclass.m:007:   `invalid_typeclass.class/1'.
+invalid_typeclass.m:007:   `invalid_typeclass.class'/1
 invalid_typeclass.m:009: Error: no definition for typeclass
-invalid_typeclass.m:009:   `invalid_typeclass.class2/1'.
+invalid_typeclass.m:009:   `invalid_typeclass.class2'/1
 For more information, try recompiling with `-E'.
Index: tests/invalid/method_impl.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/method_impl.err_exp,v
retrieving revision 1.1
diff -u -r1.1 method_impl.err_exp
--- tests/invalid/method_impl.err_exp	5 Nov 2000 01:13:12 -0000	1.1
+++ tests/invalid/method_impl.err_exp	11 Apr 2005 06:29:28 -0000
@@ -1,7 +1,7 @@
-method_impl.m:016: In clause for type class method implementation:
-method_impl.m:016:   in argument 2 of predicate `foo_m1/2':
-method_impl.m:016:   type error: variable `HeadVar__2' has type `int',
-method_impl.m:016:   expected type was `string'.
-method_impl.m:019: In clause for type class method implementation:
-method_impl.m:019:   error: undefined predicate `bar_m1/2'.
+method_impl.m:022: In clause for type class method implementation:
+method_impl.m:022:   in argument 2 of predicate `foo_m1/2':
+method_impl.m:022:   type error: variable `HeadVar__2' has type `int',
+method_impl.m:022:   expected type was `string'.
+method_impl.m:025: In clause for type class method implementation:
+method_impl.m:025:   error: undefined predicate `bar_m1/2'.
 For more information, try recompiling with `-E'.
Index: tests/invalid/method_impl.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/method_impl.m,v
retrieving revision 1.1
diff -u -r1.1 method_impl.m
--- tests/invalid/method_impl.m	3 Nov 2000 03:12:03 -0000	1.1
+++ tests/invalid/method_impl.m	11 Apr 2005 06:24:19 -0000
@@ -12,18 +12,18 @@
 :- type foo ---> foo.
 :- type bar ---> bar.

+:- pred foo_m1(foo::in, string::out) is det.
+
+:- pred foo_m2(foo::in, int::in) is det.
+
+:- implementation.
+
 :- instance c(foo) where [
 	pred(m1/2) is foo_m1
 ].
 :- instance c(bar) where [
 	pred(m1/2) is bar_m1
 ].
-
-:- pred foo_m1(foo::in, string::out) is det.
-
-:- pred foo_m2(foo::in, int::in) is det.
-
-:- implementation.

 main -->
 	[].
Index: tests/invalid/missing_det_decls.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/missing_det_decls.err_exp,v
retrieving revision 1.8
diff -u -r1.8 missing_det_decls.err_exp
--- tests/invalid/missing_det_decls.err_exp	14 Feb 2005 08:26:38 -0000	1.8
+++ tests/invalid/missing_det_decls.err_exp	12 Apr 2005 02:33:37 -0000
@@ -1,7 +1,7 @@
 missing_det_decls.m:005: Error: no determinism declaration for exported
-missing_det_decls.m:005:   predicate `missing_det_decls.exp1/0'.
+missing_det_decls.m:005:   predicate `missing_det_decls.exp1'/0.
 missing_det_decls.m:008: Error: no determinism declaration for exported
-missing_det_decls.m:008:   predicate `missing_det_decls.exp2/1'.
+missing_det_decls.m:008:   predicate `missing_det_decls.exp2'/1.
 missing_det_decls.m:013: Error: no determinism declaration for local predicate
 missing_det_decls.m:013:   `missing_det_decls.loc1/0'.
 missing_det_decls.m:016: Error: no determinism declaration for local predicate
Index: tests/invalid/tc_err1.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/tc_err1.err_exp,v
retrieving revision 1.4
diff -u -r1.4 tc_err1.err_exp
--- tests/invalid/tc_err1.err_exp	17 Jan 2003 05:57:09 -0000	1.4
+++ tests/invalid/tc_err1.err_exp	12 Apr 2005 00:43:11 -0000
@@ -1,8 +1,8 @@
 tc_err1.m:025: Error: no determinism declaration for type class method
-tc_err1.m:025:   predicate `tc_err1.handle_typedefs/3'.
-tc_err1.m:028: In instance declaration for `tc_err1.actions(tc_err1.pstate)':
-tc_err1.m:028:   no implementation for type class predicate method
-tc_err1.m:028:   `tc_err1.handle_typedefs/3'.
-tc_err1.m:028: In instance declaration for `tc_err1.actions/1': incorrect
-tc_err1.m:028:   method name(s): predicate `tc_err1.handle_typedefs/2' .
+tc_err1.m:025:   predicate `tc_err1.handle_typedefs'/3.
+tc_err1.m:032: In instance declaration for `tc_err1.actions(tc_err1.pstate)':
+tc_err1.m:032:   no implementation for type class predicate method
+tc_err1.m:032:   `tc_err1.handle_typedefs'/3.
+tc_err1.m:032: In instance declaration for `tc_err1.actions'/1: incorrect
+tc_err1.m:032:   method name(s): predicate `tc_err1.handle_typedefs'/2.
 For more information, try recompiling with `-E'.
Index: tests/invalid/tc_err1.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/tc_err1.m,v
retrieving revision 1.1
diff -u -r1.1 tc_err1.m
--- tests/invalid/tc_err1.m	11 May 2000 06:29:36 -0000	1.1
+++ tests/invalid/tc_err1.m	11 Apr 2005 05:46:24 -0000
@@ -25,6 +25,10 @@
 	mode handle_typedefs(in, in, out)
 ].

+:- instance actions(pstate).
+
+:- implementation.
+
 :- instance actions(pstate) where [
         pred(handle_typedefs/2) is pstate_handle_typedefs
 ].
Index: tests/invalid/tc_err2.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/tc_err2.err_exp,v
retrieving revision 1.3
diff -u -r1.3 tc_err2.err_exp
--- tests/invalid/tc_err2.err_exp	17 Jan 2003 05:57:09 -0000	1.3
+++ tests/invalid/tc_err2.err_exp	12 Apr 2005 00:43:34 -0000
@@ -1,6 +1,6 @@
-tc_err2.m:034: In instance declaration for `tc_err2.actions(tc_err2.pstate)':
-tc_err2.m:034:   no implementation for type class predicate method
-tc_err2.m:034:   `tc_err2.handle_typedefs/3'.
-tc_err2.m:034: In instance declaration for `tc_err2.actions/1': incorrect
-tc_err2.m:034:   method name(s): predicate `tc_err2.handle_typedefs/2' .
+tc_err2.m:044: In instance declaration for `tc_err2.actions(tc_err2.pstate)':
+tc_err2.m:044:   no implementation for type class predicate method
+tc_err2.m:044:   `tc_err2.handle_typedefs'/3.
+tc_err2.m:044: In instance declaration for `tc_err2.actions'/1: incorrect
+tc_err2.m:044:   method name(s): predicate `tc_err2.handle_typedefs'/2.
 For more information, try recompiling with `-E'.
Index: tests/invalid/tc_err2.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/tc_err2.m,v
retrieving revision 1.1
diff -u -r1.1 tc_err2.m
--- tests/invalid/tc_err2.m	11 May 2000 06:29:37 -0000	1.1
+++ tests/invalid/tc_err2.m	11 Apr 2005 05:47:02 -0000
@@ -28,12 +28,8 @@
 	mode handle_typedefs(in, in, out) is det
 ].

-:- instance super(pstate) where [
-].
-
-:- instance actions(pstate) where [
-        pred(handle_typedefs/2) is id
-].
+:- instance super(pstate).
+:- instance actions(pstate).

 :- pred foo(A) <= super(A).
 :- mode foo(in) is det.
@@ -41,6 +37,13 @@
 :- pred bar is det.

 :- implementation.
+
+:- instance super(pstate) where [
+].
+
+:- instance actions(pstate) where [
+        pred(handle_typedefs/2) is id
+].

 bar :-
 	foo(pstate).
Index: tests/invalid/transitive_import.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/transitive_import.err_exp,v
retrieving revision 1.3
diff -u -r1.3 transitive_import.err_exp
--- tests/invalid/transitive_import.err_exp	20 Mar 2005 02:24:39 -0000	1.3
+++ tests/invalid/transitive_import.err_exp	11 Apr 2005 06:31:44 -0000
@@ -1,8 +1,8 @@
-transitive_import.m:016: In declaration of instance of typeclass `enum.enum'/1:
-transitive_import.m:016:   error: undefined typeclass `enum.enum'/1.
-transitive_import.m:016:   (The module `enum' has not been imported.)
-transitive_import.m:025: In definition of function
-transitive_import.m:025:   `transitive_import.assoc_list_first'/3:
-transitive_import.m:025:   error: undefined type `std_util.pair'/2.
-transitive_import.m:025:   (The module `std_util' has not been imported.)
+transitive_import.m:016: In definition of function
+transitive_import.m:016:   `transitive_import.assoc_list_first'/3:
+transitive_import.m:016:   error: undefined type `std_util.pair'/2.
+transitive_import.m:016:   (The module `std_util' has not been imported.)
+transitive_import.m:023: In declaration of instance of typeclass `enum.enum'/1:
+transitive_import.m:023:   error: undefined typeclass `enum.enum'/1.
+transitive_import.m:023:   (The module `enum' has not been imported.)
 For more information, try recompiling with `-E'.
Index: tests/invalid/transitive_import.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/transitive_import.m,v
retrieving revision 1.1
diff -u -r1.1 transitive_import.m
--- tests/invalid/transitive_import.m	2 May 2001 17:34:49 -0000	1.1
+++ tests/invalid/transitive_import.m	11 Apr 2005 05:41:18 -0000
@@ -13,6 +13,13 @@
 	;	b
 	;	c.

+:- func assoc_list_first(assoc_list(int, V)) =
+		std_util__pair(int, V) is semidet.
+
+:- implementation.
+
+:- import_module list.
+
 :- instance enum__enum(enum) where [
 	to_int(a) = 1,
 	to_int(b) = 2,
@@ -21,12 +28,5 @@
 	from_int(2) = b,
 	from_int(3) = c
 ].
-
-:- func assoc_list_first(assoc_list(int, V)) =
-		std_util__pair(int, V) is semidet.
-
-:- implementation.
-
-:- import_module list.

 assoc_list_first([H | _]) = H.
Index: tests/invalid/typeclass_bogus_method.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_bogus_method.err_exp,v
retrieving revision 1.2
diff -u -r1.2 typeclass_bogus_method.err_exp
--- tests/invalid/typeclass_bogus_method.err_exp	17 Jan 2003 05:57:10 -0000	1.2
+++ tests/invalid/typeclass_bogus_method.err_exp	12 Apr 2005 02:37:04 -0000
@@ -1,21 +1,21 @@
 typeclass_bogus_method.m:022: In instance declaration for
-typeclass_bogus_method.m:022:   `typeclass_bogus_method.tc1/1': incorrect
+typeclass_bogus_method.m:022:   `typeclass_bogus_method.tc1'/1: incorrect
 typeclass_bogus_method.m:022:   method name(s): function
-typeclass_bogus_method.m:022:   `typeclass_bogus_method.bar/2' .
+typeclass_bogus_method.m:022:   `typeclass_bogus_method.bar'/3.
 typeclass_bogus_method.m:026: In instance declaration for
-typeclass_bogus_method.m:026:   `typeclass_bogus_method.tc2/1': incorrect
+typeclass_bogus_method.m:026:   `typeclass_bogus_method.tc2'/1: incorrect
 typeclass_bogus_method.m:026:   method name(s): function
-typeclass_bogus_method.m:026:   `typeclass_bogus_method.baz/1' .
+typeclass_bogus_method.m:026:   `typeclass_bogus_method.baz'/2.
 typeclass_bogus_method.m:029: In instance declaration for
 typeclass_bogus_method.m:029:   `typeclass_bogus_method.tc3(int)': no
 typeclass_bogus_method.m:029:   implementation for type class function method
-typeclass_bogus_method.m:029:   `typeclass_bogus_method.foo3/1'.
+typeclass_bogus_method.m:029:   `typeclass_bogus_method.foo3'/1.
 typeclass_bogus_method.m:029: In instance declaration for
-typeclass_bogus_method.m:029:   `typeclass_bogus_method.tc3/1': incorrect
+typeclass_bogus_method.m:029:   `typeclass_bogus_method.tc3'/1: incorrect
 typeclass_bogus_method.m:029:   method name(s): function
-typeclass_bogus_method.m:029:   `typeclass_bogus_method.foo5/1' .
+typeclass_bogus_method.m:029:   `typeclass_bogus_method.foo5'/2.
 typeclass_bogus_method.m:033: In instance declaration for
-typeclass_bogus_method.m:033:   `typeclass_bogus_method.tc4/1': incorrect
+typeclass_bogus_method.m:033:   `typeclass_bogus_method.tc4'/1: incorrect
 typeclass_bogus_method.m:033:   method name(s): function
-typeclass_bogus_method.m:033:   `typeclass_bogus_method.foo5/1' .
+typeclass_bogus_method.m:033:   `typeclass_bogus_method.foo5'/2.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_constraint_extra_var.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_constraint_extra_var.err_exp,v
retrieving revision 1.3
diff -u -r1.3 typeclass_constraint_extra_var.err_exp
--- tests/invalid/typeclass_constraint_extra_var.err_exp	14 Feb 2005 08:26:38 -0000	1.3
+++ tests/invalid/typeclass_constraint_extra_var.err_exp	11 Apr 2005 06:59:04 -0000
@@ -1,9 +1,9 @@
-typeclass_constraint_extra_var.m:015: In declaration for predicate
-typeclass_constraint_extra_var.m:015:   `typeclass_constraint_extra_var.mg/2':
-typeclass_constraint_extra_var.m:015:   error in type class constraints: type
-typeclass_constraint_extra_var.m:015:   variable `U' occurs only in the
-typeclass_constraint_extra_var.m:015:   constraints, not in the predicate's
-typeclass_constraint_extra_var.m:015:   argument types.
+typeclass_constraint_extra_var.m:011: In declaration for predicate
+typeclass_constraint_extra_var.m:011:   `typeclass_constraint_extra_var.mg/2':
+typeclass_constraint_extra_var.m:011:   error in type class constraints: type
+typeclass_constraint_extra_var.m:011:   variable `U' occurs only in the
+typeclass_constraint_extra_var.m:011:   constraints, not in the predicate's
+typeclass_constraint_extra_var.m:011:   argument types.
 typeclass_constraint_extra_var.m:025: In clause for predicate `typeclass_constraint_extra_var.mg/2':
 typeclass_constraint_extra_var.m:025:   unsatisfiable typeclass constraint(s):
 typeclass_constraint_extra_var.m:025:   `typeclass_constraint_extra_var.solver_for((list.list(T)), T)'.
Index: tests/invalid/typeclass_constraint_extra_var.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_constraint_extra_var.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_constraint_extra_var.m
--- tests/invalid/typeclass_constraint_extra_var.m	26 Jul 2002 06:33:20 -0000	1.1
+++ tests/invalid/typeclass_constraint_extra_var.m	11 Apr 2005 06:32:20 -0000
@@ -1,24 +1,24 @@
 :- module typeclass_constraint_extra_var.
 :- interface.

-:- import_module float, io.
+:- import_module io.
 :- import_module list.

 :- typeclass solver_for(B, S) where [
 	func coerce(B) = S
 ].

-:- instance solver_for(list(T), float) where [
-	coerce(_) = 42.0
-].
-
 :- pred mg(T, T) <= solver_for(list(U), T).
 :- mode mg(in, out) is det.

 :- pred main(io::di, io::uo) is det.

 :- implementation.
-:- import_module std_util.
+:- import_module float, std_util.
+
+:- instance solver_for(list(T), float) where [
+	coerce(_) = 42.0
+].

 mg(S0, S) :-
 	( semidet_succeed ->
Index: tests/invalid/typeclass_missing_det.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_missing_det.err_exp,v
retrieving revision 1.3
diff -u -r1.3 typeclass_missing_det.err_exp
--- tests/invalid/typeclass_missing_det.err_exp	14 Feb 2005 08:26:38 -0000	1.3
+++ tests/invalid/typeclass_missing_det.err_exp	12 Apr 2005 04:53:11 -0000
@@ -1,3 +1,3 @@
 typeclass_missing_det.m:010: Error: no determinism declaration for type class
-typeclass_missing_det.m:010:   method predicate `typeclass_missing_det.p/1'.
+typeclass_missing_det.m:010:   method predicate `typeclass_missing_det.p'/1.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_missing_det_2.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_missing_det_2.err_exp,v
retrieving revision 1.3
diff -u -r1.3 typeclass_missing_det_2.err_exp
--- tests/invalid/typeclass_missing_det_2.err_exp	14 Feb 2005 08:26:38 -0000	1.3
+++ tests/invalid/typeclass_missing_det_2.err_exp	12 Apr 2005 04:54:15 -0000
@@ -1,4 +1,4 @@
 typeclass_missing_det_2.m:011: Error: no determinism declaration for type class
 typeclass_missing_det_2.m:011:   method predicate
-typeclass_missing_det_2.m:011:   `typeclass_missing_det_2.p/1'.
+typeclass_missing_det_2.m:011:   `typeclass_missing_det_2.p'/1.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_missing_det_3.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_missing_det_3.err_exp,v
retrieving revision 1.4
diff -u -r1.4 typeclass_missing_det_3.err_exp
--- tests/invalid/typeclass_missing_det_3.err_exp	14 Feb 2005 08:26:38 -0000	1.4
+++ tests/invalid/typeclass_missing_det_3.err_exp	12 Apr 2005 04:54:32 -0000
@@ -3,5 +3,5 @@
 typeclass_missing_det_3.m:001:   anything.
 typeclass_missing_det_3.m:013: Error: no determinism declaration for type class
 typeclass_missing_det_3.m:013:   method predicate
-typeclass_missing_det_3.m:013:   `typeclass_missing_det_3.write/3'.
+typeclass_missing_det_3.m:013:   `typeclass_missing_det_3.write'/3.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_missing_mode_2.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_missing_mode_2.err_exp,v
retrieving revision 1.4
diff -u -r1.4 typeclass_missing_mode_2.err_exp
--- tests/invalid/typeclass_missing_mode_2.err_exp	20 Mar 2005 02:24:40 -0000	1.4
+++ tests/invalid/typeclass_missing_mode_2.err_exp	12 Apr 2005 00:44:16 -0000
@@ -1,8 +1,8 @@
 typeclass_missing_mode_2.m:011: Error: no mode declaration for type class
 typeclass_missing_mode_2.m:011:   method predicate
 typeclass_missing_mode_2.m:011:   `typeclass_missing_mode_2.p'/1.
-typeclass_missing_mode_2.m:013: In instance declaration for
-typeclass_missing_mode_2.m:013:   `typeclass_missing_mode_2.c/1': incorrect
-typeclass_missing_mode_2.m:013:   method name(s): predicate
-typeclass_missing_mode_2.m:013:   `typeclass_missing_mode_2.p/1' .
+typeclass_missing_mode_2.m:018: In instance declaration for
+typeclass_missing_mode_2.m:018:   `typeclass_missing_mode_2.c'/1: incorrect
+typeclass_missing_mode_2.m:018:   method name(s): predicate
+typeclass_missing_mode_2.m:018:   `typeclass_missing_mode_2.p'/1.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_missing_mode_2.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_missing_mode_2.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_missing_mode_2.m
--- tests/invalid/typeclass_missing_mode_2.m	29 Apr 2001 07:54:37 -0000	1.1
+++ tests/invalid/typeclass_missing_mode_2.m	11 Apr 2005 06:33:32 -0000
@@ -10,6 +10,11 @@
 :- typeclass c(T) where [
 	pred p(T)		% error -- missing mode declaration for p/1
 ].
+
+:- instance c(int).
+
+:- implementation.
+
 :- instance c(int) where [
 	p(_) :- true
 ].
Index: tests/invalid/typeclass_test_10.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_10.err_exp,v
retrieving revision 1.2
diff -u -r1.2 typeclass_test_10.err_exp
--- tests/invalid/typeclass_test_10.err_exp	20 Mar 2005 02:24:40 -0000	1.2
+++ tests/invalid/typeclass_test_10.err_exp	12 Apr 2005 00:44:49 -0000
@@ -1,10 +1,7 @@
-typeclass_test_10.m:001: In module `typeclass_test_10':
-typeclass_test_10.m:001:   warning: module `std_util' is imported in the
-typeclass_test_10.m:001:   interface, but is not used in the interface.
-typeclass_test_10.m:006: In instance declaration for `typeclass_test_10.bar/1':
-typeclass_test_10.m:006:   incorrect method name(s): predicate
-typeclass_test_10.m:006:   `typeclass_test_10.p/0' .
-typeclass_test_10.m:011: In instance declaration for `typeclass_test_10.baz/1':
-typeclass_test_10.m:011:   incorrect method name(s): predicate
-typeclass_test_10.m:011:   `typeclass_test_10.r/0' .
+typeclass_test_10.m:012: In instance declaration for `typeclass_test_10.bar'/1:
+typeclass_test_10.m:012:   incorrect method name(s): predicate
+typeclass_test_10.m:012:   `typeclass_test_10.p'/0.
+typeclass_test_10.m:017: In instance declaration for `typeclass_test_10.baz'/1:
+typeclass_test_10.m:017:   incorrect method name(s): predicate
+typeclass_test_10.m:017:   `typeclass_test_10.r'/0.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_test_10.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_10.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_test_10.m
--- tests/invalid/typeclass_test_10.m	12 Feb 2003 22:58:19 -0000	1.1
+++ tests/invalid/typeclass_test_10.m	11 Apr 2005 06:34:05 -0000
@@ -1,8 +1,14 @@
 :- module typeclass_test_10.
 :- interface.
-:- import_module std_util.
 :- typeclass bar(T) where [].
 :- typeclass baz(T) where [pred q(T::in) is semidet].
+
+:- instance bar(int).
+:- instance baz(int).
+
+:- implementation.
+:- import_module std_util.
+
 :- instance bar(int) where [
 	pred(p/0) is semidet_fail
 ].
Index: tests/invalid/typeclass_test_3.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_3.err_exp,v
retrieving revision 1.11
diff -u -r1.11 typeclass_test_3.err_exp
--- tests/invalid/typeclass_test_3.err_exp	17 Jan 2003 05:57:10 -0000	1.11
+++ tests/invalid/typeclass_test_3.err_exp	12 Apr 2005 04:55:21 -0000
@@ -1,8 +1,8 @@
 typeclass_test_3.m:014: In instance declaration for
 typeclass_test_3.m:014:   `typeclass_test_3.numbered_type(int)': no
 typeclass_test_3.m:014:   implementation for type class function method
-typeclass_test_3.m:014:   `typeclass_test_3.type_num/1'.
+typeclass_test_3.m:014:   `typeclass_test_3.type_num'/1.
 typeclass_test_3.m:014: In instance declaration for
-typeclass_test_3.m:014:   `typeclass_test_3.numbered_type/1': incorrect method
-typeclass_test_3.m:014:   name(s): function `typeclass_test_3.type_num/0' .
+typeclass_test_3.m:014:   `typeclass_test_3.numbered_type'/1: incorrect method
+typeclass_test_3.m:014:   name(s): function `typeclass_test_3.type_num'/1.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_test_4.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_4.err_exp,v
retrieving revision 1.9
diff -u -r1.9 typeclass_test_4.err_exp
--- tests/invalid/typeclass_test_4.err_exp	17 Jan 2003 05:57:10 -0000	1.9
+++ tests/invalid/typeclass_test_4.err_exp	12 Apr 2005 04:55:36 -0000
@@ -1,8 +1,8 @@
 typeclass_test_4.m:014: In instance declaration for
 typeclass_test_4.m:014:   `typeclass_test_4.numbered_type(int)': no
 typeclass_test_4.m:014:   implementation for type class function method
-typeclass_test_4.m:014:   `typeclass_test_4.type_num/1'.
+typeclass_test_4.m:014:   `typeclass_test_4.type_num'/1.
 typeclass_test_4.m:014: In instance declaration for
-typeclass_test_4.m:014:   `typeclass_test_4.numbered_type/1': incorrect method
-typeclass_test_4.m:014:   name(s): function `typeclass_test_4.type_num/0' .
+typeclass_test_4.m:014:   `typeclass_test_4.numbered_type'/1: incorrect method
+typeclass_test_4.m:014:   name(s): function `typeclass_test_4.type_num'/1.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_test_5.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_5.err_exp,v
retrieving revision 1.7
diff -u -r1.7 typeclass_test_5.err_exp
--- tests/invalid/typeclass_test_5.err_exp	17 Jan 2003 05:57:10 -0000	1.7
+++ tests/invalid/typeclass_test_5.err_exp	11 Apr 2005 06:34:41 -0000
@@ -1,9 +1,9 @@
-typeclass_test_5.m:015: In instance declaration for `typeclass_test_5.c2(int)':
-typeclass_test_5.m:015:   multiple implementations of type class predicate
-typeclass_test_5.m:015:   method `typeclass_test_5.p/1'.
-typeclass_test_5.m:016: First definition appears here.
-typeclass_test_5.m:017: Subsequent definition appears here.
-typeclass_test_5.m:015: In instance declaration for `typeclass_test_5.c2(int)':
-typeclass_test_5.m:015:   superclass constraint(s) not satisfied:
-typeclass_test_5.m:015:   `typeclass_test_5.c1(int)'.
+typeclass_test_5.m:020: In instance declaration for `typeclass_test_5.c2(int)':
+typeclass_test_5.m:020:   multiple implementations of type class predicate
+typeclass_test_5.m:020:   method `typeclass_test_5.p/1'.
+typeclass_test_5.m:021: First definition appears here.
+typeclass_test_5.m:022: Subsequent definition appears here.
+typeclass_test_5.m:020: In instance declaration for `typeclass_test_5.c2(int)':
+typeclass_test_5.m:020:   superclass constraint(s) not satisfied:
+typeclass_test_5.m:020:   `typeclass_test_5.c1(int)'.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_test_5.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_5.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_test_5.m
--- tests/invalid/typeclass_test_5.m	22 Sep 1998 16:19:35 -0000	1.1
+++ tests/invalid/typeclass_test_5.m	11 Apr 2005 05:49:03 -0000
@@ -12,15 +12,15 @@
 	pred p(T), mode p(out) is det
 ].

-:- instance c2(int) where [
-	pred(p/1) is get_int,
-	pred(p/1) is get_int2
-].
-
 :- pred get_int(int::out) is det.
 :- pred get_int2(int::out) is det.

 :- implementation.
+
+:- instance c2(int) where [
+	pred(p/1) is get_int,
+	pred(p/1) is get_int2
+].

 main --> [].

Index: tests/invalid/typeclass_test_9.err_exp
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_9.err_exp,v
retrieving revision 1.7
diff -u -r1.7 typeclass_test_9.err_exp
--- tests/invalid/typeclass_test_9.err_exp	20 Mar 2005 02:24:40 -0000	1.7
+++ tests/invalid/typeclass_test_9.err_exp	11 Apr 2005 06:50:02 -0000
@@ -1,15 +1,12 @@
-typeclass_test_9.m:001: In module `typeclass_test_9':
-typeclass_test_9.m:001:   warning: module `std_util' is imported in the
-typeclass_test_9.m:001:   interface, but is not used in the interface.
-typeclass_test_9.m:004: In declaration for predicate `typeclass_test_9.p/0':
-typeclass_test_9.m:004:   error in type class constraints: type variable `T'
-typeclass_test_9.m:004:   occurs only in the constraints, not in the
-typeclass_test_9.m:004:   predicate's argument types.
-typeclass_test_9.m:006: In declaration for predicate `typeclass_test_9.q/0':
-typeclass_test_9.m:006:   error in type class constraints: type variable `T'
-typeclass_test_9.m:006:   occurs only in the constraints, not in the
-typeclass_test_9.m:006:   predicate's argument types.
-typeclass_test_9.m:010: Error: multiply defined (or overlapping) instance
-typeclass_test_9.m:010:   declarations for class `typeclass_test_9.foo'/1.
-typeclass_test_9.m:007: Previous instance declaration was here.
+typeclass_test_9.m:003: In declaration for predicate `typeclass_test_9.p/0':
+typeclass_test_9.m:003:   error in type class constraints: type variable `T'
+typeclass_test_9.m:003:   occurs only in the constraints, not in the
+typeclass_test_9.m:003:   predicate's argument types.
+typeclass_test_9.m:005: In declaration for predicate `typeclass_test_9.q/0':
+typeclass_test_9.m:005:   error in type class constraints: type variable `T'
+typeclass_test_9.m:005:   occurs only in the constraints, not in the
+typeclass_test_9.m:005:   predicate's argument types.
+typeclass_test_9.m:018: Error: multiply defined (or overlapping) instance
+typeclass_test_9.m:018:   declarations for class `typeclass_test_9.foo'/1.
+typeclass_test_9.m:015: Previous instance declaration was here.
 For more information, try recompiling with `-E'.
Index: tests/invalid/typeclass_test_9.m
===================================================================
RCS file: /home/mercury1/repository/tests/invalid/typeclass_test_9.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_test_9.m
--- tests/invalid/typeclass_test_9.m	12 Feb 1999 04:19:31 -0000	1.1
+++ tests/invalid/typeclass_test_9.m	11 Apr 2005 06:35:05 -0000
@@ -1,9 +1,17 @@
 :- module typeclass_test_9.
 :- interface.
-:- import_module std_util.
 :- typeclass foo(T) where [pred p is semidet].
 :- typeclass bar(T) where [].
 :- typeclass baz(T) where [pred q is semidet].
+
+:- instance foo(int).
+:- instance foo(int).
+:- instance bar(int).
+:- instance baz(int).
+
+:- implementation.
+:- import_module std_util.
+
 :- instance foo(int) where [
 	pred(p/0) is semidet_succeed
 ].
Index: tests/recompilation/add_instance_2_r.m.1
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/add_instance_2_r.m.1,v
retrieving revision 1.1
diff -u -r1.1 add_instance_2_r.m.1
--- tests/recompilation/add_instance_2_r.m.1	27 Jun 2001 05:04:45 -0000	1.1
+++ tests/recompilation/add_instance_2_r.m.1	11 Apr 2005 06:36:40 -0000
@@ -13,14 +13,16 @@
 :- typeclass io(T) where [
 	pred output(T::in, io__state::di, io__state::uo) is det
 ].
-
-:- instance io(foo) where [
-	pred(output/3) is io__write
-].
+
+:- instance io(foo).

 :- pred main(io__state::di, io__state::uo) is det.

 :- implementation.
+
+:- instance io(foo) where [
+	pred(output/3) is io__write
+].

 init_foo(a).

Index: tests/recompilation/change_class_r_2.m.1
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/change_class_r_2.m.1,v
retrieving revision 1.1
diff -u -r1.1 change_class_r_2.m.1
--- tests/recompilation/change_class_r_2.m.1	27 Jun 2001 05:04:53 -0000	1.1
+++ tests/recompilation/change_class_r_2.m.1	11 Apr 2005 06:37:20 -0000
@@ -13,12 +13,14 @@
 :- typeclass io(T) where [
 	pred output(T::in, io__state::di, io__state::uo) is det
 ].
-
+
+:- instance io(foo).
+
+:- implementation.
+
 :- instance io(foo) where [
 	pred(output/3) is io__write
 ].
-
-:- implementation.

 init_foo(a).

Index: tests/recompilation/change_class_r_2.m.2
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/change_class_r_2.m.2,v
retrieving revision 1.1
diff -u -r1.1 change_class_r_2.m.2
--- tests/recompilation/change_class_r_2.m.2	27 Jun 2001 05:04:53 -0000	1.1
+++ tests/recompilation/change_class_r_2.m.2	11 Apr 2005 06:37:34 -0000
@@ -15,6 +15,12 @@
 	pred input(T::out, io__state::di, io__state::uo) is det
 ].

+:- instance io(foo).
+
+:- implementation.
+
+:- import_module require.
+
 :- instance io(foo) where [
 	pred(output/3) is io__write,
 	(input(T) -->
@@ -26,10 +32,6 @@
 		}
 	)
 ].
-
-:- implementation.
-
-:- import_module require.

 init_foo(a).

Index: tests/recompilation/change_instance_r.m.1
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/change_instance_r.m.1,v
retrieving revision 1.1
diff -u -r1.1 change_instance_r.m.1
--- tests/recompilation/change_instance_r.m.1	27 Jun 2001 05:04:54 -0000	1.1
+++ tests/recompilation/change_instance_r.m.1	11 Apr 2005 06:38:06 -0000
@@ -13,10 +13,8 @@
 :- typeclass io(T) where [
 	pred output(T::in, io__state::di, io__state::uo) is det
 ].
-
-:- instance io(foo) where [
-	pred(output/3) is io__write
-].
+
+:- instance io(foo).

 :- pred main(io__state::di, io__state::uo) is det.

@@ -25,6 +23,10 @@
 init_foo(a).

 :- import_module change_instance_r_2.
+
+:- instance io(foo) where [
+	pred(output/3) is io__write
+].

 main -->
 	{ init_foo(X) },
Index: tests/recompilation/combined_type_mode_nr_2.m.1
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/combined_type_mode_nr_2.m.1,v
retrieving revision 1.1
diff -u -r1.1 combined_type_mode_nr_2.m.1
--- tests/recompilation/combined_type_mode_nr_2.m.1	24 Jul 2001 10:47:24 -0000	1.1
+++ tests/recompilation/combined_type_mode_nr_2.m.1	11 Apr 2005 06:39:21 -0000
@@ -12,11 +12,13 @@
 			io__state::di, io__state::uo) is det
 ].

+:- instance io(int).
+
+:- implementation.
+
 :- instance io(int) where [
 	id(T, T),
 	(output(U, U, T) --> io__write(T))
 ].
-
-:- implementation.

 p(T, T).
Index: tests/recompilation/combined_type_mode_nr_2.m.2
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/combined_type_mode_nr_2.m.2,v
retrieving revision 1.1
diff -u -r1.1 combined_type_mode_nr_2.m.2
--- tests/recompilation/combined_type_mode_nr_2.m.2	24 Jul 2001 10:47:25 -0000	1.1
+++ tests/recompilation/combined_type_mode_nr_2.m.2	11 Apr 2005 06:39:40 -0000
@@ -12,13 +12,15 @@
 			io__state::di, io__state::uo) is det
 ].

-:- instance io(int) where [
-	id(T, T),
-	(output(U, U, T) --> io__write(T))
-].
+:- instance io(int).

 :- type t == int.

 :- implementation.
+
+:- instance io(int) where [
+	id(T, T),
+	(output(U, U, T) --> io__write(T))
+].

 p(T, T).
Index: tests/recompilation/typeclass_method_pragma_r_2.m.1
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/typeclass_method_pragma_r_2.m.1,v
retrieving revision 1.1
diff -u -r1.1 typeclass_method_pragma_r_2.m.1
--- tests/recompilation/typeclass_method_pragma_r_2.m.1	24 Jul 2001 10:47:27 -0000	1.1
+++ tests/recompilation/typeclass_method_pragma_r_2.m.1	11 Apr 2005 06:40:11 -0000
@@ -14,11 +14,13 @@
 	pred output(T::in, io__state::di, io__state::uo) is det
 ].

+:- instance io(foo).
+
+:- implementation.
+
 :- instance io(foo) where [
 	pred(output/3) is io__write
 ].
-
-:- implementation.

 init_foo(a).

Index: tests/recompilation/typeclass_method_pragma_r_2.m.2
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/typeclass_method_pragma_r_2.m.2,v
retrieving revision 1.1
diff -u -r1.1 typeclass_method_pragma_r_2.m.2
--- tests/recompilation/typeclass_method_pragma_r_2.m.2	24 Jul 2001 10:47:27 -0000	1.1
+++ tests/recompilation/typeclass_method_pragma_r_2.m.2	11 Apr 2005 06:40:48 -0000
@@ -10,16 +10,20 @@

 :- pred init_foo(foo::out) is det.

+:- pragma obsolete(output/3).
+
 :- typeclass io(T) where [
 	pred output(T::in, io__state::di, io__state::uo) is det
 ].
-:- pragma obsolete(output/3).
+
+:- instance io(foo).
+
+:- implementation.

 :- instance io(foo) where [
 	pred(output/3) is io__write
 ].

-:- implementation.

 init_foo(a).

Index: tests/recompilation/unchanged_with_type_nr_2.m.1
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/unchanged_with_type_nr_2.m.1,v
retrieving revision 1.3
diff -u -r1.3 unchanged_with_type_nr_2.m.1
--- tests/recompilation/unchanged_with_type_nr_2.m.1	25 Aug 2004 08:21:30 -0000	1.3
+++ tests/recompilation/unchanged_with_type_nr_2.m.1	11 Apr 2005 06:43:55 -0000
@@ -27,9 +27,12 @@
 :- func with_type_6 `with_type` map_func(T, T) is det <= string(T).

 :- typeclass string(T) where [].
-:- instance string(string) where [].
+
+:- instance string(string).

 :- implementation.
+
+:- instance string(string) where [].

 with_type_1(_, _, X, X).

Index: tests/recompilation/unchanged_with_type_nr_2.m.2
===================================================================
RCS file: /home/mercury1/repository/tests/recompilation/unchanged_with_type_nr_2.m.2,v
retrieving revision 1.3
diff -u -r1.3 unchanged_with_type_nr_2.m.2
--- tests/recompilation/unchanged_with_type_nr_2.m.2	25 Aug 2004 08:21:30 -0000	1.3
+++ tests/recompilation/unchanged_with_type_nr_2.m.2	11 Apr 2005 06:44:10 -0000
@@ -27,11 +27,13 @@
 :- func with_type_6 `with_type` map_func(T, T) is det <= string(T).

 :- typeclass string(T) where [].
-:- instance string(string) where [].
+:- instance string(string).

 :- type t == int.

 :- implementation.
+
+:- instance string(string) where [].

 with_type_1(_, _, X, X).

Index: tests/valid/func_method.m
===================================================================
RCS file: /home/mercury1/repository/tests/valid/func_method.m,v
retrieving revision 1.1
diff -u -r1.1 func_method.m
--- tests/valid/func_method.m	29 Jul 1998 06:28:17 -0000	1.1
+++ tests/valid/func_method.m	11 Apr 2005 05:50:21 -0000
@@ -9,11 +9,13 @@
 	mode op(in) = out is det
 ].

+:- instance c(int).
+
+:- implementation.
+
 :- instance c(int) where [
 	func(op/1) is op_int
 ].
-
-:- implementation.

 :- func op_int(pair(int, T)) = pair(int, T).
 :- mode op_int(in) = out is det.
Index: tests/valid/instance_superclass.m
===================================================================
RCS file: /home/mercury1/repository/tests/valid/instance_superclass.m,v
retrieving revision 1.2
diff -u -r1.2 instance_superclass.m
--- tests/valid/instance_superclass.m	18 Jun 1998 04:11:45 -0000	1.2
+++ tests/valid/instance_superclass.m	11 Apr 2005 05:50:52 -0000
@@ -11,12 +11,14 @@
 :- typeclass c1(T) where [ ].
 :- typeclass c2(T) <= c1(T) where [ ].

-:- instance c1(list(T)) where [ ].
-:- instance c2(list(T)) where [ ].
-
+:- instance c1(list(T)).
+:- instance c2(list(T)).
 :- pred p(T::in) is det.

 :- implementation.
+
+:- instance c1(list(T)) where [].
+:- instance c2(list(T)) where [].

 	% The bug that this test case is checking for is at the creation of
 	% the typeclass info for this call: if the substitution from "T" in
Index: tests/valid/instance_unconstrained_tvar.m
===================================================================
RCS file: /home/mercury1/repository/tests/valid/instance_unconstrained_tvar.m,v
retrieving revision 1.1
diff -u -r1.1 instance_unconstrained_tvar.m
--- tests/valid/instance_unconstrained_tvar.m	19 Jun 1998 00:43:17 -0000	1.1
+++ tests/valid/instance_unconstrained_tvar.m	11 Apr 2005 05:51:19 -0000
@@ -7,12 +7,15 @@
 :- typeclass c1(T) where [ ].
 :- typeclass c2(T) <= c1(T) where [ ].

-:- instance c1(list(T)) where [ ].
-:- instance c2(list(T)) where [ ].
+:- instance c1(list(T)).
+:- instance c2(list(T)).

 :- pred p is det.

 :- implementation.
+
+:- instance c1(list(T)) where [].
+:- instance c2(list(T)) where [].

 	% The bug that this test case is checking for is at the creation of
 	% the typeclass info for this call, when creating the type-info the
Index: tests/valid/transitive_instance.m
===================================================================
RCS file: /home/mercury1/repository/tests/valid/transitive_instance.m,v
retrieving revision 1.1
diff -u -r1.1 transitive_instance.m
--- tests/valid/transitive_instance.m	23 Jul 2002 13:34:04 -0000	1.1
+++ tests/valid/transitive_instance.m	11 Apr 2005 06:46:19 -0000
@@ -15,6 +15,10 @@
 	:- interface.

 	:- typeclass c1(T) where [].
+
+	:- instance c1(int).
+
+	:- implementation.

 	:- instance c1(int) where [].

@@ -28,6 +32,10 @@
 	:- import_module transitive_instance__sub1.

 	:- typeclass c2(T) <= c1(T) where [].
+
+	:- instance c2(int).
+
+	:- implementation.

 	:- instance c2(int) where [].

Index: tests/valid/typeclass_constraint_no_var.m
===================================================================
RCS file: /home/mercury1/repository/tests/valid/typeclass_constraint_no_var.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_constraint_no_var.m
--- tests/valid/typeclass_constraint_no_var.m	25 Sep 2002 06:49:43 -0000	1.1
+++ tests/valid/typeclass_constraint_no_var.m	11 Apr 2005 05:51:40 -0000
@@ -8,10 +8,6 @@
 	func coerce(B) = S
 ].

-:- instance solver_for(list(T), float) where [
-	coerce(_) = 42.0
-].
-
 :- pred mg(T, T) <= solver_for(list(float), float).
 :- mode mg(in, out) is det.

@@ -19,6 +15,10 @@

 :- implementation.
 :- import_module std_util.
+
+:- instance solver_for(list(T), float) where [
+	coerce(_) = 42.0
+].

 mg(S0, S) :-
 	( semidet_succeed ->
Index: tests/valid/typeclass_constraint_nonvar_bug.m
===================================================================
RCS file: /home/mercury1/repository/tests/valid/typeclass_constraint_nonvar_bug.m,v
retrieving revision 1.1
diff -u -r1.1 typeclass_constraint_nonvar_bug.m
--- tests/valid/typeclass_constraint_nonvar_bug.m	13 Mar 2003 11:53:36 -0000	1.1
+++ tests/valid/typeclass_constraint_nonvar_bug.m	11 Apr 2005 05:54:58 -0000
@@ -25,9 +25,58 @@
 :- typeclass lin_int_solver(T) <= lin_arith_solver(int, T) where [].
 :- typeclass int_solver(T) <= (arith(T), lin_int_solver(T)) where [].

-:- instance eq(int) where [
-	pred(unify_oo/2) is int_unify_oo
-].
+:- instance eq(int).
+
+:- instance add(int).
+:- instance neq(int).
+:- instance ord(int).
+:- instance mult(int).
+:- instance sord(int).
+:- instance strict(int).
+:- instance arith(int).
+
+:- type cint ---> a ; b.
+
+:- instance eq(cint).
+
+:- instance add(cint).
+:- instance neq(cint).
+:- instance ord(cint).
+:- instance mult(cint).
+:- instance sord(cint).
+:- instance strict(cint).
+:- instance arith(cint).
+
+:- instance solver(cint).
+
+:- instance solver_for(int, cint).
+:- instance lin_mult(int, cint).
+:- instance lin_arith_solver(int, cint).
+:- instance arith_solver(int, cint).
+
+:- instance lin_int_solver(cint).
+:- instance int_solver(cint).
+
+:- type list(T) ---> [] ; [T | list(T)].
+:- instance eq(list(T)).
+
+:- type arc ---> arc(int, int).
+:- instance eq(arc).
+
+:- type graph ---> graph(list(arc)).
+:- instance eq(graph).
+
+:- pred int_unify_oo(int::in, int::in) is semidet.
+
+:- pred cint_unify_oo(cint::in, cint::in) is semidet.
+
+:- pred list_unify_oo(list(T)::in, list(T)::in) is semidet <= eq(T).
+
+:- pred arc_unify_oo(arc::in, arc::in) is semidet.
+
+:- pred graph_unify_oo(graph::in, graph::in) is semidet.
+
+:- implementation.

 :- instance add(int) where [].
 :- instance neq(int) where [].
@@ -37,8 +86,6 @@
 :- instance strict(int) where [].
 :- instance arith(int) where [].

-:- type cint ---> a ; b.
-
 :- instance eq(cint) where [
 	pred(unify_oo/2) is cint_unify_oo
 ].
@@ -61,34 +108,17 @@
 :- instance lin_int_solver(cint) where [].
 :- instance int_solver(cint) where [].

-
-:- type list(T) ---> [] ; [T | list(T)].
 :- instance eq(list(T)) <= eq(T) where [
 	pred(unify_oo/2) is list_unify_oo
 ].

-:- type arc ---> arc(int, int).
 :- instance eq(arc) where [
 	pred(unify_oo/2) is arc_unify_oo
 ].

-:- type graph ---> graph(list(arc)).
 :- instance eq(graph) where [
 	pred(unify_oo/2) is graph_unify_oo
 ].
-
-
-:- pred int_unify_oo(int::in, int::in) is semidet.
-
-:- pred cint_unify_oo(cint::in, cint::in) is semidet.
-
-:- pred list_unify_oo(list(T)::in, list(T)::in) is semidet <= eq(T).
-
-:- pred arc_unify_oo(arc::in, arc::in) is semidet.
-
-:- pred graph_unify_oo(graph::in, graph::in) is semidet.
-
-:- implementation.

 int_unify_oo(X, X).

--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list