sem_ch12.adb (Check_Formal_Package_Instance): Skip an internal formal entity without...
authorEd Schonberg <schonberg@adacore.com>
Wed, 12 Oct 2016 10:40:37 +0000 (10:40 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 12 Oct 2016 10:40:37 +0000 (12:40 +0200)
2016-10-12  Ed Schonberg  <schonberg@adacore.com>

* sem_ch12.adb (Check_Formal_Package_Instance): Skip an internal
formal entity without a parent only if the corresponding actual
entity has a different kind.
* exp_ch9.adb (Build_Class_Wide_Master): If the master is
declared locally, insert the renaming declaration after the
master declaration, to prevent access before elaboration in gigi.

From-SVN: r241029

gcc/ada/ChangeLog
gcc/ada/exp_ch9.adb
gcc/ada/sem_ch12.adb

index ad188a70e1bb02c26bd3c0c23855d48cc87d4261..87a5447d79a052bc1af4c285f3f7324822c297e9 100644 (file)
@@ -1,3 +1,12 @@
+2016-10-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch12.adb (Check_Formal_Package_Instance): Skip an internal
+       formal entity without a parent only if the corresponding actual
+       entity has a different kind.
+       * exp_ch9.adb (Build_Class_Wide_Master): If the master is
+       declared locally, insert the renaming declaration after the
+       master declaration, to prevent access before elaboration in gigi.
+
 2016-10-12  Ed Schonberg  <schonberg@adacore.com>
 
        * contracts.adb (Analyze_Contracts): For a type declaration, analyze
index 6c572cef3eaeacf70cea6d736e010c2d79fa1706..22373ddaa57607cf8732f94a63297aae666158cb 100644 (file)
@@ -1107,6 +1107,7 @@ package body Exp_Ch9 is
    procedure Build_Class_Wide_Master (Typ : Entity_Id) is
       Loc          : constant Source_Ptr := Sloc (Typ);
       Master_Id    : Entity_Id;
+      Master_Decl  : Node_Id;
       Master_Scope : Entity_Id;
       Name_Id      : Node_Id;
       Related_Node : Node_Id;
@@ -1146,13 +1147,12 @@ package body Exp_Ch9 is
       --  the second transient scope requires a _master, it cannot use the one
       --  already declared because the entity is not visible.
 
-      Name_Id := Make_Identifier (Loc, Name_uMaster);
+      Name_Id     := Make_Identifier (Loc, Name_uMaster);
+      Master_Decl := Empty;
 
       if not Has_Master_Entity (Master_Scope)
         or else No (Current_Entity_In_Scope (Name_Id))
       then
-         declare
-            Master_Decl : Node_Id;
          begin
             Set_Has_Master_Entity (Master_Scope);
 
@@ -1214,7 +1214,17 @@ package body Exp_Ch9 is
           Subtype_Mark        => New_Occurrence_Of (Standard_Integer, Loc),
           Name                => Name_Id);
 
-      Insert_Action (Related_Node, Ren_Decl);
+      --  If the master is declared locally, add the renaming declaration
+      --  immediately after it, to prevent access-before-elaboration in the
+      --  back-end.
+
+      if Present (Master_Decl) then
+         Insert_After (Master_Decl, Ren_Decl);
+         Analyze (Ren_Decl);
+
+      else
+         Insert_Action (Related_Node, Ren_Decl);
+      end if;
 
       Set_Master_Id (Typ, Master_Id);
    end Build_Class_Wide_Master;
index efeaf4f661c7087be90f74c684adae998c345c66..ed5e948377fcaae259553bf4e3338e161d043a51 100644 (file)
@@ -5989,7 +5989,7 @@ package body Sem_Ch12 is
          --  itypes and predefined operators (concatenation for arrays, eg).
          --  Skip it and keep the formal entity to find a later match for it.
 
-         elsif No (Parent (E2)) then
+         elsif No (Parent (E2)) and then Ekind (E1) /= Ekind (E2) then
             E1 := Prev_E1;
             goto Next_E;