[multiple changes]

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
This commit is contained in:
Arnaud Charlet 2012-06-12 13:02:08 +02:00
parent 7c4d75bfb5
commit 9b168a8bd3
3 changed files with 51 additions and 6 deletions

View 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.

View 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)

View 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),