mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			sem_ch6.adb (Check_Private_Overriding): Refine the legality checks here.
2015-03-02 Bob Duff <duff@adacore.com> * sem_ch6.adb (Check_Private_Overriding): Refine the legality checks here. It used to check that the function is merely overriding SOMEthing. Now it checks that the function is overriding a corresponding public operation. This is a correction to the implementation of the rule in RM-3.9.3(10). From-SVN: r221110
This commit is contained in:
		
							parent
							
								
									5a271a7f3a
								
							
						
					
					
						commit
						acf624f280
					
				|  | @ -1,3 +1,11 @@ | |||
| 2015-03-02  Bob Duff  <duff@adacore.com> | ||||
| 
 | ||||
| 	* sem_ch6.adb (Check_Private_Overriding): Refine the legality | ||||
| 	checks here. It used to check that the function is merely | ||||
| 	overriding SOMEthing. Now it checks that the function is | ||||
| 	overriding a corresponding public operation. This is a correction | ||||
| 	to the implementation of the rule in RM-3.9.3(10). | ||||
| 
 | ||||
| 2015-03-02  Robert Dewar  <dewar@adacore.com> | ||||
| 
 | ||||
| 	* debug.adb: Document new debug flag -gnatd.1. | ||||
|  |  | |||
|  | @ -8905,6 +8905,50 @@ package body Sem_Ch6 is | |||
|          ------------------------------ | ||||
| 
 | ||||
|          procedure Check_Private_Overriding (T : Entity_Id) is | ||||
| 
 | ||||
|             function Overrides_Visible_Function return Boolean; | ||||
|             --  True if S overrides a function in the visible part. The | ||||
|             --  overridden function could be explicitly or implicitly declared. | ||||
| 
 | ||||
|             function Overrides_Visible_Function return Boolean is | ||||
|             begin | ||||
|                if not Is_Overriding or else not Has_Homonym (S) then | ||||
|                   return False; | ||||
|                end if; | ||||
| 
 | ||||
|                if not Present (Incomplete_Or_Partial_View (T)) then | ||||
|                   return True; | ||||
|                end if; | ||||
| 
 | ||||
|                --  Search through all the homonyms H of S in the current | ||||
|                --  package spec, and return True if we find one that matches. | ||||
|                --  Note that Parent (H) will be the declaration of the | ||||
|                --  Incomplete_Or_Partial_View of T for a match. | ||||
| 
 | ||||
|                declare | ||||
|                   H : Entity_Id := S; | ||||
|                begin | ||||
|                   loop | ||||
|                      H := Homonym (H); | ||||
|                      exit when not Present (H) or else Scope (H) /= Scope (S); | ||||
| 
 | ||||
|                      if Nkind_In | ||||
|                        (Parent (H), | ||||
|                         N_Private_Extension_Declaration, | ||||
|                         N_Private_Type_Declaration) | ||||
|                        and then Defining_Identifier (Parent (H)) = | ||||
|                                   Incomplete_Or_Partial_View (T) | ||||
|                      then | ||||
|                         return True; | ||||
|                      end if; | ||||
|                   end loop; | ||||
|                end; | ||||
| 
 | ||||
|                return False; | ||||
|             end Overrides_Visible_Function; | ||||
| 
 | ||||
|          --  Start of processing for Check_Private_Overriding | ||||
| 
 | ||||
|          begin | ||||
|             if Is_Package_Or_Generic_Package (Current_Scope) | ||||
|               and then In_Private_Part (Current_Scope) | ||||
|  | @ -8919,8 +8963,20 @@ package body Sem_Ch6 is | |||
|                   Error_Msg_N ("abstract subprograms must be visible " | ||||
|                                & "(RM 3.9.3(10))!", S); | ||||
| 
 | ||||
|                elsif Ekind (S) = E_Function and then not Is_Overriding then | ||||
|                   if Is_Tagged_Type (T) and then T = Base_Type (Etype (S)) then | ||||
|                elsif Ekind (S) = E_Function | ||||
|                  and then not Overrides_Visible_Function | ||||
|                then | ||||
|                   --  Here, S is "function ... return T;" declared in the | ||||
|                   --  private part, not overriding some visible operation. | ||||
|                   --  That's illegal in the tagged case (but not if the | ||||
|                   --  private type is untagged). | ||||
| 
 | ||||
|                   if ((Present (Incomplete_Or_Partial_View (T)) | ||||
|                       and then Is_Tagged_Type (Incomplete_Or_Partial_View (T))) | ||||
|                     or else (not Present (Incomplete_Or_Partial_View (T)) | ||||
|                       and then Is_Tagged_Type (T))) | ||||
|                     and then T = Base_Type (Etype (S)) | ||||
|                   then | ||||
|                      Error_Msg_N ("private function with tagged result must" | ||||
|                                   & " override visible-part function", S); | ||||
|                      Error_Msg_N ("\move subprogram to the visible part" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Bob Duff
						Bob Duff