+2008-01-22 Eric Botcazou <ebotcazou@adacore.com>
+
+ * decl.c (components_to_record): Do not reuse the empty union type
+ if there is a representation clause on the record.
+ * trans.c (addressable_p): Return true for INTEGER_CST.
+
2008-01-21 Eric Botcazou <ebotcazou@adacore.com>
* trans.c (gnat_to_gnu) <N_Free_Statement>: Use POINTER_PLUS_EXPR
gnu_union_name = concat_id_with_name (gnu_name,
IDENTIFIER_POINTER (gnu_var_name));
- if (!gnu_field_list && TREE_CODE (gnu_record_type) == UNION_TYPE)
+ /* Reuse an enclosing union if all fields are in the variant part
+ and there is no representation clause on the record, to match
+ the layout of C unions. There is an associated check below. */
+ if (!gnu_field_list
+ && TREE_CODE (gnu_record_type) == UNION_TYPE
+ && !TYPE_PACKED (gnu_record_type))
gnu_union_type = gnu_record_type;
else
{
-
gnu_union_type
= make_node (unchecked_union ? UNION_TYPE : QUAL_UNION_TYPE);
return. */
if (gnu_union_type == gnu_record_type)
{
- gcc_assert (!gnu_field_list && unchecked_union);
+ gcc_assert (unchecked_union
+ && !gnu_field_list
+ && !gnu_our_rep_list);
return;
}
--- /dev/null
+-- { dg-do run }
+
+procedure Unchecked_Union1 is
+
+ type Bit is (Zero, One);
+
+ type U (X : Bit := Zero) is record
+ case X is
+ when Zero => I: Integer;
+ when One => F : Float;
+ end case;
+ end record;
+ for U use record
+ I at 0 range 0 .. 31;
+ F at 0 range 0 .. 31;
+ end record;
+ pragma Unchecked_Union(U);
+
+begin
+ if U'Object_Size /= 32 then
+ raise Program_Error;
+ end if;
+end;