This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Tested on i686-linux, committed on trunk. In Ada 2005, a function may return an anonymous access type whose designated type is only visible through a limited_with_clause. This access type cannot be elaborated until the context includes a regular with_clause on the defining package. In that sense such anonymous types are akin to Taft Amendment types, and they must be handled within the package body that typically will include the required with_clause. In addition, these anonymous types must be elaborated in their scope of definition, and not in a nested scope (such as within another subprogram body). Therefore, itype references for them must be created before the rest of the package body is analyzed. The following must compile quietly: gcc -c -gnat05 p2.adb package P1 is type T1 is abstract tagged limited null record; -- function F (Self : not null access T1) return access T1'Class is abstract; end P1; -- with P1; limited with P3; package P2 is type T2 is abstract new P1.T1 with private; -- function F (Self : not null access T2) return access P1.T1'Class; -- function G (Self : not null access T2) return access P3.T3'Class is abstract; private type T2 is abstract new P1.T1 with null record; end P2; -- with P2; package P3 is type T3 is abstract new P2.T2 with null record; end P3; -- with P3; package body P2 is type T2_Access is access all T2'Class; -- function F (Self : not null access T2) return access P1.T1'Class is begin return T2_Access (Self).G; end F; end P2; This patch fixes also a problem associated with the management of private overridings. After this patch the execution of the following test is correct. -- package P is type I is interface; procedure A (X : I) is abstract; type T is new I with private; procedure A (X : T); private type T is new I with null record; procedure B (X : T); end; package P.C is type U is new T with private; private type U is new T with null record; overriding procedure B (X : U); end; package body P is procedure A (X : T) is begin B (T'Class (X)); -- redispatch end; procedure B (X : T) is begin raise Program_Error; end; end; package body P.C is procedure B (X : U) is begin null; -- OK end; end; with P.C; procedure Q is A_U : P.C.U; begin A_U.A; end; -- Command: gnatmake -gnat05 q.adb 2006-10-31 Ed Schonberg <schonberg@adacore.com> Javier Miranda <miranda@adacore.com> * sem_ch7.adb (Check_Anonymous_Access_Types): New procedure, subsidiary of Analyze_Package_Body, to create Itype references for anonymous access types created in the package declaration, whose designated types may have only a limited view. (Analyze_Package_Specification): For the private part of a nested package, install private_with_clauses of enclosing compilation unit if we are in its visible part. (Declare_Inherited_Private_Subprograms): Complete barrier to ensure that the primitive operation has an alias to some parent primitive. This is now required because, after the changes done for the implementation of abstract interfaces, the contents of the list of primitives has entities whose alias attribute references entities of such list of primitives. (Analyze_Package_Specification): Simplify code that handles parent units of instances and formal packages. (Uninstall_Declarations): Check the convention consistency among primitive overriding operations of a tagged record type.
Attachment:
difs
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |