From: Eric Botcazou <ebotca...@adacore.com>

The resolution status of Resolve_Aggr_Expr is lost when the routine is
invoked indirectly from Resolve_Iterated_Component_Association.

gcc/ada/ChangeLog:

        * sem_aggr.adb (Resolve_Iterated_Component_Association): Change to
        function returning Boolean and return the result of the call made
        to Resolve_Aggr_Expr.
        (Resolve_Array_Aggregate): Return failure status if the call to
        Resolve_Iterated_Component_Association returns false.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/sem_aggr.adb | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb
index 9439d649f2a..b05b0b267fe 100644
--- a/gcc/ada/sem_aggr.adb
+++ b/gcc/ada/sem_aggr.adb
@@ -1646,10 +1646,11 @@ package body Sem_Aggr is
       --  node as Expr, since there is no Expression and we need a Sloc for the
       --  error message.
 
-      procedure Resolve_Iterated_Component_Association
+      function Resolve_Iterated_Component_Association
         (N         : Node_Id;
-         Index_Typ : Entity_Id);
-      --  For AI12-061
+         Index_Typ : Entity_Id) return Boolean;
+      --  For AI12-061: resolves iterated component association N of Index_Typ.
+      --  Returns False if resolution fails.
 
       function Subtract (Val : Uint; To : Node_Id) return Node_Id;
       --  Creates a new expression node where Val is subtracted to expression
@@ -2110,9 +2111,9 @@ package body Sem_Aggr is
       -- Resolve_Iterated_Component_Association --
       --------------------------------------------
 
-      procedure Resolve_Iterated_Component_Association
+      function Resolve_Iterated_Component_Association
         (N         : Node_Id;
-         Index_Typ : Entity_Id)
+         Index_Typ : Entity_Id) return Boolean
       is
          Loc  : constant Source_Ptr := Sloc (N);
          Id   : constant Entity_Id  := Defining_Identifier (N);
@@ -2217,10 +2218,6 @@ package body Sem_Aggr is
 
          Resolution_OK := Resolve_Aggr_Expr (Expr, Single_Elmt => False);
 
-         if not Resolution_OK then
-            return;
-         end if;
-
          if Operating_Mode /= Check_Semantics then
             Remove_References (Expr);
             declare
@@ -2235,6 +2232,8 @@ package body Sem_Aggr is
          end if;
 
          End_Scope;
+
+         return Resolution_OK;
       end Resolve_Iterated_Component_Association;
 
       --------------
@@ -2659,7 +2658,11 @@ package body Sem_Aggr is
          Assoc := First (Component_Associations (N));
          while Present (Assoc) loop
             if Nkind (Assoc) = N_Iterated_Component_Association then
-               Resolve_Iterated_Component_Association (Assoc, Index_Typ);
+               if not Resolve_Iterated_Component_Association
+                        (Assoc, Index_Typ)
+               then
+                  return Failure;
+               end if;
 
             elsif Nkind (Assoc) /= N_Component_Association then
                Error_Msg_N
-- 
2.43.0

Reply via email to