From: Eric Botcazou <ebotca...@adacore.com> In Ada 2012, primitive equality operators of untagged record types compose like those of tagged record types, but this has never been implemented for untagged record types with a variant part.
gcc/ada/ * exp_ch4.adb (Expand_Composite_Equality): In the untagged record case, always look for a user-defined equality operator in Ada 2012. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/exp_ch4.adb | 50 ++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 983f66231a2..1674d6c8132 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -2329,6 +2329,28 @@ package body Exp_Ch4 is -- Case of untagged record types elsif Is_Record_Type (Full_Type) then + -- Equality composes in Ada 2012 for untagged record types. It also + -- composes for bounded strings, because they are part of the + -- predefined environment (see 4.5.2(32.1/1)). We could make it + -- compose for bounded strings by making them tagged, or by making + -- sure all subcomponents are set to the same value, even when not + -- used. Instead, we have this special case in the compiler, because + -- it's more efficient. + + if Ada_Version >= Ada_2012 or else Is_Bounded_String (Comp_Type) then + declare + Eq_Call : constant Node_Id := + Build_Eq_Call (Comp_Type, Loc, Lhs, Rhs); + + begin + if Present (Eq_Call) then + return Eq_Call; + end if; + end; + end if; + + -- Check whether a TSS has been created for the type + Eq_Op := TSS (Full_Type, TSS_Composite_Equality); if Present (Eq_Op) then @@ -2355,34 +2377,6 @@ package body Exp_Ch4 is Parameter_Associations => New_List (L_Exp, R_Exp)); end; - -- Equality composes in Ada 2012 for untagged record types. It also - -- composes for bounded strings, because they are part of the - -- predefined environment (see 4.5.2(32.1/1)). We could make it - -- compose for bounded strings by making them tagged, or by making - -- sure all subcomponents are set to the same value, even when not - -- used. Instead, we have this special case in the compiler, because - -- it's more efficient. - - elsif Ada_Version >= Ada_2012 or else Is_Bounded_String (Comp_Type) - then - -- If no TSS has been created for the type, check whether there is - -- a primitive equality declared for it. - - declare - Op : constant Node_Id := - Build_Eq_Call (Comp_Type, Loc, Lhs, Rhs); - - begin - -- Use user-defined primitive if it exists, otherwise use - -- predefined equality. - - if Present (Op) then - return Op; - else - return Make_Op_Eq (Loc, Lhs, Rhs); - end if; - end; - else return Expand_Record_Equality (Nod, Full_Type, Lhs, Rhs); end if; -- 2.45.1