From 274c15162b9b023b8569fa39481ad1a0b7ed0070 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 30 Jun 2017 11:40:08 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/name-lookup.c | 10 +++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/pr81229.C | 7 +++++++ 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/pr81229.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 40153aafea0..38b63e43403 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-06-30 Nathan Sidwell + + PR c++/81229 + * name-lookup.c (do_pushdecl): Reset IDENTIFIER_TYPE when finding + a matching TYPE_DECL. + 2017-06-29 Paolo Carlini * 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 4beab850612..fcf06e0cf5b 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 274fced11a2..8a6311a6565 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-30 Nathan Sidwell + + PR c++/81229 + * g++.dg/lookup/pr81229.C: New. + 2017-06-30 Martin Liska 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 00000000000..c9981c9f60a --- /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; -- 2.30.2