https://gcc.gnu.org/g:95bb4ef5cbe1fa0bc05802debcb25a9422e080a5

commit r15-5675-g95bb4ef5cbe1fa0bc05802debcb25a9422e080a5
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Tue Nov 12 00:18:00 2024 +0100

    ada: Fix latent issue exposed by recent change in aggregate expansion
    
    The tag is not assigned when a compile-time known aggregate initializes an
    object declared with an address clause/aspect.
    
    gcc/ada/ChangeLog:
    
            * freeze.adb: Remove clauses for Exp_Ch3.
            (Check_Address_Clause): Always reassign the tag for an object of a
            tagged type if there is an initialization expression.

Diff:
---
 gcc/ada/freeze.adb | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index b52898f42121..9486d02f6818 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -33,7 +33,6 @@ with Einfo.Entities; use Einfo.Entities;
 with Einfo.Utils;    use Einfo.Utils;
 with Elists;         use Elists;
 with Errout;         use Errout;
-with Exp_Ch3;        use Exp_Ch3;
 with Exp_Ch7;        use Exp_Ch7;
 with Exp_Disp;       use Exp_Disp;
 with Exp_Pakd;       use Exp_Pakd;
@@ -767,16 +766,23 @@ package body Freeze is
             Append_Freeze_Action (E,
               Make_Assignment_Statement (Sloc (Decl),
                 Name       => Lhs,
-                Expression => Expression (Decl)));
+                Expression => Init));
 
             Set_No_Initialization (Decl);
 
             --  If the object is tagged, check whether the tag must be
             --  reassigned explicitly.
 
-            Tag_Assign := Make_Tag_Assignment (Decl);
-            if Present (Tag_Assign) then
-               Append_Freeze_Action (E, Tag_Assign);
+            if Is_Tagged_Type (Typ) and then Tagged_Type_Expansion then
+               Tag_Assign :=
+                 Make_Tag_Assignment_From_Type
+                   (Sloc (Decl),
+                    New_Occurrence_Of (E, Sloc (Decl)),
+                    Underlying_Type (Typ));
+
+               if Present (Tag_Assign) then
+                  Append_Freeze_Action (E, Tag_Assign);
+               end if;
             end if;
          end if;
       end if;

Reply via email to