aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-09-06 01:04:11 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-09-05 23:04:11 +0000
commitd352b2459fa6e4d5bc320af9912769ff3416a3d5 (patch)
tree061647d592f6fd386e79ab868303b34b7d53e742
parent17796c434dc09e45dabc2b2e7c1123fffa91d9bd (diff)
downloadgcc-d352b2459fa6e4d5bc320af9912769ff3416a3d5.zip
gcc-d352b2459fa6e4d5bc320af9912769ff3416a3d5.tar.gz
gcc-d352b2459fa6e4d5bc320af9912769ff3416a3d5.tar.bz2
re PR c++/58201 (Undefined reference to `B::B(void const**)')
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraphunit.c7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/torture/pr58201.h24
-rw-r--r--gcc/testsuite/g++.dg/torture/pr58201_0.C9
-rw-r--r--gcc/testsuite/g++.dg/torture/pr58201_1.C10
6 files changed, 63 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ce0e39d..dd93373 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index db3db4b..125fb3b 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3cf244b..4f6d88e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..6071ccd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr58201.h
@@ -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
index 0000000..f8fa717
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr58201_0.C
@@ -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
index 0000000..132cd5a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr58201_1.C
@@ -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() { }
+