With this patch the compiler rejects properly a discrete range in a loop specification that uses 'length by mistake.
Compiler lab4.adb must yield: lab4.adb:13:23: expect attribute "range" --- package body lab4 is procedure createArray (myArr : in out dynArray; maxIndex : Integer) is tempArr : dynArray (1..maxIndex); cntArr : integer :=0; begin for i in tempArr'length loop tempArr(cntArr):= cntArr; cntArr := cntArr+1; end loop; end createArray; end lab4; --- package lab4 is Type Node; Type Tree is access Node; Type Node is record Val : Integer; Left, Right : Tree; end record; type dynArray is array (positive range <>) of Integer; -- typeset for array procedure createArray (myArr : in out dynArray; maxIndex : Integer); end lab4; Tested on x86_64-pc-linux-gnu, committed on trunk 2014-07-31 Ed Schonberg <schonb...@adacore.com> * sem_ch3.adb (Make_Index): Reject properly the use of 'Length in a discrete range, when 'range was probably intended.
Index: sem_ch3.adb =================================================================== --- sem_ch3.adb (revision 213338) +++ sem_ch3.adb (working copy) @@ -17285,10 +17285,16 @@ elsif Nkind (N) = N_Attribute_Reference then - -- The parser guarantees that the attribute is a RANGE attribute + -- Catch beginner's error (use of attribute other than 'Range) + if Attribute_Name (N) /= Name_Range then + Error_Msg_N ("expect attribute ''Range", N); + Set_Etype (N, Any_Type); + return; + end if; + -- If the node denotes the range of a type mark, that is also the - -- resulting type, and we do no need to create an Itype for it. + -- resulting type, and we do not need to create an Itype for it. if Is_Entity_Name (Prefix (N)) and then Comes_From_Source (N)