mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 02:54:30 +08:00
re PR ada/28591 (ICE in splice_child_die, at dwarf2out.c:5513)
PR ada/28591 * decl.c (components_to_record): Defer emitting debug info for the record type associated with the variant until after we are sure to actually use it. From-SVN: r116928
This commit is contained in:
parent
2655f1c6dd
commit
efaa616eeb
@ -1,3 +1,10 @@
|
||||
2006-09-13 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR ada/28591
|
||||
* decl.c (components_to_record): Defer emitting debug info for the
|
||||
record type associated with the variant until after we are sure to
|
||||
actually use it.
|
||||
|
||||
2006-09-13 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR ada/21952
|
||||
|
@ -5659,10 +5659,12 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
|
||||
= TYPE_SIZE_UNIT (gnu_record_type);
|
||||
}
|
||||
|
||||
/* Create the record for the variant. Note that we defer emitting
|
||||
debug info for it until after we are sure to actually use it. */
|
||||
components_to_record (gnu_variant_type, Component_List (variant),
|
||||
NULL_TREE, packed, definition,
|
||||
&gnu_our_rep_list, !all_rep_and_size, all_rep,
|
||||
false, unchecked_union);
|
||||
true, unchecked_union);
|
||||
|
||||
gnu_qual = choices_to_gnu (gnu_discriminant,
|
||||
Discrete_Choices (variant));
|
||||
@ -5676,6 +5678,13 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
|
||||
gnu_field = TYPE_FIELDS (gnu_variant_type);
|
||||
else
|
||||
{
|
||||
/* Emit debug info for the record. We used to throw away
|
||||
empty records but we no longer do that because we need
|
||||
them to generate complete debug info for the variant;
|
||||
otherwise, the union type definition will be lacking
|
||||
the fields associated with these empty variants. */
|
||||
write_record_type_debug_info (gnu_variant_type);
|
||||
|
||||
gnu_field = create_field_decl (gnu_inner_name, gnu_variant_type,
|
||||
gnu_union_type, 0,
|
||||
(all_rep_and_size
|
||||
@ -5695,12 +5704,6 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
|
||||
gnu_variant_list = gnu_field;
|
||||
}
|
||||
|
||||
/* We used to delete the empty variants from the end. However,
|
||||
we no longer do that because we need them to generate complete
|
||||
debugging information for the variant record. Otherwise,
|
||||
the union type definition will be missing the fields associated
|
||||
to these empty variants. */
|
||||
|
||||
/* Only make the QUAL_UNION_TYPE if there are any non-empty variants. */
|
||||
if (gnu_variant_list)
|
||||
{
|
||||
|
@ -1,3 +1,7 @@
|
||||
2006-09-13 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/specs/unchecked_union.ads: New test.
|
||||
|
||||
2006-09-13 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
PR rtl-optimization/28982
|
||||
|
20
gcc/testsuite/gnat.dg/specs/unchecked_union.ads
Normal file
20
gcc/testsuite/gnat.dg/specs/unchecked_union.ads
Normal file
@ -0,0 +1,20 @@
|
||||
-- PR ada/28591
|
||||
-- Reported by Martin Michlmayr <tbm@cyrius.com>
|
||||
|
||||
-- { dg-do compile }
|
||||
-- { dg-options "-g" }
|
||||
|
||||
with Interfaces; use Interfaces;
|
||||
|
||||
package Unchecked_Union is
|
||||
type Mode_Type is (Mode_B2);
|
||||
|
||||
type Value_Union (Mode : Mode_Type := Mode_B2) is record
|
||||
case Mode is
|
||||
when Mode_B2 =>
|
||||
B2 : Integer_32;
|
||||
end case;
|
||||
end record;
|
||||
pragma Unchecked_Union (Value_Union);
|
||||
|
||||
end Unchecked_Union;
|
Loading…
Reference in New Issue
Block a user