From c7b9d548d3533d6b48dcdfb882e5ce424f3d53c4 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Tue, 2 Aug 2011 17:00:07 +0200 Subject: [PATCH] [multiple changes] 2011-08-02 Gary Dismukes * sem_ch6.adb (Check_Conformance): Revise the check for nonconforming null exclusions to test Can_Never_Be_Null on the anonymous access types of the formals rather than testing the formals themselves. Exclude this check in cases where the Old_Formal is marked as a controlling formal, to avoid issuing spurious errors for bodies completing dispatching operations (due to the flag not getting set on controlling access formals in body specs). (Find_Corresponding_Spec): When checking full and subtype conformance of subprogram bodies in instances, pass Designated and E in that order, for consistency with the expected order of the formals (New_Id followed by Old_Id). 2011-08-02 Robert Dewar * sem_ch8.adb: Minor reformatting. From-SVN: r177172 --- gcc/ada/ChangeLog | 18 ++++++++++++++++++ gcc/ada/sem_ch6.adb | 19 +++++++++++++------ gcc/ada/sem_ch8.adb | 12 ++++++------ 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ac403b06621..02e05f9b8c4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,21 @@ +2011-08-02 Gary Dismukes + + * sem_ch6.adb (Check_Conformance): Revise the check for nonconforming + null exclusions to test Can_Never_Be_Null on the anonymous access types + of the formals rather than testing the formals themselves. Exclude this + check in cases where the Old_Formal is marked as a controlling formal, + to avoid issuing spurious errors for bodies completing dispatching + operations (due to the flag not getting set on controlling access + formals in body specs). + (Find_Corresponding_Spec): When checking full and subtype conformance of + subprogram bodies in instances, pass Designated and E in that order, for + consistency with the expected order of the formals (New_Id followed by + Old_Id). + +2011-08-02 Robert Dewar + + * sem_ch8.adb: Minor reformatting. + 2011-08-02 Ed Schonberg * sem_ch8.adb (Analyze_Subprogram_Renaming): new procedure diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 34278978c43..ca7c00519c4 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2010, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2011, 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- -- @@ -4144,14 +4144,21 @@ package body Sem_Ch6 is -- Ada 2005 (AI-231): In case of anonymous access types check -- the null-exclusion and access-to-constant attributes must - -- match. + -- match. For null exclusion, we test the types rather than the + -- formals themselves, since the attribute is only set reliably + -- on the formals in the Ada 95 case, and we exclude the case + -- where Old_Formal is marked as controlling, to avoid errors + -- when matching completing bodies with dispatching declarations + -- (access formals in the bodies aren't marked Can_Never_Be_Null). if Ada_Version >= Ada_2005 and then Ekind (Etype (Old_Formal)) = E_Anonymous_Access_Type and then Ekind (Etype (New_Formal)) = E_Anonymous_Access_Type and then - (Can_Never_Be_Null (Old_Formal) /= - Can_Never_Be_Null (New_Formal) + ((Can_Never_Be_Null (Etype (Old_Formal)) /= + Can_Never_Be_Null (Etype (New_Formal)) + and then + not Is_Controlling_Formal (Old_Formal)) or else Is_Access_Constant (Etype (Old_Formal)) /= Is_Access_Constant (Etype (New_Formal))) @@ -6250,11 +6257,11 @@ package body Sem_Ch6 is if Nkind (N) = N_Subprogram_Body and then Present (Homonym (E)) - and then not Fully_Conformant (E, Designator) + and then not Fully_Conformant (Designator, E) then goto Next_Entity; - elsif not Subtype_Conformant (E, Designator) then + elsif not Subtype_Conformant (Designator, E) then goto Next_Entity; end if; end if; diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index a274109b876..4a1eeddc928 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -1622,15 +1622,15 @@ package body Sem_Ch8 is -- class-wide operation whose body is a dispatching call. We replace the -- generated renaming declaration: -- - -- procedure P (X : CT) renames P; + -- procedure P (X : CT) renames P; -- -- by a different renaming and a class-wide operation: -- - -- procedure Pr (X : T) renames P; -- renames primitive operation - -- procedure P (X : CT); -- class-wide operation - -- ... - -- procedure P (X : CT) is begin Pr (X); end; -- dispatching call - + -- procedure Pr (X : T) renames P; -- renames primitive operation + -- procedure P (X : CT); -- class-wide operation + -- ... + -- procedure P (X : CT) is begin Pr (X); end; -- dispatching call + -- -- This rule only applies if there is no explicit visible class-wide -- operation at the point of the instantiation.