[Ada] Unnesting: skip unanalyzed Component_Assocation
authorEd Schonberg <schonberg@adacore.com>
Wed, 30 May 2018 08:58:40 +0000 (08:58 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 30 May 2018 08:58:40 +0000 (08:58 +0000)
2018-05-30  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* exp_unst.adb (Visit_Node): Do not traverse a Component_Association
that has not been analyzed, as will be the case for a nested aggregate
that is expanded into individual assignments.

From-SVN: r260946

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

index b839b7a7fabcc19225ea7dea06787bf6e469afd8..1e810bbdf61fa47d2d5bea2e64a641967a64fe20 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-30  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_unst.adb (Visit_Node): Do not traverse a Component_Association
+       that has not been analyzed, as will be the case for a nested aggregate
+       that is expanded into individual assignments.
+
 2018-05-30  Justin Squirek  <squirek@adacore.com>
 
        * aspects.adb, aspects.ads: Register new aspect.
index b394f21cee8081f52896999c30a3759dd2e28530..7935306996e4ddd307a9896596d4a757d9f0aa07 100644 (file)
@@ -775,6 +775,16 @@ package body Exp_Unst is
                      end case;
                   end;
 
+               --  Component associations in aggregates are either static
+               --  or else the aggregate will be expanded into assignments,
+               --  in which case the expression is analyzed later and provides
+               --  no relevant code generation.
+
+               when N_Component_Association =>
+                  if No (Etype (Expression (N))) then
+                     return Skip;
+                  end if;
+
                --  Indexed references can be uplevel if the type isn't static
                --  and if the lower bound (or an inner bound for a multi-
                --  dimensional array) is uplevel.
@@ -1865,8 +1875,7 @@ package body Exp_Unst is
 
          begin
             if Present (STT.ARECnF)
-              and then Nkind (CTJ.N) /= N_Attribute_Reference
-              and then Nkind (CTJ.N) /= N_Handled_Sequence_Of_Statements
+              and then Nkind (CTJ.N) in N_Subprogram_Call
             then
                --  CTJ.N is a call to a subprogram which may require a pointer
                --  to an activation record. The subprogram containing the call