This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
We used to compute the 'length of an array as max (hb - lb + 1, 0),
which could overflow for some cases of empty arrays, e.g. when
lb == index_type'first.
We now compute it as (hb < lb) ? 0 : hb - lb + 1, which
could overflow as well but in many less cases (of extremely large
arrays) which we never encounter in practice.
The testcase below is expected to compile and run silently:
procedure Q is
type Vector is array (Integer range <>) of Integer;
function Empty_Vector return Vector is
begin
return (2 .. Integer'First => 0);
end;
My_Vector : Vector := Empty_Vector;
My_Length : Integer := My_Vector'Length;
begin
if My_Length /= 0 then
raise Program_Error;
end if;
end;
Bootstrapped an regtested on x86_64-suse-linux.
2008-03-21 Olivier Hainque <hainque@adacore.com>
* trans.c (Attribute_to_gnu) <'length>: Compute as (hb < lb)
? 0 : hb - lb + 1 instead of max (hb - lb + 1, 0).
* gnat.dg/empty_vector_length.adb: New testcase.
Attachment:
empty_array_length.dif
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |