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;