https://gcc.gnu.org/g:06728901a03376bdeafc3ff48115113a0ffe169e

commit r16-2411-g06728901a03376bdeafc3ff48115113a0ffe169e
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Tue Jul 8 11:05:19 2025 +0200

    ada: Fix assertion failure on aggregate with controlled component
    
    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.

Diff:
---
 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 80e9a8101166..ac49c6b38267 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

Reply via email to