The given program can be translated and run and it then produces
incorrect results (details below). Indeed, some circuits from the
GNAT front end seem to indicate an error (use debugging
switch -gnatdF to see this). Also, using -fstack-check adds
a warning that a frame is too large.

The assembly listing shows -1 off %ebp for the second
pair of assigments to Fst/Lst, this seems wrong.
The pairs of consequtive instructions correspond to
assignments in the respective blocks:

        movb    $33, -10002(%ebp)
        movb    $63, -2(%ebp)
...
        movb    $33, -1(%ebp)
        movb    $63, -1(%ebp)


$ ./too_big 
!?
??

To reproduce,
$ gnatmake -save-temps -gnata -gnato -gnatwa -S too_big.adb

with Ada.Text_IO;

procedure Too_Big is

        use Ada;

        type Big_Index is range 0 .. 2**50;

        type A is array (Big_Index range <>) of Character;

begin

        -- output is "!?"
        declare
                X: A (Big_Index range 2**40 .. 2**40 + 10_000);
                Fst: Character renames X(X'First);
                Lst: Character renames X(X'Last);
        begin
                Fst := '!';
                Lst := '?';

                Text_IO.Put(Fst);
                Text_IO.Put(Lst);
                Text_IO.New_Line;
        end;

        -- output is "??"
        declare
                X: A (Big_Index range 2**40 .. 2**48);
                Fst: Character renames X(X'First);
                Lst: Character renames X(X'Last);
        begin
                Fst := '!';
                Lst := '?';
                pragma assert(Fst = '!');

                Text_IO.Put(Fst);
                Text_IO.Put(Lst);
                Text_IO.New_Line;
        end;
end Too_Big;


-- 
           Summary: wrong code for indexed component when index subtype has
                    'Size > 32
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ada
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: bauhaus at futureapps dot de
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33994

Reply via email to