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:
Eric Botcazou 2006-09-13 18:40:26 +00:00 committed by Eric Botcazou
parent 2655f1c6dd
commit efaa616eeb
4 changed files with 41 additions and 7 deletions

View File

@ -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

View File

@ -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)
{

View File

@ -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

View 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;