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 ([0]
) 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 gprbuild
with -cargs -g -O0
Any thoughts? - Thanks