diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f8eeac0fa0c..b3194787df5 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2007-11-07 Olivier Hainque + + * decl.c (make_aligning_type): Set the mode of the RECORD_TYPE we + craft and expand comment. + 2007-11-01 Eric Botcazou * lang-specs.h: Move translation of -fRTS= after -gnatez switch. diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index 4a55947d4f7..fdb39f27630 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -5144,10 +5144,13 @@ make_aligning_type (tree type, unsigned int align, tree size, size_binop (PLUS_EXPR, room_st, voffset_st)), bitsize_unit_node); - /* Craft the GCC record representation. The sizes are set manually to - account for the maximum possible value of voffset, which avoids complex - self-references in the size expression and corresponds to what should be - "alloc"ated for this type anyway. + /* Craft the GCC record representation. We exceptionally do everything + manually here because 1) our generic circuitry is not quite ready to + handle the complex position/size expressions we are setting up, 2) we + have a strong simplifying factor at hand: we know the maximum possible + value of voffset, and 3) we have to set/reset at least the sizes in + accordance with this maximum value anyway, as we need them to convey + what should be "alloc"ated for this type. Use -1 as the 'addressable' indication for the field to prevent the creation of a bitfield. We don't need one, it would have damaging @@ -5171,6 +5174,8 @@ make_aligning_type (tree type, unsigned int align, tree size, = size_binop (PLUS_EXPR, size, size_int (room + align / BITS_PER_UNIT)); + TYPE_MODE (record_type) = BLKmode; + copy_alias_set (record_type, type); return record_type; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f33553365b0..62d9b2579e9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-11-07 Olivier Hainque + + * gnat.dg/max_align.adb: New test. + 2007-11-06 H.J. Lu PR target/30961 diff --git a/gcc/testsuite/gnat.dg/max_align.adb b/gcc/testsuite/gnat.dg/max_align.adb new file mode 100644 index 00000000000..702bbaca449 --- /dev/null +++ b/gcc/testsuite/gnat.dg/max_align.adb @@ -0,0 +1,15 @@ +-- { dg-do compile } + +procedure Max_Align is + type Block is record + X : Integer; + end record; + for Block'Alignment use Standard'Maximum_Alignment; + + type Block_Access is access Block; + Ptr : Block_Access := new Block; +begin + null; +end; + +