diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-03-27 13:09:12 -0700 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-03-27 13:09:12 -0700 |
commit | c7fc15f54b321b2522ae26abebb86957de5c6fae (patch) | |
tree | 8d01a790dc1cf2a91419db288f307e6bd2211d33 | |
parent | ccacf77be5508dd5b4df59f402965196d11edb05 (diff) | |
download | gcc-c7fc15f54b321b2522ae26abebb86957de5c6fae.zip gcc-c7fc15f54b321b2522ae26abebb86957de5c6fae.tar.gz gcc-c7fc15f54b321b2522ae26abebb86957de5c6fae.tar.bz2 |
[pr84733] Fix ICE popping local scope
PR c++/84733
* name-lookup.c (do_pushdecl): Look through cleanp levels.
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/pr84733.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/pr94257.C | 16 |
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2a2e6ea..885f29d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-03-27 Nathan Sidwell <nathan@acm.org> + + PR c++/84733 + * name-lookup.c (do_pushdecl): Look through cleanp levels. + 2020-03-27 Martin Sebor <msebor@redhat.com> PR c++/94078 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index e6dfb9c..8dd0b0d 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -2998,7 +2998,8 @@ do_pushdecl (tree decl, bool is_friend) /* The binding level we will be pushing into. During local class pushing, we want to push to the containing scope. */ cp_binding_level *level = current_binding_level; - while (level->kind == sk_class) + while (level->kind == sk_class + || level->kind == sk_cleanup) level = level->level_chain; /* An anonymous namespace has a NULL DECL_NAME, but we still want to diff --git a/gcc/testsuite/g++.dg/lookup/pr84733.C b/gcc/testsuite/g++.dg/lookup/pr84733.C new file mode 100644 index 0000000..d0394ea --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pr84733.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// PR c++/84733 ICE popping local binding after cleanup region + +struct c { + ~c(); +} b; + +void f() { +#ifndef OK + try { + d: + ; + } catch (int) { + } +#endif + decltype(b) a; + int e; + struct e { } f; + e = 5; + struct e j; +} diff --git a/gcc/testsuite/g++.dg/lookup/pr94257.C b/gcc/testsuite/g++.dg/lookup/pr94257.C new file mode 100644 index 0000000..d92e292 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pr94257.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +// PR94257 ICE with silly inline nest. + +inline namespace B { // { dg-message "namespace B { }" } +namespace B { } // { dg-message "namespace B::B { }" } +} + +namespace B { // { dg-error ".namespace B. is ambiguous" } +} + +// But this is fine +namespace D { +inline namespace D { } +} +namespace D { +} |