diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-06-30 11:40:08 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-06-30 11:40:08 +0000 |
commit | 274c15162b9b023b8569fa39481ad1a0b7ed0070 (patch) | |
tree | 7e7b4ece8e31838a9e2eee4464327af7658812f2 /gcc | |
parent | 273a94e0fa98687df97826fdaff46c29bdfa4d06 (diff) | |
download | gcc-274c15162b9b023b8569fa39481ad1a0b7ed0070.zip gcc-274c15162b9b023b8569fa39481ad1a0b7ed0070.tar.gz gcc-274c15162b9b023b8569fa39481ad1a0b7ed0070.tar.bz2 |
re PR c++/81229 (ICE in c_tree_chain_next on aarch64)
PR c++/81229
* name-lookup.c (do_pushdecl): Reset IDENTIFIER_TYPE when finding
a matching TYPE_DECL.
* g++.dg/lookup/pr81229.C: New.
From-SVN: r249835
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/pr81229.C | 7 |
4 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 40153aa..38b63e4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-06-30 Nathan Sidwell <nathan@acm.org> + + PR c++/81229 + * name-lookup.c (do_pushdecl): Reset IDENTIFIER_TYPE when finding + a matching TYPE_DECL. + 2017-06-29 Paolo Carlini <paolo.carlini@oracle.com> * class.c (add_method): Change pair of errors to error + inform. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 4beab85..fcf06e0 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -2354,9 +2354,13 @@ do_pushdecl (tree decl, bool is_friend) ; /* Ignore using decls here. */ else if (tree match = duplicate_decls (decl, *iter, is_friend)) { - if (iter.hidden_p () - && match != error_mark_node - && !DECL_HIDDEN_P (match)) + if (match == error_mark_node) + ; + else if (TREE_CODE (match) == TYPE_DECL) + /* The IDENTIFIER will have the type referring to the + now-smashed TYPE_DECL, because ...? Reset it. */ + SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (match)); + else if (iter.hidden_p () && !DECL_HIDDEN_P (match)) { /* Unhiding a previously hidden decl. */ tree head = iter.reveal_node (old); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 274fced..8a6311a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-30 Nathan Sidwell <nathan@acm.org> + + PR c++/81229 + * g++.dg/lookup/pr81229.C: New. + 2017-06-30 Martin Liska <mliska@suse.cz> PR sanitizer/81021 diff --git a/gcc/testsuite/g++.dg/lookup/pr81229.C b/gcc/testsuite/g++.dg/lookup/pr81229.C new file mode 100644 index 0000000..c9981c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pr81229.C @@ -0,0 +1,7 @@ +// PR c++/81229 GC ICE with stale pointed in identifier type. +// { dg-additional-options "--param ggc-min-heapsize=0" } + +typedef unsigned L; +typedef unsigned L; + +L l; |