Patchwork [Ada] Missing finalization of transient function result

login
register
mail settings
Submitter Arnaud Charlet
Date July 23, 2012, 8:13 a.m.
Message ID <20120723081301.GA5062@adacore.com>
Download mbox | patch
Permalink /patch/172570/
State New
Headers show

Comments

Arnaud Charlet - July 23, 2012, 8:13 a.m.
This patch corrects the machinery which detects whether a particular transient
context may raise an exception. Examine the original expression of an object
declaration node because a function call that returns on the secondary stack
may have been rewritten into something else and no longer appear as a call.

Tested on x86_64-pc-linux-gnu, committed on trunk

2012-07-23  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch7.adb (Requires_Hooking): Examine the original expression
	of an object declaration node because a function call that
	returns on the secondary stack may have been rewritten into
	something else.

Patch

Index: exp_ch7.adb
===================================================================
--- exp_ch7.adb	(revision 189768)
+++ exp_ch7.adb	(working copy)
@@ -4369,12 +4369,16 @@ 
          function Requires_Hooking return Boolean is
          begin
             --  The context is either a procedure or function call or an object
-            --  declaration initialized by a function call. In all these cases,
-            --  the calls might raise an exception.
+            --  declaration initialized by a function call. Note that in the
+            --  latter case, a function call that returns on the secondary
+            --  stack is usually rewritten into something else. Its proper
+            --  detection requires examination of the original initialization
+            --  expression.
 
             return Nkind (N) in N_Subprogram_Call
-               or else (Nkind (N) = N_Object_Declaration
-                         and then Nkind (Expression (N)) = N_Function_Call);
+              or else (Nkind (N) = N_Object_Declaration
+                         and then Nkind (Original_Node (Expression (N))) =
+                                    N_Function_Call);
          end Requires_Hooking;
 
          --  Local variables