From: hubicka Date: Wed, 23 May 2012 09:23:40 +0000 (+0000) Subject: PR middle-end/53161 X-Git-Tag: upstream/4.9.2~12520 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ad0fe105d40a529c640680aa429c4fa3db8eb8c1;p=platform%2Fupstream%2Flinaro-gcc.git PR middle-end/53161 * symtab.c (symtab_register_node): Fix ordering issue. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187798 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + + 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 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 + + 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 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 +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)); } +}; +