aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2024-01-04 00:34:33 +0000
committerMarc Poulhiès <poulhies@adacore.com>2024-05-06 11:11:32 +0200
commit911d921759e4a32bac81016b2dda1e26147ba5d8 (patch)
tree672f9b9101197ec0c484d72650ac1b9925b33e93 /gcc
parent9737a48553b7b489bbecb59b6dd9a96ed02bb1f8 (diff)
downloadgcc-911d921759e4a32bac81016b2dda1e26147ba5d8.zip
gcc-911d921759e4a32bac81016b2dda1e26147ba5d8.tar.gz
gcc-911d921759e4a32bac81016b2dda1e26147ba5d8.tar.bz2
ada: Excess finalization on return of call to dispatching constructor
The compiler expands a too-early finalization call for the result object of an extended return statement that returns a call to a dispatching constructor function for a limited interface type, resulting in premature (and extra) finalization of the result. The temporary object that the compiler creates to hold the result of the build-in-place call loses the fact that it comes from a return, and the wrong BIP allocation form may be passed in the call to the dispatching constructor, and the later code for dealing with finalization in Exp_Ch7.Build_Finalizer incorrectly finalizes the result object. gcc/ada/ * exp_ch6.adb (Make_Build_In_Place_Iface_Call_In_Object_Declaration): Set the Is_Return_Object flag on the entity of the temp object created to hold the BIP call result, from the flag on the passed-in object declaration's entity. Update copyright notice to 2024.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/exp_ch6.adb10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index fcfd1d7..a89c9af 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -9393,6 +9393,16 @@ package body Exp_Ch6 is
Insert_Action (Obj_Decl, Tmp_Decl);
Expander_Mode_Restore;
+ -- Inherit Is_Return_Object from the parent object to the temp object,
+ -- so that Make_In_Build_Place_Call_In_Object_Declaration will handle
+ -- the temp properly in cases where there's a BIP_Alloc_Form formal of
+ -- an enclosing function that should be passed along (and which also
+ -- ensures that if the BIP call is used as a function result and it
+ -- requires finalization, then it will not be finalized prematurely
+ -- or redundantly).
+
+ Set_Is_Return_Object (Tmp_Id, Is_Return_Object (Obj_Id));
+
Make_Build_In_Place_Call_In_Object_Declaration
(Obj_Decl => Tmp_Decl,
Function_Call => Expression (Tmp_Decl));