diff options
author | Nathan Sidwell <nathan@acm.org> | 2018-03-21 10:59:28 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2018-03-21 10:59:28 +0000 |
commit | 7cd9cf2f0bc24499c292896f951c2a34875637f0 (patch) | |
tree | fea6c56fd2e95cd4b1bab13131e8b67686060baf | |
parent | 49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/pr84836.C | 9 |
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); +} |