aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2024-11-12 00:18:00 +0100
committerMarc Poulhiès <dkm@gcc.gnu.org>2024-11-26 10:49:34 +0100
commit95bb4ef5cbe1fa0bc05802debcb25a9422e080a5 (patch)
tree900f65368900f5efb1767e04f6c3e4bf14927bc9 /gcc/ada
parent8278d9551df610179fca114808a7e6e62bab3d82 (diff)
downloadgcc-95bb4ef5cbe1fa0bc05802debcb25a9422e080a5.zip
gcc-95bb4ef5cbe1fa0bc05802debcb25a9422e080a5.tar.gz
gcc-95bb4ef5cbe1fa0bc05802debcb25a9422e080a5.tar.bz2
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.
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/freeze.adb16
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index b52898f..9486d02 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;