From: Ronan Desplanques <desplanq...@adacore.com>

Before this patch, the compiler failed to handle the case where the for loop
created by expansion of a quantified expression required cleanup handlers.

gcc/ada/

        * sem_ch5.adb (Analyze_Loop_Parameter_Specification): Fix test for
        expanded quantified expression context.
        (Is_Expanded_Quantified_Expr): New function.

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

---
 gcc/ada/sem_ch5.adb | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
index ac8cd0821ff..6a479726e86 100644
--- a/gcc/ada/sem_ch5.adb
+++ b/gcc/ada/sem_ch5.adb
@@ -2823,6 +2823,9 @@ package body Sem_Ch5 is
       --  forms. In this case it is not sufficient to check the static
       --  predicate function only, look for a dynamic predicate aspect as well.
 
+      function Is_Expanded_Quantified_Expr (N : Node_Id) return Boolean;
+      --  Return Whether N comes from the expansion of a quantified expression.
+
       procedure Process_Bounds (R : Node_Id);
       --  If the iteration is given by a range, create temporaries and
       --  assignment statements block to capture the bounds and perform
@@ -2908,6 +2911,16 @@ package body Sem_Ch5 is
          end if;
       end Check_Predicate_Use;
 
+      ---------------------------------
+      -- Is_Expanded_Quantified_Expr --
+      ---------------------------------
+
+      function Is_Expanded_Quantified_Expr (N : Node_Id) return Boolean is
+      begin
+         return Nkind (N) = N_Expression_With_Actions
+           and then Nkind (Original_Node (N)) = N_Quantified_Expression;
+      end Is_Expanded_Quantified_Expr;
+
       --------------------
       -- Process_Bounds --
       --------------------
@@ -3081,6 +3094,16 @@ package body Sem_Ch5 is
 
       DS_Copy : Node_Id;
 
+      Is_Loop_Of_Expanded_Quantified_Expr : constant Boolean :=
+        Present (Loop_Nod)
+          and then (Is_Expanded_Quantified_Expr (Parent (Loop_Nod))
+      --  We also have to consider the case where the loop was wrapped with
+      --  Wrap_Loop_Statement.
+            or else (Present (Parent (Loop_Nod))
+              and then Present (Parent (Parent (Loop_Nod)))
+              and then Is_Expanded_Quantified_Expr
+                (Parent (Parent (Parent (Loop_Nod))))));
+
    --  Start of processing for Analyze_Loop_Parameter_Specification
 
    begin
@@ -3271,10 +3294,7 @@ package body Sem_Ch5 is
         or else
           (Present (Etype (Id))
             and then Is_Itype (Etype (Id))
-            and then Present (Loop_Nod)
-            and then Nkind (Parent (Loop_Nod)) = N_Expression_With_Actions
-            and then Nkind (Original_Node (Parent (Loop_Nod))) =
-                                                   N_Quantified_Expression)
+            and then Is_Loop_Of_Expanded_Quantified_Expr)
       then
          Set_Etype (Id, Etype (DS));
       end if;
-- 
2.45.2

Reply via email to