]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR ada/28591 (ICE in splice_child_die, at dwarf2out.c:5513)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 13 Sep 2006 18:40:26 +0000 (18:40 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 13 Sep 2006 18:40:26 +0000 (18:40 +0000)
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

gcc/ada/ChangeLog
gcc/ada/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/unchecked_union.ads [new file with mode: 0644]

index fd8318b73f16004af2566710d5f63dd216f3005d..60fbf113820785e11eb1e293f603b3a77f893de0 100644 (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
index 6a8f23424c5e20198ff22c500e8114e2aff53c6c..6d70a159f3d1fb4c46547e61e34787f8f43847a8 100644 (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)
        {
index f9de5f24209929e10b6ecd13b2645d4e4c3e38a7..ae45deee4047492eb25b06f6c81c9a58a2765124 100644 (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
diff --git a/gcc/testsuite/gnat.dg/specs/unchecked_union.ads b/gcc/testsuite/gnat.dg/specs/unchecked_union.ads
new file mode 100644 (file)
index 0000000..260f781
--- /dev/null
@@ -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;