https://gcc.gnu.org/g:90b3826db603022edcdcea46711d4e4b58aeae12
commit r15-2828-g90b3826db603022edcdcea46711d4e4b58aeae12 Author: Javier Miranda <mira...@adacore.com> Date: Mon Jul 29 10:26:53 2024 +0000 ada: Finalization_Size raises Constraint_Error When the attribute Finalization_Size is applied to an interface type object, the compiler-generated code fails at runtime, raising a Constraint_Error exception. gcc/ada/ * exp_attr.adb (Expand_N_Attribute_Reference) <Finalization_Size>: If the prefix is an interface type, generate code to obtain its address and displace it to reference the base of the object. Diff: --- gcc/ada/exp_attr.adb | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index 13c7444ca878..6475308f71b9 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -3688,11 +3688,34 @@ package body Exp_Attr is -- Local variables - Size : Entity_Id; + P_Loc : constant Source_Ptr := Sloc (Pref); + Size : Entity_Id; -- Start of processing for Finalization_Size begin + -- If the prefix is an interface type, generate code to obtain its + -- address and displace it to reference the base of the object. + + if Is_Interface (Ptyp) then + -- Generate: + -- Ptyp!(tag_ptr!($base_address (ptr.all'address)).all) + + Rewrite (Pref, + Unchecked_Convert_To (Ptyp, + Make_Explicit_Dereference (P_Loc, + Unchecked_Convert_To (RTE (RE_Tag_Ptr), + Make_Function_Call (P_Loc, + Name => New_Occurrence_Of + (RTE (RE_Base_Address), P_Loc), + Parameter_Associations => + New_List ( + Make_Attribute_Reference (P_Loc, + Prefix => Duplicate_Subexpr (Pref), + Attribute_Name => Name_Address))))))); + Analyze_And_Resolve (Pref, Ptyp); + end if; + -- If the prefix is the dereference of an access value subject to -- pragma No_Heap_Finalization, then no header has been added.