[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 12 May 2015 15:13:06 +0000 (17:13 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 12 May 2015 15:13:06 +0000 (17:13 +0200)
2015-05-12  Ed Schonberg  <schonberg@adacore.com>

* sem_ch5.adb (Analyze_Iterator_Specifications): Additional
legality checks for array and container iterators:
a) The domain of iteration cannot be a component that depends
on discriminants of a mutable object. The check was recently
added for element iterators.
b) The cursor type cannot be a limited type at the point of the
iteration, because the cursor will be assigned to in the body
of the loop.

2015-05-12  Robert Dewar  <dewar@adacore.com>

* freeze.adb (Freeze_Record_Type): Make sure that if we have
aspect Iterator_Element, then we have either Constant_Indexing
or Variable_Indexing.

From-SVN: r223077

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

index e12294194c14e9a06b9da472a34a08fa09f66fca..045992b669689400281d701f20d1569bcaf8d856 100644 (file)
@@ -1,3 +1,20 @@
+2015-05-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch5.adb (Analyze_Iterator_Specifications): Additional
+       legality checks for array and container iterators:
+       a) The domain of iteration cannot be a component that depends
+       on discriminants of a mutable object. The check was recently
+       added for element iterators.
+       b) The cursor type cannot be a limited type at the point of the
+       iteration, because the cursor will be assigned to in the body
+       of the loop.
+
+2015-05-12  Robert Dewar  <dewar@adacore.com>
+
+       * freeze.adb (Freeze_Record_Type): Make sure that if we have
+       aspect Iterator_Element, then we have either Constant_Indexing
+       or Variable_Indexing.
+
 2015-05-12  Ed Schonberg  <schonberg@adacore.com>
 
        * a-coormu.ads, a-coormu.adb: Add Indexing aspect, Reference_Type,
index 7612c189b5c75ead426f74f8d8c523b27e9d3c43..2377c39c3d275aac6cf4c871681f3dbcc0339480 100644 (file)
@@ -4288,6 +4288,22 @@ package body Freeze is
             end if;
          end if;
 
+         --  Make sure that if we have aspect Iterator_Element, then we have
+         --  either Constant_Indexing or Variable_Indexing.
+
+         if Has_Aspect (Rec, Aspect_Iterator_Element) then
+            if Has_Aspect (Rec, Aspect_Constant_Indexing)
+                 or else
+               Has_Aspect (Rec, Aspect_Variable_Indexing)
+            then
+               null;
+            else
+               Error_Msg_N
+                 ("Iterator_Element requires indexing aspect",
+                  Find_Aspect (Rec, Aspect_Iterator_Element));
+            end if;
+         end if;
+
          --  All done if not a full record definition
 
          if Ekind (Rec) /= E_Record_Type then
index dea8acffe8e6fc5632a19bd5397af53e875ce7e1..34cc18eff4ee3ce88c633cf00012856d9a684032 100644 (file)
@@ -2088,7 +2088,7 @@ package body Sem_Ch5 is
                end;
             end if;
 
-         --  OF not present
+         --  IN iterator, domain is a range, or a call to Iterate function
 
          else
             --  For an iteration of the form IN, the name must denote an
@@ -2125,6 +2125,35 @@ package body Sem_Ch5 is
                end if;
             end if;
 
+            --  If the name is a call (typically prefixed) to some Iterate
+            --  function, it has been rewritten as an object declaration.
+            --  If that object is a selected component, verify that it is not
+            --  a component of an unconstrained mutable object.
+
+            if Nkind (Iter_Name) = N_Identifier then
+               declare
+                  Iter_Kind : constant Node_Kind :=
+                                Nkind (Original_Node (Iter_Name));
+                  Obj       : Node_Id;
+
+               begin
+                  if Iter_Kind = N_Selected_Component then
+                     Obj := Prefix (Original_Node (Iter_Name));
+
+                  elsif Iter_Kind = N_Function_Call then
+                     Obj := First_Actual (Original_Node (Iter_Name));
+                  end if;
+
+                  if Nkind (Obj) = N_Selected_Component
+                    and then Is_Dependent_Component_Of_Mutable_Object (Obj)
+                  then
+                     Error_Msg_N
+                       ("container cannot be a discriminant-dependent " &
+                          "component of a mutable object", N);
+                  end if;
+               end;
+            end if;
+
             --  The result type of Iterate function is the classwide type of
             --  the interface parent. We need the specific Cursor type defined
             --  in the container package. We obtain it by name for a predefined
@@ -2148,6 +2177,13 @@ package body Sem_Ch5 is
                   Next_Entity (Ent);
                end loop;
             end if;
+
+            --  The cursor is the target of generated assignments in the
+            --  loop, and cannot have a limited type.
+
+            if Is_Limited_Type (Etype (Def_Id)) then
+               Error_Msg_N ("cursor type cannot be limited", N);
+            end if;
          end if;
       end if;