exp_ch4.adb (Complete_Coextension_Finalization): Add machinery to handle the creation of finalization lists and calls for nested...
2007-04-20 Javier Miranda <miranda@adacore.com>
Hristian Kirtchev <kirtchev@adacore.com>
Bob Duff <duff@adacore.com>
* exp_ch4.adb (Complete_Coextension_Finalization): Add machinery to
handle the creation of finalization lists and calls for nested
coextensions when the root of the chains is part of a return statement.
(Inside_A_Return_Statement): New function inside Complete_Coextension_
Finalization.
(Expand_Record_Equality): Skip components that are interface types.
(Displace_Allocator_Pointer): Add missing support for interface subtypes
(Expand_N_Allocator): Replace invocation of Is_Local_Access_Discriminant
with Rewrite_Coextension. Change the condition for detecting coextension
root nodes.
(Is_Local_Access_Discriminant): Removed.
(Rewrite_Coextension): New routine which rewrites a static coextension
as a temporary and uses its unrestricted access in the construction of
the outer object.
(Complete_Coextension_Finalization): New routine. Generate finalization
attachment calls to all delayed coextensions.
(Expand_N_Allocator): Call Complete_Coextension_Finalization whenever
the allocator is not a coextension itself and has delayed coextensions.
If the current allocator is controlled, but also a coextension, delay
the generation of the finalization attachment call.
Rename local variable "Node" to "Nod" in order to avoid confusion with
"Elists.Node".
(Expand_Allocator_Expression): Call Adjust for initialized allocators of
limited types that are not inherently limited. Such an allocator is
illegal, but is generated by the expander for a return statement, to
copy the result onto the secondary stack. This is the only case where a
limited object can be copied. Generate code to displace the pointer
to the object if the qualified expression is a class-wide interface
object. Such displacement was missing and hence the copy of the object
was wrong.
(Apply_Accessibility_Check): Handle allocated objects initialized in
place.
(Displace_Allocator_Pointer): Subsidiary procedure to Expand_N_Allocator
and Expand_Allocator_Expression. Allocating class-wide interface objects
this routine displaces the pointer to the allocated object to reference
the component referencing the corresponding secondary dispatch table.
Expand_Allocator_Expression): Add missing support to allocate class-wide
interface objects initialized with a qualified expression.
(Get_Allocator_Final_List): Test for an anonymous access type that is a
function result type, and use the finalization list associated with the
function scope in that case (such an anonymous type should not be
treated like an access parameter's type).
From-SVN: r125397