Skip to content

Commit

Permalink
PR ada/28591
Browse files Browse the repository at this point in the history
	* 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.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116928 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
ebotcazou committed Sep 13, 2006
1 parent 60c8389 commit 9f31d8d
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 7 deletions.
7 changes: 7 additions & 0 deletions gcc/ada/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2006-09-13 Eric Botcazou <[email protected]>

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 <[email protected]>

PR ada/21952
Expand Down
17 changes: 10 additions & 7 deletions gcc/ada/decl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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
Expand All @@ -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)
{
Expand Down
4 changes: 4 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2006-09-13 Eric Botcazou <[email protected]>

* gnat.dg/specs/unchecked_union.ads: New test.

2006-09-13 Richard Sandiford <[email protected]>

PR rtl-optimization/28982
Expand Down
20 changes: 20 additions & 0 deletions gcc/testsuite/gnat.dg/specs/unchecked_union.ads
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-- PR ada/28591
-- Reported by Martin Michlmayr <[email protected]>

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

0 comments on commit 9f31d8d

Please sign in to comment.