sem_ch12.ads, [...] (Instantiate_Type): If the formal is a derived type with interface progenitors use the analyzed...

2007-08-14  Ed Schonberg  <schonberg@adacore.com>
	    Gary Dismukes  <dismukes@adacore.com>
	    Thomas Quinot  <quinot@adacore.com>

	* sem_ch12.ads, sem_ch12.adb (Instantiate_Type): If the formal is a
	derived type with interface progenitors use the analyzed formal as the
	parent of the actual, to create renamings for all the inherited
	operations in Derive_Subprograms.
	(Collect_Previous_Instances): new procedure within of
	Load_Parent_Of_Generic, to instantiate all bodies in the compilation
	unit being loaded, to ensure that the generation of global symbols is
	consistent in different compilation modes.
	(Is_Tagged_Ancestor): New function testing the ancestor relation that
	takes progenitor types into account.
	(Validate_Derived_Type_Instance): Enforce the rule of 3.9.3(9) by
	traversing over the primitives of the formal and actual types to locate
	any abstract subprograms of the actual type that correspond to a
	nonabstract subprogram of the formal type's ancestor type(s), and issue
	an error if such is found.
	(Analyze_Package_Instantiation, Analyze_Subprogram_Instantiation,
	Instantiate_Package_Body, Instantiate_Subprogram_Body):
	Remove bogus guard around calls to Inherit_Context.
	(Reset_Entity): If the entity is the selector of a selected component
	that denotes a named number, propagate constant-folding to the generic
	template only if the named number is global to the generic unit.
	(Set_Instance_Env): Only reset the compilation switches when compiling
	a predefined or internal unit.

From-SVN: r127443
This commit is contained in:
Ed Schonberg 2007-08-14 10:46:18 +02:00 committed by Arnaud Charlet
parent 1d6f10a194
commit 1c0ce9d83b
2 changed files with 598 additions and 161 deletions

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -58,8 +58,7 @@ package Sem_Ch12 is
function Copy_Generic_Node
(N : Node_Id;
Parent_Id : Node_Id;
Instantiating : Boolean)
return Node_Id;
Instantiating : Boolean) return Node_Id;
-- Copy the tree for a generic unit or its body. The unit is copied
-- repeatedly: once to produce a copy on which semantic analysis of
-- the generic is performed, and once for each instantiation. The tree
@ -76,11 +75,30 @@ package Sem_Ch12 is
-- of the ancestors of a child generic that is being instantiated.
procedure Instantiate_Package_Body
(Body_Info : Pending_Body_Info;
Inlined_Body : Boolean := False);
(Body_Info : Pending_Body_Info;
Inlined_Body : Boolean := False;
Body_Optional : Boolean := False);
-- Called after semantic analysis, to complete the instantiation of
-- package instances. The flag Inlined_Body is set if the body is
-- being instantiated on the fly for inlined purposes.
--
-- The flag Body_Optional indicates that the call is for an instance
-- that precedes the current instance in the same declarative part.
-- This call is needed when instantiating a nested generic whose body
-- is to be found in the body of an instance. Normally we instantiate
-- package bodies only when they appear in the main unit, or when their
-- contents are needed for a nested generic G. If unit U contains several
-- instances I1, I2, etc. and I2 contains a nested generic, then when U
-- appears in the context of some other unit P that contains an instance
-- of G, we compile the body of I2, but not that of I1. However, when we
-- compile U as the main unit, we compile both bodies. This will lead to
-- lead to link-time errors if the compilation of I1 generates public
-- symbols, because those in I2 will receive different names in both
-- cases. This forces us to analyze the body of I1 even when U is not the
-- main unit. We don't want this additional mechanism to generate an error
-- when the body of the generic for I1 is not present, and this is the
-- reason for the presence of the flag Body_Optional, which is exchanged
-- between the current procedure and Load_Parent_Of_Generic.
procedure Instantiate_Subprogram_Body
(Body_Info : Pending_Body_Info);