Commit efaa616e by Eric Botcazou Committed by Eric Botcazou

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
parent 2655f1c6
2006-09-13 Eric Botcazou <ebotcazou@adacore.com> 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 PR ada/21952
* gigi.h (gnat_internal_attribute_table): Declare. * gigi.h (gnat_internal_attribute_table): Declare.
* misc.c (LANG_HOOKS_ATTRIBUTE_TABLE): Define to above. * misc.c (LANG_HOOKS_ATTRIBUTE_TABLE): Define to above.
......
...@@ -5659,10 +5659,12 @@ components_to_record (tree gnu_record_type, Node_Id component_list, ...@@ -5659,10 +5659,12 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
= TYPE_SIZE_UNIT (gnu_record_type); = 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), components_to_record (gnu_variant_type, Component_List (variant),
NULL_TREE, packed, definition, NULL_TREE, packed, definition,
&gnu_our_rep_list, !all_rep_and_size, all_rep, &gnu_our_rep_list, !all_rep_and_size, all_rep,
false, unchecked_union); true, unchecked_union);
gnu_qual = choices_to_gnu (gnu_discriminant, gnu_qual = choices_to_gnu (gnu_discriminant,
Discrete_Choices (variant)); Discrete_Choices (variant));
...@@ -5676,6 +5678,13 @@ components_to_record (tree gnu_record_type, Node_Id component_list, ...@@ -5676,6 +5678,13 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
gnu_field = TYPE_FIELDS (gnu_variant_type); gnu_field = TYPE_FIELDS (gnu_variant_type);
else 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_field = create_field_decl (gnu_inner_name, gnu_variant_type,
gnu_union_type, 0, gnu_union_type, 0,
(all_rep_and_size (all_rep_and_size
...@@ -5695,12 +5704,6 @@ components_to_record (tree gnu_record_type, Node_Id component_list, ...@@ -5695,12 +5704,6 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
gnu_variant_list = gnu_field; 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. */ /* Only make the QUAL_UNION_TYPE if there are any non-empty variants. */
if (gnu_variant_list) if (gnu_variant_list)
{ {
......
2006-09-13 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/unchecked_union.ads: New test.
2006-09-13 Richard Sandiford <richard@codesourcery.com> 2006-09-13 Richard Sandiford <richard@codesourcery.com>
PR rtl-optimization/28982 PR rtl-optimization/28982
-- 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment