aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-03-21 10:59:28 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-03-21 10:59:28 +0000
commit7cd9cf2f0bc24499c292896f951c2a34875637f0 (patch)
treefea6c56fd2e95cd4b1bab13131e8b67686060baf
parent49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb (diff)
downloadgcc-7cd9cf2f0bc24499c292896f951c2a34875637f0.zip
gcc-7cd9cf2f0bc24499c292896f951c2a34875637f0.tar.gz
gcc-7cd9cf2f0bc24499c292896f951c2a34875637f0.tar.bz2
[PR c++/84836] ICE with local scopes
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg01082.html PR c++/84836 * name-lookup.c (update_binding): Correct logic for local binding update. PR c++/84836 * g++.dg/lookup/pr84836.C: New. From-SVN: r258711
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/name-lookup.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/pr84836.C9
4 files changed, 24 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f3ed02d..5a37c82 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-21 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/84836
+ * name-lookup.c (update_binding): Correct logic for local binding
+ update.
+
2018-03-21 Marek Polacek <polacek@redhat.com>
PR c++/71638, ICE with NSDMI and reference.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 411a796..eda5655 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2481,21 +2481,12 @@ update_binding (cp_binding_level *level, cxx_binding *binding, tree *slot,
done:
if (to_val)
{
- if (level->kind != sk_namespace
- && !to_type && binding->value && OVL_P (to_val))
- update_local_overload (binding, to_val);
+ if (level->kind == sk_namespace || to_type == decl || to_val == decl)
+ add_decl_to_level (level, decl);
else
{
- tree to_add = to_val;
-
- if (level->kind == sk_namespace)
- to_add = decl;
- else if (to_type == decl)
- to_add = decl;
- else if (TREE_CODE (to_add) == OVERLOAD)
- to_add = build_tree_list (NULL_TREE, to_add);
-
- add_decl_to_level (level, to_add);
+ gcc_checking_assert (binding->value && OVL_P (binding->value));
+ update_local_overload (binding, to_val);
}
if (slot)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3863758..ee0a40b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-03-21 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/84836
+ * g++.dg/lookup/pr84836.C: New.
+
2018-03-21 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/84969
diff --git a/gcc/testsuite/g++.dg/lookup/pr84836.C b/gcc/testsuite/g++.dg/lookup/pr84836.C
new file mode 100644
index 0000000..558003a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/pr84836.C
@@ -0,0 +1,9 @@
+// PR c++/84836
+// ICE popping local binding
+
+void foo (void)
+{
+ struct A;
+ void A (int);
+ void A (long);
+}