From 66379195d6b0ec5912b032e6366820258c0e92e3 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 23 May 2012 11:23:40 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/symtab.c | 6 ++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr53161.C | 22 ++++++++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr53161.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8b601c9bf73..ee5d71801b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-05-22 Jan Hubicka + + PR middle-end/53161 + * symtab.c (symtab_register_node): Fix ordering issue. + 2012-05-22 Steven Drake * 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 1d9fdd88108..665ceae41e0 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 21f448daa52..09bc357bebf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-22 Jan Hubicka + + PR middle-end/53161 + * g++.dg/torture/pr53161.C: New testcase. + 2012-05-22 Tobias Burnus 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 00000000000..766f2942b3d --- /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 +struct data { + template + data(Y& y,R(X::*f)(A...)); +}; + +template +data make_data(Y& y,R(X::*f)(A...)) { + return data(y,f); +} + +void global(data); + +struct test { + void bar() {} + void doit() { global(make_data(*this,&test::bar)); } +}; +