Skip to content
Snippets Groups Projects
  • Eric Botcazou's avatar
    37449332
    ada: Fix renaming of predefined equality operator for unchecked union types · 37449332
    Eric Botcazou authored
    The problem is that the predefined equality operator for unchecked union
    types is implemented out of line by invoking a function that takes more
    parameters than the two operands, which means that the renaming is not
    seen as type conforming with this function and, therefore, is rejected.
    
    The way out is to implement these additional parameters as "extra" formal
    parameters, since this kind of parameters is not taken into account for
    semantic checks.  The change also factors out the duplicated generation
    of actuals for these additional parameters into a single procedure.
    
    gcc/ada/
    
    	* exp_ch3.ads (Build_Variant_Record_Equality): Add Spec_Id as second
    	parameter.
    	* exp_ch3.adb (Build_Variant_Record_Equality): For unchecked union
    	types, build the additional parameters as extra formal parameters.
    	(Expand_Freeze_Record_Type.Build_Variant_Record_Equality): Pass
    	Empty as Spec_Id in call to Build_Variant_Record_Equality.
    	* exp_ch4.ads (Expand_Unchecked_Union_Equality): New procedure.
    	* exp_ch4.adb (Expand_Composite_Equality): In the presence of a
    	function implementing composite equality, do not special case the
    	unchecked union types, and only convert the operands if the base
    	types are not the same like in Build_Equality_Call.
    	(Build_Equality_Call): Do not special case the unchecked union types
    	and relocate the operands only once.
    	(Expand_N_Op_Eq): Do not special case the unchecked union types.
    	(Expand_Unchecked_Union_Equality): New procedure implementing the
    	specific expansion of calls to the predefined equality function.
    	* exp_ch6.adb (Is_Unchecked_Union_Equality): New predicate.
    	(Expand_Call): Call Is_Unchecked_Union_Equality to determine whether
    	to call Expand_Unchecked_Union_Equality or Expand_Call_Helper.
    	* exp_ch8.adb (Build_Body_For_Renaming): Set Has_Delayed_Freeze flag
    	earlier on Id and pass Id in call to Build_Variant_Record_Equality.
    37449332
    History
    ada: Fix renaming of predefined equality operator for unchecked union types
    Eric Botcazou authored
    The problem is that the predefined equality operator for unchecked union
    types is implemented out of line by invoking a function that takes more
    parameters than the two operands, which means that the renaming is not
    seen as type conforming with this function and, therefore, is rejected.
    
    The way out is to implement these additional parameters as "extra" formal
    parameters, since this kind of parameters is not taken into account for
    semantic checks.  The change also factors out the duplicated generation
    of actuals for these additional parameters into a single procedure.
    
    gcc/ada/
    
    	* exp_ch3.ads (Build_Variant_Record_Equality): Add Spec_Id as second
    	parameter.
    	* exp_ch3.adb (Build_Variant_Record_Equality): For unchecked union
    	types, build the additional parameters as extra formal parameters.
    	(Expand_Freeze_Record_Type.Build_Variant_Record_Equality): Pass
    	Empty as Spec_Id in call to Build_Variant_Record_Equality.
    	* exp_ch4.ads (Expand_Unchecked_Union_Equality): New procedure.
    	* exp_ch4.adb (Expand_Composite_Equality): In the presence of a
    	function implementing composite equality, do not special case the
    	unchecked union types, and only convert the operands if the base
    	types are not the same like in Build_Equality_Call.
    	(Build_Equality_Call): Do not special case the unchecked union types
    	and relocate the operands only once.
    	(Expand_N_Op_Eq): Do not special case the unchecked union types.
    	(Expand_Unchecked_Union_Equality): New procedure implementing the
    	specific expansion of calls to the predefined equality function.
    	* exp_ch6.adb (Is_Unchecked_Union_Equality): New predicate.
    	(Expand_Call): Call Is_Unchecked_Union_Equality to determine whether
    	to call Expand_Unchecked_Union_Equality or Expand_Call_Helper.
    	* exp_ch8.adb (Build_Body_For_Renaming): Set Has_Delayed_Freeze flag
    	earlier on Id and pass Id in call to Build_Variant_Record_Equality.