decl.c (components_to_record): Do not reuse the empty union type if there is a representation clause on the record.
* 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. From-SVN: r131733
This commit is contained in:
parent
255ef0345c
commit
0bf3823958
5 changed files with 43 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -6007,11 +6007,15 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
|
|||
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);
|
||||
|
||||
|
@ -6116,7 +6120,9 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -6070,6 +6070,7 @@ addressable_p (tree gnu_expr)
|
|||
case INDIRECT_REF:
|
||||
case CONSTRUCTOR:
|
||||
case STRING_CST:
|
||||
case INTEGER_CST:
|
||||
case NULL_EXPR:
|
||||
case SAVE_EXPR:
|
||||
case CALL_EXPR:
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2008-01-22 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/unchecked_union1.adb: New test.
|
||||
|
||||
2008-01-22 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
PR c++/34829:
|
||||
|
|
23
gcc/testsuite/gnat.dg/unchecked_union1.adb
Normal file
23
gcc/testsuite/gnat.dg/unchecked_union1.adb
Normal file
|
@ -0,0 +1,23 @@
|
|||
-- { 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;
|
Loading…
Add table
Reference in a new issue