diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2024-11-12 00:18:00 +0100 |
---|---|---|
committer | Marc Poulhiès <dkm@gcc.gnu.org> | 2024-11-26 10:49:34 +0100 |
commit | 95bb4ef5cbe1fa0bc05802debcb25a9422e080a5 (patch) | |
tree | 900f65368900f5efb1767e04f6c3e4bf14927bc9 /gcc/ada | |
parent | 8278d9551df610179fca114808a7e6e62bab3d82 (diff) | |
download | gcc-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.adb | 16 |
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; |