+2008-03-05 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR ada/35186
+ * decl.c (maybe_pad_type): Avoid padding an integral type when
+ bumping its alignment is sufficient.
+
2008-03-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* gnatfind.adb, gnatxref.adb: Fix argument parsing typos.
off the padding, since we will either be returning the inner type
or repadding it. If no size or alignment is specified, use that of
the original padded type. */
-
if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
{
if ((!size
is not done here (and is only valid for bitfields anyway), show the size
isn't changing. Likewise, clear the alignment if it isn't being
changed. Then return if we aren't doing anything. */
-
if (size
&& (operand_equal_p (size, orig_size, 0)
|| (TREE_CODE (orig_size) == INTEGER_CST
if (align == 0 && !size)
return type;
+ /* If no size is specified and we have an integral type, and changing
+ the alignment won't change its size, return a copy of the type
+ with the specified alignment. */
+ if (!size
+ && INTEGRAL_TYPE_P (type)
+ && host_integerp (orig_size, 1)
+ && (TREE_INT_CST_LOW (orig_size) % align) == 0)
+ {
+ type = copy_type (type);
+ TYPE_ALIGN (type) = align;
+ return type;
+ }
+
/* We used to modify the record in place in some cases, but that could
generate incorrect debugging information. So make a new record
type and name. */
--- /dev/null
+-- { dg-do compile }
+
+package Pack33 is
+
+ Bits : constant := 33;
+
+ type Bits_33 is mod 2 ** Bits;
+ for Bits_33'Size use Bits;
+
+ type Cluster is record
+ E0, E1, E2, E3, E4, E5, E6, E7 : Bits_33;
+ end record;
+
+ for Cluster use record
+ E0 at 0 range 0 * Bits .. 0 * Bits + Bits - 1;
+ E1 at 0 range 1 * Bits .. 1 * Bits + Bits - 1;
+ E2 at 0 range 2 * Bits .. 2 * Bits + Bits - 1;
+ E3 at 0 range 3 * Bits .. 3 * Bits + Bits - 1;
+ E4 at 0 range 4 * Bits .. 4 * Bits + Bits - 1;
+ E5 at 0 range 5 * Bits .. 5 * Bits + Bits - 1;
+ E6 at 0 range 6 * Bits .. 6 * Bits + Bits - 1;
+ E7 at 0 range 7 * Bits .. 7 * Bits + Bits - 1;
+ end record;
+
+ for Cluster'Size use Bits * 8;
+
+end Pack33;