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] | |
The testcase below is expected to compile and run silently. On at least
x86[_64]-linux, it raises a spurious Program_Error instead.
procedure Concat_Length is
type Byte is mod 256;
for Byte'Size use 8;
type Block is array(Byte range <>) of Integer;
C0: Block(1..7) := (others => 0);
C1: Block(8..255) := (others => 0);
C2: Block := C0 & C1;
begin
if C2'Length /= 255 then
raise Program_Error;
end if;
end;
Assembly inspection revealed that the code for the concatenation
function computes the length of the second argument using 8bit signed
arithmetic, where 255 is interpreted as -1 and the second argument is
perceived as empty (bounds 8 .. -1). This is actually very visible
from the .original tree dump, as
Concat_Length.C13b (struct concat_length__block___XUP S1,
struct concat_length__block___XUP S2)
{ ...
SAVE_EXPR < (SIGNED_8) SAVE_EXPR <S2.P_BOUNDS->UB0>
< (SIGNED_8) SAVE_EXPR < S2.P_BOUNDS->LB0>
? 0
: ((SIGNED_8) SAVE_EXPR <S2.P_BOUNDS->UB0>
- (SIGNED_8) SAVE_EXPR <S2.P_BOUNDS->LB0>) + 1>;
...
The use of signed arithmetic is forced by
Attribute_to_gnu
...
case Attr_Length:
tree gnu_compute_type
= gnat_signed_or_unsigned_type
(0, get_base_type (gnu_result_type));
This used to be required by our former mode of length computation:
/* We used to compute the length as max (hb - lb + 1, 0), [...]
and is not required anymore since ...
We now compute it as (hb < lb) ? 0 : hb - lb + 1 [...]
The attached patch stops the signed arithmetic enforcement, which
fixes the test at hand. Tested on x86_64-suse-linux.
2008-04-24 Olivier Hainque <hainque@adacore.com>
ada/
* trans.c (Attribute_to_gnu) <case Attr_Length>: Length computation
doesn't require signed arithmetic anymore.
testsuite/
* gnat.dg/concat_length.adb: New test.
A problem remains after that, still: our length computation over a
8bit index type doesn't work, even unsigned, for the widest possible
array (bounds 0 .. 255), as the length (256) doesn't fit the
result/computation type.
The more general issue here is the choice of an inappropriate type by
the front-end for the attribute reference node. This will be addressed
separately.
Attachment:
concat_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] |