From: Eric Botcazou <[email protected]>
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