From: Eric Botcazou <ebotca...@adacore.com>

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.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 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 b52898f4212..9486d02f681 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;
-- 
2.43.0

Reply via email to