[Ada] Missing dereference in bound of slice in element iterator
authorEd Schonberg <schonberg@adacore.com>
Thu, 12 Dec 2019 10:03:39 +0000 (10:03 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 12 Dec 2019 10:03:39 +0000 (10:03 +0000)
2019-12-12  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch5.adb: (Analyze_Iterator_Specification): If the
iteration is over a slice, complete the resolution of its
bounds, which may be aebitrary expressions. The previous
pre-analysis may have created itypes for the slice but has not
performed the expansion that for example may introduce actions
that specify explicit dereferences and run-time checks.

From-SVN: r279302

gcc/ada/ChangeLog
gcc/ada/sem_ch5.adb

index d859109a030d449a63e79ad7947c05109fca77df..11eca2c3dc7f530ef7b81afb1075661259521a5b 100644 (file)
@@ -1,3 +1,12 @@
+2019-12-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch5.adb: (Analyze_Iterator_Specification): If the
+       iteration is over a slice, complete the resolution of its
+       bounds, which may be aebitrary expressions. The previous
+       pre-analysis may have created itypes for the slice but has not
+       performed the expansion that for example may introduce actions
+       that specify explicit dereferences and run-time checks.
+
 2019-12-12  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch8.adb: Improve error message for dispatching subprogram
index 3abaa8dd83636dfef2218628b5f4461cfc3297f7..a65e92c0b1b99c2208d9f92c2a541b7dbb46e569 100644 (file)
@@ -2343,6 +2343,27 @@ package body Sem_Ch5 is
                Check_Reverse_Iteration (Typ);
             end if;
 
+            --  For an element iteration over a slice, we must complete
+            --  the resolution and expansion of the slice bounds. These
+            --  can be arbitrary expressions, and the preanalysis that
+            --  was performed in preparation for the iteration may have
+            --  generated an itype whose bounds must be fully expanded.
+            --  We set the parent node to provide a proper insertion
+            --  point for generated actions, if any.
+
+            if Nkind (Iter_Name) = N_Slice
+              and then Nkind (Discrete_Range (Iter_Name)) = N_Range
+              and then not Analyzed (Discrete_Range (Iter_Name))
+            then
+               declare
+                  Indx : constant Node_Id :=
+                     Entity (First_Index (Etype (Iter_Name)));
+               begin
+                  Set_Parent (Indx, Iter_Name);
+                  Resolve (Scalar_Range (Indx), Etype (Indx));
+               end;
+            end if;
+
             --  The name in the renaming declaration may be a function call.
             --  Indicate that it does not come from source, to suppress
             --  spurious warnings on renamings of parameterless functions,