[m-dev.] for review: fix bug in record syntax

Fergus Henderson fjh at cs.mu.OZ.AU
Thu May 4 00:12:52 AEST 2000


Does this fix work for the following test case?

	:- module test2.
	:- interface.

	:- type foo ---> some [T] debug(T).
	:- type bar ---> bar( debug :: int ).

	:- pred baz(int, bar).
	:- mode baz(in, in) is semidet.

	:- implementation.

	baz(debug(X), X).

On 03-May-2000, Simon TAYLOR <stayl at cs.mu.OZ.AU> wrote:
> 
> Fix a bug in record syntax reported by Tom Conway which caused a
> compiler abort if there was a field and a constructor with the
> same name.
> 
> compiler/post_typecheck.m:
> 	Check for a matching constructor before trying to
> 	expand out a field access function.
> 
> tests/valid/Mmakefile:
> tests/valid/record_syntax_bug.m:
> 	Test case.
> 
> 
> 
> Index: compiler/post_typecheck.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/post_typecheck.m,v
> retrieving revision 1.19
> diff -u -u -r1.19 post_typecheck.m
> --- compiler/post_typecheck.m	2000/04/14 08:38:19	1.19
> +++ compiler/post_typecheck.m	2000/05/03 07:24:59
> @@ -840,7 +840,18 @@
>  		%
>  		ConsId0 = cons(Name, Arity),
>  		is_field_access_function_name(ModuleInfo0, Name, Arity,
> -			AccessType, FieldName)
> +			AccessType, FieldName),
> +
> +		%
> +		% If there is a constructor for which the argument types
> +		% match, this unification couldn't be a call to a field
> +		% access function, otherwise there would have been an
> +		% error reported for unresolved overloading. 
> +		%
> +		pred_info_typevarset(PredInfo0, TVarSet),
> +		map__apply_to_list(ArgVars0, VarTypes0, ArgTypes0),
> +		\+ find_matching_constructor(ModuleInfo0, TVarSet,
> +			ConsId0, TypeOfX, ArgTypes0)
>  	->
>  		post_typecheck__finish_field_access_function(ModuleInfo0,
>  			PredInfo0, PredInfo, AccessType, FieldName,
> @@ -854,6 +865,34 @@
>  		Goal = unify(X0, functor(ConsId0, ArgVars0), Mode0,
>  				Unification0, UnifyContext) - GoalInfo0
>  	).
> +
> +%-----------------------------------------------------------------------------%
> +
> +	% Succeed if there is a constructor which matches the given
> +	% cons_id, type and argument types.
> +:- pred find_matching_constructor(module_info, tvarset,
> +		cons_id, type, list(type)).
> +:- mode find_matching_constructor(in, in, in, in, in) is semidet.
> +
> +find_matching_constructor(ModuleInfo, TVarSet, ConsId, Type, ArgTypes) :-
> +	type_to_type_id(Type, TypeId, _),
> +	module_info_ctors(ModuleInfo, ConsTable),
> +	map__search(ConsTable, ConsId, ConsDefns),
> +	list__member(ConsDefn, ConsDefns),
> +
> +	% Overloading resolution ignores the class constraints.
> +	ConsDefn = hlds_cons_defn(_, _, ConsArgTypes0, ConsTypeId, _),
> +	ConsTypeId = TypeId,
> +
> +	module_info_types(ModuleInfo, Types),
> +	map__search(Types, TypeId, TypeDefn),
> +	hlds_data__get_type_defn_tvarset(TypeDefn, TypeTVarSet),
> +
> +	varset__merge_subst(TVarSet, TypeTVarSet, _, Renaming),
> +	term__apply_substitution_to_list(ConsArgTypes0,
> +		Renaming, ConsArgTypes),
> +
> +	type_list_subsumes(ConsArgTypes, ArgTypes, _).
>  
>  %-----------------------------------------------------------------------------%
>  
> Index: tests/valid/Mmakefile
> ===================================================================
> RCS file: /home/mercury1/repository/tests/valid/Mmakefile,v
> retrieving revision 1.61
> diff -u -u -r1.61 Mmakefile
> --- tests/valid/Mmakefile	2000/04/14 08:39:24	1.61
> +++ tests/valid/Mmakefile	2000/05/03 03:28:09
> @@ -110,6 +110,7 @@
>  	pred_with_no_modes.m \
>  	qualified_cons_id.m \
>  	quantifier_warning.m \
> +	record_syntax_bug.m \
>  	recursive_no_tag_type.m \
>  	same_length_2.m \
>  	semidet_disj.m \
> Index: tests/valid/record_syntax_bug.m
> ===================================================================
> RCS file: record_syntax_bug.m
> diff -N record_syntax_bug.m
> --- /dev/null	Wed May  3 17:05:01 2000
> +++ record_syntax_bug.m	Wed May  3 16:20:56 2000
> @@ -0,0 +1,15 @@
> +% The compiler of 3/5/2000 aborted on this test case because it
> +% didn't properly handle overloading of field access functions
> +% and constructors.
> +:- module record_syntax_bug.
> +:- interface.
> +
> +:- type foo ---> debug(string).
> +:- type bar ---> bar( debug :: int ).
> +
> +:- func dest(foo) = int.
> +
> +:- implementation.
> +
> +dest(debug(_)) = 42.
> +
> --------------------------------------------------------------------------
> 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
> --------------------------------------------------------------------------

-- 
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