re PR c++/58201 (Undefined reference to `B::B(void const**)')
authorJan Hubicka <jh@suse.cz>
Thu, 5 Sep 2013 23:04:11 +0000 (01:04 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 5 Sep 2013 23:04:11 +0000 (23:04 +0000)
PR middle-end/58201
* cgraphunit.c (analyze_functions): Clear AUX fields
after processing; initialize assembler name has.

* g++.dg/torture/pr58201_0.C: New testcase.
* g++.dg/torture/pr58201_1.C: New testcase.
* g++.dg/torture/pr58201.h: New testcase.

From-SVN: r202298

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr58201.h [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr58201_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr58201_1.C [new file with mode: 0644]

index ce0e39d88bb6d3f02f7957fe566298fd3f985363..dd93373df5497be078d0c445c26db3496b346676 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-04  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/58201
+       * cgraphunit.c (analyze_functions): Clear AUX fields
+       after processing; initialize assembler name has.
+
 2013-09-05  Jeff Law  <law@redhat.com>
 
        * tree-ssa-threadedge.c (thread_around_empty_blocks): Renamed
index db3db4bdef7c4100de357b99097abb86aee1faf5..125fb3b587e36d223bf5f98bc270825c19e92555 100644 (file)
@@ -1064,6 +1064,8 @@ analyze_functions (void)
        }
       node->symbol.aux = NULL;
     }
+  for (;node; node = node->symbol.next)
+    node->symbol.aux = NULL;
   first_analyzed = cgraph_first_function ();
   first_analyzed_var = varpool_first_variable ();
   if (cgraph_dump_file)
@@ -1074,6 +1076,11 @@ analyze_functions (void)
   bitmap_obstack_release (NULL);
   pointer_set_destroy (reachable_call_targets);
   ggc_collect ();
+  /* Initialize assembler name hash, in particular we want to trigger C++
+     mangling and same body alias creation before we free DECL_ARGUMENTS
+     used by it.  */
+  if (!seen_error ())
+  symtab_initialize_asm_name_hash ();
 }
 
 /* Translate the ugly representation of aliases as alias pairs into nice
index 3cf244bd78630c8ff7a0dc77d9a1a7a6f24a8218..4f6d88e0d6b98611b5dd40b55d86a37ef20f36fb 100644 (file)
@@ -1,3 +1,10 @@
+2013-09-04  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/58201
+       * g++.dg/torture/pr58201_0.C: New testcase.
+       * g++.dg/torture/pr58201_1.C: New testcase.
+       * g++.dg/torture/pr58201.h: New testcase.
+
 2013-09-05  Jan Hubicka  <jh@suse.cz>
 
        * gcc.dg/autopar/pr49960.c: Disable partial inlining
diff --git a/gcc/testsuite/g++.dg/torture/pr58201.h b/gcc/testsuite/g++.dg/torture/pr58201.h
new file mode 100644 (file)
index 0000000..6071ccd
--- /dev/null
@@ -0,0 +1,24 @@
+class A
+{
+ protected:
+  A();
+  virtual ~A();
+};
+
+class B : virtual public A
+{
+ public:
+  B();
+  virtual ~B();
+};
+
+class C
+{
+ private:
+  class C2 : public B
+   {
+   public:
+     C2();
+     virtual ~C2();
+   };
+};
diff --git a/gcc/testsuite/g++.dg/torture/pr58201_0.C b/gcc/testsuite/g++.dg/torture/pr58201_0.C
new file mode 100644 (file)
index 0000000..f8fa717
--- /dev/null
@@ -0,0 +1,9 @@
+#include "pr58201.h"    
+                    
+C::C2::C2(){ }      
+C::C2::~C2() { }    
+                    
+int main ()         
+{                   
+    return 0;       
+}  
diff --git a/gcc/testsuite/g++.dg/torture/pr58201_1.C b/gcc/testsuite/g++.dg/torture/pr58201_1.C
new file mode 100644 (file)
index 0000000..132cd5a
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+/* { dg-additional-sources "pr58201_0.C" } */
+#include "pr58201.h"
+
+A::A() { }
+A::~A() { }
+B::B() { }
+B::~B() { }
+