diff options
| author | martinw | 2000-10-26 11:28:11 +0000 | 
|---|---|---|
| committer | martinw | 2000-10-26 11:28:11 +0000 | 
| commit | 141b184fe960aa39636987f4e93692c70b23afb3 (patch) | |
| tree | 66dd556b2d2881c46e67d917085af1e0674717ac /frontend/checktypes.icl | |
| parent | added new macro "unsafeFold2St" (diff) | |
added new error messages
"context restriction not allowed for fully polymorph instance" and
"context restriction equals instance type"
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@270 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend/checktypes.icl')
| -rw-r--r-- | frontend/checktypes.icl | 47 | 
1 files changed, 41 insertions, 6 deletions
diff --git a/frontend/checktypes.icl b/frontend/checktypes.icl index f4d99fe..d54f715 100644 --- a/frontend/checktypes.icl +++ b/frontend/checktypes.icl @@ -686,20 +686,55 @@ checkOpenATypes mod_index scope types cot_state  //	# dak_None=DAK_None  //	= mapSt (checkOpenAType mod_index scope dak_None) types cot_state -checkInstanceType :: !Index !InstanceType !Specials !u:{# CheckedTypeDef} !v:{# ClassDef} !u:{# DclModule} !*TypeHeaps !*CheckState +checkInstanceType :: !Index !(Global DefinedSymbol) !InstanceType !Specials !u:{# CheckedTypeDef} !v:{# ClassDef} !u:{# DclModule} !*TypeHeaps !*CheckState  	-> (!InstanceType, !Specials, !u:{# CheckedTypeDef}, !v:{# ClassDef}, !u:{# DclModule}, !*TypeHeaps, !*CheckState) -checkInstanceType mod_index it=:{it_types,it_context} specials type_defs class_defs modules heaps cs -	# ots = { ots_type_defs = type_defs, ots_modules = modules } +checkInstanceType mod_index ins_class it=:{it_types,it_context} specials type_defs class_defs modules heaps cs +	# cs_error +			= check_fully_polymorphity it_types it_context cs.cs_error +	  ots = { ots_type_defs = type_defs, ots_modules = modules }  	  oti = { oti_heaps = heaps, oti_all_vars = [], oti_all_attrs = [], oti_global_vars= [] } -	  (it_types, (ots, {oti_heaps,oti_all_vars,oti_all_attrs}, cs)) = checkOpenTypes mod_index cGlobalScope DAK_None it_types (ots, oti, cs) +	  (it_types, (ots, {oti_heaps,oti_all_vars,oti_all_attrs}, cs)) = checkOpenTypes mod_index cGlobalScope DAK_None it_types (ots, oti, { cs & cs_error = cs_error })  	  (it_context, type_defs, class_defs, modules, heaps, cs) = checkTypeContexts it_context mod_index ots.ots_type_defs class_defs ots.ots_modules oti_heaps cs -	  (specials, cs) = checkSpecialTypeVars specials cs  +	  cs_error +	  		= foldSt (compare_context_and_instance_types ins_class it_types) it_context cs.cs_error +	  (specials, cs) = checkSpecialTypeVars specials { cs & cs_error = cs_error }  	  cs_symbol_table = removeVariablesFromSymbolTable cGlobalScope oti_all_vars cs.cs_symbol_table  	  cs_symbol_table = removeAttributesFromSymbolTable oti_all_attrs cs_symbol_table  	  (specials, type_defs, modules, heaps, cs) = checkSpecialTypes mod_index specials type_defs modules heaps { cs & cs_symbol_table = cs_symbol_table }  	= ({it & it_vars = oti_all_vars, it_types = it_types, it_attr_vars = oti_all_attrs, it_context = it_context },  	    	specials, type_defs, class_defs, modules, heaps, cs) -	 +  where +	check_fully_polymorphity it_types it_context cs_error +		| all is_type_var it_types && not (isEmpty it_context) +			= checkError "" "context restriction not allowed for fully polymorph instance" cs_error +		= cs_error +	  where +		is_type_var (TV _) = True +		is_type_var _ = False + +	compare_context_and_instance_types ins_class it_types {tc_class, tc_types} cs_error +		| ins_class<>tc_class +			= cs_error +		# are_equal +				= fold2St compare_context_and_instance_type it_types tc_types True +		| are_equal +			= checkError ins_class.glob_object.ds_ident "context restriction equals instance type" cs_error +		= cs_error +	  where +		compare_context_and_instance_type (TA {type_index=ti1} _) (TA {type_index=ti2} _) are_equal_accu +			= ti1==ti2 && are_equal_accu +		compare_context_and_instance_type (_ --> _) (_ --> _) are_equal_accu +			= are_equal_accu +		compare_context_and_instance_type (CV tv1 :@: _) (CV tv2 :@: _) are_equal_accu +			= tv1==tv2 && are_equal_accu +		compare_context_and_instance_type (TB bt1) (TB bt2) are_equal_accu +			= bt1==bt2 && are_equal_accu +		compare_context_and_instance_type (TV tv1) (TV tv2) are_equal_accu +			= tv1==tv2 && are_equal_accu +		compare_context_and_instance_type _ _ are_equal_accu +			= False + +  checkSymbolType :: !Index !SymbolType !Specials !u:{# CheckedTypeDef} !v:{# ClassDef} !u:{# DclModule} !*TypeHeaps !*CheckState  	-> (!SymbolType, !Specials, !u:{# CheckedTypeDef}, !v:{# ClassDef}, !u:{# DclModule}, !*TypeHeaps, !*CheckState)  checkSymbolType  mod_index st=:{st_args,st_result,st_context,st_attr_env} specials type_defs class_defs modules heaps cs  | 
