re PR lto/44950 (ICE in dwarf2out_finish, at dwarf2out.c:22271)
authorRichard Guenther <rguenther@suse.de>
Mon, 18 Oct 2010 10:54:18 +0000 (10:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Oct 2010 10:54:18 +0000 (10:54 +0000)
2010-10-18  Richard Guenther  <rguenther@suse.de>

PR lto/44950
* tree.c (free_lang_data_in_decl): As we clear TYPE_METHODS
also clear references to entries of it.

* g++.dg/lto/20101015-2_0.C: New testcase.

From-SVN: r165629

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/20101015-2_0.C [new file with mode: 0644]
gcc/tree.c

index 74d2eef..244d20b 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-18  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/44950
+       * tree.c (free_lang_data_in_decl): As we clear TYPE_METHODS
+       also clear references to entries of it.
+
 2010-10-18  Andi Kleen  <ak@linux.intel.com>
 
        PR other/43448
index f7f964b..fd169c8 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-18  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/44950
+       * g++.dg/lto/20101015-2_0.C: New testcase.
+
 2010-10-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/46019
diff --git a/gcc/testsuite/g++.dg/lto/20101015-2_0.C b/gcc/testsuite/g++.dg/lto/20101015-2_0.C
new file mode 100644 (file)
index 0000000..9015f53
--- /dev/null
@@ -0,0 +1,6 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto } { -g -flto } } }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+struct Base { ~Base (); };
+void fun(void) { struct Deriv : Base { } x; }
index c0de77c..6d1b5a4 100644 (file)
@@ -4510,6 +4510,15 @@ free_lang_data_in_decl (tree decl)
       /* DECL_SAVED_TREE holds the GENERIC representation for DECL.
         At this point, it is not needed anymore.  */
       DECL_SAVED_TREE (decl) = NULL_TREE;
+
+      /* Clear the abstract origin if it refers to a method.  Otherwise
+         dwarf2out.c will ICE as we clear TYPE_METHODS and thus the
+        origin will not be output correctly.  */
+      if (DECL_ABSTRACT_ORIGIN (decl)
+         && DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl))
+         && RECORD_OR_UNION_TYPE_P
+              (DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl))))
+       DECL_ABSTRACT_ORIGIN (decl) = NULL_TREE;
     }
   else if (TREE_CODE (decl) == VAR_DECL)
     {