[Ada] Unnesting: fix handling of stubs
authorEd Schonberg <schonberg@adacore.com>
Mon, 11 Jun 2018 09:17:24 +0000 (09:17 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 11 Jun 2018 09:17:24 +0000 (09:17 +0000)
2018-06-11  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* exp_unst.adb (Search_Subprograms): Handle explicitly stubs at the top
level of a compilation unit, becuase they may contain nested
subprograms that need an activation record.

From-SVN: r261405

gcc/ada/ChangeLog
gcc/ada/exp_unst.adb

index 53934c4fcabbea1becdae912d6c8e00c9954605e..401c5d27f92ac4257dc22c2fdb3b58f1f9e60572 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-11  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_unst.adb (Search_Subprograms): Handle explicitly stubs at the top
+       level of a compilation unit, becuase they may contain nested
+       subprograms that need an activation record.
+
 2018-06-11  Arnaud Charlet  <charlet@adacore.com>
 
        * Makefile.rtl: Compile Ada files with $(ADAC) instead of $(CC).
index 3899de31c3ff881ce5bf20800a6738a992a63f0d..9ad43f497f1d40afa7d6b2cf5af921a81f261083 100644 (file)
@@ -937,7 +937,8 @@ package body Exp_Unst is
                      return Skip;
                   end if;
 
-               --  Otherwise record an uplevel reference
+               --  Otherwise record an uplevel reference in a local
+               --  identifier.
 
                when others =>
                   if Nkind (N) in N_Has_Entity
@@ -1727,6 +1728,7 @@ package body Exp_Unst is
                                            New_Occurrence_Of (Ent, Loc),
                                          Attribute_Name => Name_Address));
 
+                                 --  or else 'Access for unconstrained
                                  Insert_After (Ins, Asn);
 
                                  --  Analyze the assignment statement. We do
@@ -2072,6 +2074,13 @@ package body Exp_Unst is
       --  Tree visitor that search for outer level procedures with nested
       --  subprograms and invokes Unnest_Subprogram()
 
+      ---------------
+      -- Do_Search --
+      ---------------
+
+      procedure Do_Search is new Traverse_Proc (Search_Subprograms);
+      --  Subtree visitor instantiation
+
       ------------------------
       -- Search_Subprograms --
       ------------------------
@@ -2095,15 +2104,16 @@ package body Exp_Unst is
             end;
          end if;
 
-         return OK;
-      end Search_Subprograms;
+         --  The proper body of a stub may contain nested subprograms,
+         --  and therefore must be visited explicitly. Nested stubs are
+         --  examined recursively in Visit_Node.
 
-      ---------------
-      -- Do_Search --
-      ---------------
+         if Nkind (N) in N_Body_Stub then
+            Do_Search (Library_Unit (N));
+         end if;
 
-      procedure Do_Search is new Traverse_Proc (Search_Subprograms);
-      --  Subtree visitor instantiation
+         return OK;
+      end Search_Subprograms;
 
    --  Start of processing for Unnest_Subprograms