[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 12 Jun 2012 11:02:08 +0000 (13:02 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 12 Jun 2012 11:02:08 +0000 (13:02 +0200)
2012-06-12  Hristian Kirtchev  <kirtchev@adacore.com>

* exp_ch7.adb (Process_Transient_Objects): Renamed constant
Requires_Hooking to Must_Hook and replace all occurrences of the name.
(Requires_Hooking): New routine. Detect all contexts that require
transient variable export to the outer finalizer due to a potential
exception.

2012-06-12  Eric Botcazou  <ebotcazou@adacore.com>

* einfo.ads: Minor correction in comment.

From-SVN: r188444

gcc/ada/ChangeLog
gcc/ada/einfo.ads
gcc/ada/exp_ch7.adb

index ad0181a27ebecb8acd1e5b331dcdd5f4b4af017c..d1494f6ef50e713d855a1eb5b8eb85c28e9f22cb 100644 (file)
@@ -1,3 +1,11 @@
+2012-06-12  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * exp_ch7.adb (Process_Transient_Objects): Renamed constant
+       Requires_Hooking to Must_Hook and replace all occurrences of the name.
+       (Requires_Hooking): New routine. Detect all contexts that require
+       transient variable export to the outer finalizer due to a potential
+       exception.
+
 2012-06-12  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch12.adb: Small adjustment.
index 01037a5c0052e64329a6cc6fd0e30a7cd9aacfb6..c69857a8bdd59e18b5ed3911a2f10caeea0f26e1 100644 (file)
@@ -2671,7 +2671,7 @@ package Einfo is
 --       appropriate external name for use by the linker.
 
 --    Is_Protected_Record_Type (synthesized)
---       Applies to all entities, true if Is_Concurrent_Record_Type
+--       Applies to all entities, true if Is_Concurrent_Record_Type is true and
 --       Corresponding_Concurrent_Type is a protected type.
 
 --    Is_Pure (Flag44)
index f42cb814202692b0c4c68d2635e456273091ff1b..e9daade23adab1e3fedf13e9ca784fd712b61fef 100644 (file)
@@ -4327,10 +4327,47 @@ package body Exp_Ch7 is
          Last_Object  : Node_Id;
          Related_Node : Node_Id)
       is
-         Requires_Hooking : constant Boolean :=
-                              Nkind_In (N, N_Function_Call,
-                                           N_Procedure_Call_Statement);
+         function Requires_Hooking return Boolean;
+         --  Determine whether the context requires transient variable export
+         --  to the outer finalizer. This scenario arises when the context may
+         --  raise an exception.
 
+         ----------------------
+         -- Requires_Hooking --
+         ----------------------
+
+         function Requires_Hooking return Boolean is
+            function Is_Subprogram_Call (Nod : Node_Id) return Boolean;
+            --  Determine whether a particular node is a procedure of function
+            --  call.
+
+            ------------------------
+            -- Is_Subprogram_Call --
+            ------------------------
+
+            function Is_Subprogram_Call (Nod : Node_Id) return Boolean is
+            begin
+               return
+                 Nkind_In (Nod, N_Function_Call, N_Procedure_Call_Statement);
+            end Is_Subprogram_Call;
+
+         --  Start of processing for Requires_Hooking
+
+         begin
+            --  The context is either a procedure or function call or an object
+            --  declaration initialized by such a call. In all these cases, the
+            --  calls are assumed to raise an exception.
+
+            return
+              Is_Subprogram_Call (N)
+                or else
+                  (Nkind (N) = N_Object_Declaration
+                     and then Is_Subprogram_Call (Expression (N)));
+         end Requires_Hooking;
+
+         --  Local variables
+
+         Must_Hook : constant Boolean := Requires_Hooking;
          Built     : Boolean := False;
          Desig_Typ : Entity_Id;
          Fin_Block : Node_Id;
@@ -4395,7 +4432,7 @@ package body Exp_Ch7 is
                --  enclosing sequence of statements where their corresponding
                --  "hooks" are picked up by the finalization machinery.
 
-               if Requires_Hooking then
+               if Must_Hook then
                   declare
                      Expr   : Node_Id;
                      Ptr_Id : Entity_Id;
@@ -4470,7 +4507,7 @@ package body Exp_Ch7 is
                --  Generate:
                --    Temp := null;
 
-               if Requires_Hooking then
+               if Must_Hook then
                   Append_To (Stmts,
                     Make_Assignment_Statement (Loc,
                       Name       => New_Reference_To (Temp_Id, Loc),