Penultimate array index retrieval
Suppose the following generic procedure to print the elements of an array indexed by a discreet type (note the slight logic added to prevent the printing of an extra
, past the end of the last element):
with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure Array_Printer is generic type Index is (<>); type Int_Array is array (Index range <>) of Integer; procedure Print(IA: Int_Array); procedure Print(IA: Int_Array) is -- Penultimate: Index := Index'Pred(IA'Last); -- raises CONSTRAINT_ERROR for IA'Length = 1 begin Put("["); for I in IA'First .. Index'Pred(IA'Last) loop Put(IA(I), 0);Put(","); end loop; Put(IA(IA'Last), 0); Put("]"); end Print; type Int_Array is array(Positive range <>) of Integer; IA: Int_Array := (-3, -2, -1, 0, 1, 2, 3); IA2: Int_Array := (1 => 0); procedure Print_Int_Array is new Print(Index => Positive, Int_Array => Int_Array); begin Print_Int_Array(IA); end Array_Printer;
When this procedure runs with an array of
length > 1 (e.g.
IA) it correctly prints the array (
[-3,-2,-1,0,1,2,3]). However, when it is given an array of
length = 1 (e.g.
IA2) then, perhaps surprisingly, the penultimate index calculation in the for-loop doesn't raise a
CONSTRAINT_ERROR (due to a predecessor not existing) and the expected result (
) gets printed.
When that calculation is done elsewhere however (e.g. in the declarative section of the procedure) then that exception is raised, indeed.
Is the compiler smart enough to figure-out there's only one element in the array and hence generates a null range for the for loop?
Gnatstudio seems to be invoking
-cargs -g -O0
Any thoughts? - Thanks