re PR tree-optimization/43801 (error: function causes a section type conflict with...
authorJakub Jelinek <jakub@redhat.com>
Tue, 29 Jun 2010 19:46:05 +0000 (21:46 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 29 Jun 2010 19:46:05 +0000 (21:46 +0200)
PR tree-optimization/43801
* cgraph.c (cgraph_create_virtual_clone): Clear DECL_SECTION_NAME
if old_decl was DECL_ONE_ONLY.

* g++.dg/torture/pr43801.C: New test.

From-SVN: r161564

gcc/ChangeLog
gcc/cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr43801.C [new file with mode: 0644]

index f80c207f761df287de503daa91be870e8b40eda2..11d901d8f616f71a89599cc0d4695cfb196d2fb9 100644 (file)
@@ -1,5 +1,9 @@
 2010-06-29  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/43801
+       * cgraph.c (cgraph_create_virtual_clone): Clear DECL_SECTION_NAME
+       if old_decl was DECL_ONE_ONLY.
+
        PR debug/44668
        * dwarf2out.c (add_accessibility_attribute): New function.
        (gen_subprogram_die, gen_variable_die, gen_field_die): Use it
index b63bf314a1290a9e9cd12999e8364252a3adc6be..aaa50b607d26eb45d194caa482eea480d05b8be5 100644 (file)
@@ -2217,6 +2217,8 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node,
      ??? We cannot use COMDAT linkage because there is no
      ABI support for this.  */
   DECL_EXTERNAL (new_node->decl) = 0;
+  if (DECL_ONE_ONLY (old_decl))
+    DECL_SECTION_NAME (new_node->decl) = NULL;
   DECL_COMDAT_GROUP (new_node->decl) = 0;
   TREE_PUBLIC (new_node->decl) = 0;
   DECL_COMDAT (new_node->decl) = 0;
index fa8f96bbfacfe3421a1a10bfc01507d6b87adc77..9fbbaf43b93c726988361b8cf622b54e45a3af9b 100644 (file)
@@ -1,5 +1,8 @@
 2010-06-29  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/43801
+       * g++.dg/torture/pr43801.C: New test.
+
        PR debug/44668
        * g++.dg/debug/dwarf2/accessibility1.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/torture/pr43801.C b/gcc/testsuite/g++.dg/torture/pr43801.C
new file mode 100644 (file)
index 0000000..3b52d4a
--- /dev/null
@@ -0,0 +1,22 @@
+// PR tree-optimization/43801
+// { dg-do compile }
+// { dg-options "-fipa-cp -fipa-cp-clone" }
+
+struct A
+{
+  virtual void f (int);
+};
+struct B : virtual A
+{
+  virtual void f (int i) { if (i) A::f(0); }
+};
+struct C : virtual B
+{
+  virtual void f (int) { B::f(0); }
+};
+
+void
+foo ()
+{
+  C ();
+}