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

This happens for example in the others choice of a 1-dimensional array:

   A : array (1 .. Length) of Integer
         := (others => for Each in 1 .. Length => Each);

or when it is used without parentheses for the array component of a record.

gcc/ada/ChangeLog:

        PR ada/112524
        PR ada/113781
        * par-ch4.adb (P_Primary) <Tok_For>: Give an error about missing
        parentheses in the (purported) iterated component case too.
        (P_Unparen_Cond_Expr_Etc): Likewise.
        * sem.adb (Analyze): Raise PE on N_Iterated_Component_Association.
        * sem_util.ads (Diagnose_Iterated_Component_Association): Delete.
        * sem_util.adb (Diagnose_Iterated_Component_Association): Likewise.

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

---
 gcc/ada/par-ch4.adb  | 22 ++++++++++++++++++----
 gcc/ada/sem.adb      | 10 +---------
 gcc/ada/sem_util.adb | 41 -----------------------------------------
 gcc/ada/sem_util.ads |  4 ----
 4 files changed, 19 insertions(+), 58 deletions(-)

diff --git a/gcc/ada/par-ch4.adb b/gcc/ada/par-ch4.adb
index e76b0d8bea6..c66f5367504 100644
--- a/gcc/ada/par-ch4.adb
+++ b/gcc/ada/par-ch4.adb
@@ -3083,7 +3083,7 @@ package body Ch4 is
                   return P_Identifier;
                end if;
 
-            --  For [all | some]  indicates a quantified expression
+            --  Quantified expression or iterated component association
 
             when Tok_For =>
                if Token_Is_At_Start_Of_Line then
@@ -3103,9 +3103,18 @@ package body Ch4 is
                           ("quantified expression must be parenthesized",
                            Sloc (Node1));
                      end if;
+
+                  --  If no quantifier keyword, this is an iterated component
+                  --  in an aggregate or an ill-formed quantified expression.
+
                   else
                      Restore_Scan_State (Scan_State);  -- To FOR
                      Node1 := P_Iterated_Component_Association;
+
+                     if not (Lparen and then Token = Tok_Right_Paren) then
+                        Error_Msg
+                          ("construct must be parenthesized", Sloc (Node1));
+                     end if;
                   end if;
 
                   return Node1;
@@ -3983,12 +3992,17 @@ package body Ch4 is
                  ("quantified expression must be parenthesized!", Result);
             end if;
 
-         else
-            --  If no quantifier keyword, this is an iterated component in
-            --  an aggregate.
+         --  If no quantifier keyword, this is an iterated component in
+         --  an aggregate or an ill-formed quantified expression.
 
+         else
             Restore_Scan_State (Scan_State);
             Result := P_Iterated_Component_Association;
+
+            if not (Lparen and then Token = Tok_Right_Paren) then
+               Error_Msg_N
+                 ("construct must be parenthesized!", Result);
+            end if;
          end if;
 
       --  Declare expression
diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb
index c6d65ea713a..d93e177c765 100644
--- a/gcc/ada/sem.adb
+++ b/gcc/ada/sem.adb
@@ -680,15 +680,6 @@ package body Sem is
          =>
             null;
 
-         --  A quantified expression with a missing "all" or "some" qualifier
-         --  looks identical to an iterated component association. By language
-         --  definition, the latter must be present within array aggregates. If
-         --  this is not the case, then the iterated component association is
-         --  really an illegal quantified expression. Diagnose this scenario.
-
-         when N_Iterated_Component_Association =>
-            Diagnose_Iterated_Component_Association (N);
-
          when N_Iterated_Element_Association =>
             null;   --  May require a more precise error if misplaced.
 
@@ -742,6 +733,7 @@ package body Sem is
             | N_Function_Specification
             | N_Generic_Association
             | N_Index_Or_Discriminant_Constraint
+            | N_Iterated_Component_Association
             | N_Iteration_Scheme
             | N_Mod_Clause
             | N_Modular_Type_Definition
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index b1b3891dd65..a7869397bfc 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -7167,47 +7167,6 @@ package body Sem_Util is
       end if;
    end Designate_Same_Unit;
 
-   ---------------------------------------------
-   -- Diagnose_Iterated_Component_Association --
-   ---------------------------------------------
-
-   procedure Diagnose_Iterated_Component_Association (N : Node_Id) is
-      Def_Id : constant Entity_Id := Defining_Identifier (N);
-      Aggr   : Node_Id;
-
-   begin
-      --  Determine whether the iterated component association appears within
-      --  an aggregate. If this is the case, raise Program_Error because the
-      --  iterated component association cannot be left in the tree as is and
-      --  must always be processed by the related aggregate.
-
-      Aggr := N;
-      while Present (Aggr) loop
-         if Nkind (Aggr) = N_Aggregate then
-            raise Program_Error;
-
-         --  Prevent the search from going too far
-
-         elsif Is_Body_Or_Package_Declaration (Aggr) then
-            exit;
-         end if;
-
-         Aggr := Parent (Aggr);
-      end loop;
-
-      --  At this point it is known that the iterated component association is
-      --  not within an aggregate. This is really a quantified expression with
-      --  a missing "all" or "some" quantifier.
-
-      Error_Msg_N ("missing quantifier", Def_Id);
-
-      --  Rewrite the iterated component association as True to prevent any
-      --  cascaded errors.
-
-      Rewrite (N, New_Occurrence_Of (Standard_True, Sloc (N)));
-      Analyze (N);
-   end Diagnose_Iterated_Component_Association;
-
    ------------------------
    -- Discriminated_Size --
    ------------------------
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 2f1d2574d37..2b9ba5f494c 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -705,10 +705,6 @@ package Sem_Util is
    --  these names is supposed to be a selected component name, an expanded
    --  name, a defining program unit name or an identifier.
 
-   procedure Diagnose_Iterated_Component_Association (N : Node_Id);
-   --  Emit an error if iterated component association N is actually an illegal
-   --  quantified expression lacking a quantifier.
-
    function Discriminated_Size (Comp : Entity_Id) return Boolean;
    --  If a component size is not static then a warning will be emitted
    --  in Ravenscar or other restricted contexts. When a component is non-
-- 
2.43.0

Reply via email to