In early versions of Ada, an illegal iterator of the form "for X in S" where
S is an array, is most likely an attempt to iterate over the range of S, and
this is the appropriate error message to emit.  In Ada 2012, there is a new
iterator specification form "for E of S", and the error message must indicate
that the new form uses a different keyword.

Compiling the following program in Ada 2012 mode must yield:

    main.adb:7:14: to iterate over the elements of an array, use "of"
    main.adb:15:14: to iterate over the elements of an array, use "of"

Compiling with an earlier version of the language must yield;

    main.adb:7:14: missing Range attribute in iteration over an array
    main.adb:15:14: missing Range attribute in iteration over an array

---
with Ada.Text_IO;
with Tools;
with Type_Declarations;
package body Main is
   procedure Process is
   begin
         for Index in Tools.Result loop
            Ada.Text_IO.Put_Line (Tools.Result (Index)'Img);
         end loop;
   end Process;

   procedure Process2 is
      Ct : constant Type_Declarations.Array_Type := Tools.Result;
   begin
         for Index in Ct loop
            Ada.Text_IO.Put_Line (Tools.Result (Index)'Img);
         end loop;
   end Process2;
end Main;
--
with Type_Declarations;

package Tools is
   function Result
      return Type_Declarations.Array_Type;
end Tools;
---
package Type_Declarations is

   type Integer_Type is new Integer;
   Ct_Max : constant := 40;

   type Large_Index_Type is new Integer range 0 .. Ct_Max;
   subtype Index_Type is Large_Index_Type range 1 .. Large_Index_Type'Last;

   type Array_Type is array (Index_Type range <>) of Integer_Type;
end Type_Declarations;

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-09-05  Ed Schonberg  <schonb...@adacore.com>

        * sem_ch5.adb (Analyze_Iteration_Specification): Improve error
        message on an iterator over an array.

Index: sem_ch5.adb
===================================================================
--- sem_ch5.adb (revision 178448)
+++ sem_ch5.adb (working copy)
@@ -2336,13 +2336,18 @@
       if Is_Array_Type (Typ) then
          if Of_Present (N) then
             Set_Etype (Def_Id, Component_Type (Typ));
+
+         elsif Ada_Version < Ada_2012 then
+            Error_Msg_N
+              ("missing Range attribute in iteration over an array", N);
+
          else
             Error_Msg_N
               ("to iterate over the elements of an array, use OF", N);
 
             --  Prevent cascaded errors
 
-            Set_Ekind (Def_Id, E_Constant);
+            Set_Ekind (Def_Id, E_Loop_Parameter);
             Set_Etype (Def_Id, Etype (First_Index (Typ)));
          end if;
 

Reply via email to