aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-06-30 11:40:08 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-06-30 11:40:08 +0000
commit274c15162b9b023b8569fa39481ad1a0b7ed0070 (patch)
tree7e7b4ece8e31838a9e2eee4464327af7658812f2
parent273a94e0fa98687df97826fdaff46c29bdfa4d06 (diff)
downloadgcc-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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/name-lookup.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/pr81229.C7
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;