aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-05-23 11:23:40 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2012-05-23 09:23:40 +0000
commit66379195d6b0ec5912b032e6366820258c0e92e3 (patch)
tree4986305f859a5ad3363c50db643ae1108d0ee0e4
parentb8ce6b9cc0db94756438606b8bae88d14f14f668 (diff)
downloadgcc-66379195d6b0ec5912b032e6366820258c0e92e3.zip
gcc-66379195d6b0ec5912b032e6366820258c0e92e3.tar.gz
gcc-66379195d6b0ec5912b032e6366820258c0e92e3.tar.bz2
re PR middle-end/53161 (ICE with weakref function and a function which takes vector types)
PR middle-end/53161 * symtab.c (symtab_register_node): Fix ordering issue. From-SVN: r187798
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/symtab.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr53161.C22
4 files changed, 36 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8b601c9..ee5d718 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-22 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/53161
+ * symtab.c (symtab_register_node): Fix ordering issue.
+
2012-05-22 Steven Drake <sbd@NetBSD.org>
* gcc.c (do_spec_1): Add %M spec token to output multilib_os_dir.
diff --git a/gcc/symtab.c b/gcc/symtab.c
index 1d9fdd8..665ceae 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -177,11 +177,13 @@ symtab_register_node (symtab_node node)
if (*slot == NULL)
*slot = node;
- insert_to_assembler_name_hash (node);
+ ipa_empty_ref_list (&node->symbol.ref_list);
node->symbol.order = symtab_order++;
- ipa_empty_ref_list (&node->symbol.ref_list);
+ /* Be sure to do this last; C++ FE might create new nodes via
+ DECL_ASSEMBLER_NAME langhook! */
+ insert_to_assembler_name_hash (node);
}
/* Make NODE to be the one symtab hash is pointing to. Used when reshaping tree
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 21f448d..09bc357 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-22 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/53161
+ * g++.dg/torture/pr53161.C: New testcase.
+
2012-05-22 Tobias Burnus <burnus@net-b.de>
PR fortran/53389
diff --git a/gcc/testsuite/g++.dg/torture/pr53161.C b/gcc/testsuite/g++.dg/torture/pr53161.C
new file mode 100644
index 0000000..766f294
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr53161.C
@@ -0,0 +1,22 @@
+/* { dg-options "-std=c++11" } */
+void gg();
+static __typeof(gg) __gthrw_gg __attribute__((__weakref__("gg")));
+
+template<typename R,typename... A>
+struct data {
+ template<typename Y,typename X>
+ data(Y& y,R(X::*f)(A...));
+};
+
+template<typename Y,typename X,typename R,typename... A>
+data<R,A...> make_data(Y& y,R(X::*f)(A...)) {
+ return data<R,A...>(y,f);
+}
+
+void global(data<void>);
+
+struct test {
+ void bar() {}
+ void doit() { global(make_data(*this,&test::bar)); }
+};
+