From: Eric Botcazou <ebotca...@adacore.com> The assertion is:
pragma Assert (Side_Effect_Free (L)); in Make_Tag_Ctrl_Assignment and demonstrates that the sequence: Remove_Side_Effects (L); pragma Assert (Side_Effect_Free (L)); does not hold in this case. What happens is that Remove_Side_Effects uses a renaming to remove the side effects of L but, at the end, the renamed object is substituted back for the renamed object in the node by Expand_Renaming, which is invoked because the Is_Renaming_Of_Object flag is set on the renaming after Evaluate_Name has been invoked on its Name. This is a general discrepancy between Evaluate_Name and Side_Effect_Free of Exp_Util, coming from the call to Safe_Unchecked_Type_Conversion present in Side_Effect_Free in this case. The long term goal is probably to remove the call but, in the meantime, this change is sufficient to fix the failure. gcc/ada/ChangeLog: * exp_util.adb (Safe_Unchecked_Type_Conversion): Always return True if the expression is the prefix of an N_Selected_Component. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/exp_util.adb | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index 80e9a810116..ac49c6b3826 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -13771,11 +13771,12 @@ package body Exp_Util is -- The above requirements should be documented in Sinfo ??? function Safe_Unchecked_Type_Conversion (Exp : Node_Id) return Boolean is + Pexp : constant Node_Id := Parent (Exp); + Otyp : Entity_Id; Ityp : Entity_Id; Oalign : Uint; Ialign : Uint; - Pexp : constant Node_Id := Parent (Exp); begin -- If the expression is the RHS of an assignment or object declaration @@ -13793,18 +13794,12 @@ package body Exp_Util is return True; -- If the expression is the prefix of an N_Selected_Component we should - -- also be OK because GCC knows to look inside the conversion except if - -- the type is discriminated. We assume that we are OK anyway if the - -- type is not set yet or if it is controlled since we can't afford to - -- introduce a temporary in this case. + -- also be OK because GCC knows to look inside the conversion. elsif Nkind (Pexp) = N_Selected_Component and then Prefix (Pexp) = Exp then - return No (Etype (Pexp)) - or else not Is_Type (Etype (Pexp)) - or else not Has_Discriminants (Etype (Pexp)) - or else Is_Constrained (Etype (Pexp)); + return True; end if; -- Set the output type, this comes from Etype if it is set, otherwise we -- 2.43.0