From: Nathan Sidwell Date: Fri, 27 Mar 2020 20:09:12 +0000 (-0700) Subject: [pr84733] Fix ICE popping local scope X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c7fc15f54b321b2522ae26abebb86957de5c6fae;p=gcc.git [pr84733] Fix ICE popping local scope PR c++/84733 * name-lookup.c (do_pushdecl): Look through cleanp levels. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2a2e6eac7bf..885f29d8c86 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-03-27 Nathan Sidwell + + PR c++/84733 + * name-lookup.c (do_pushdecl): Look through cleanp levels. + 2020-03-27 Martin Sebor PR c++/94078 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index e6dfb9cc723..8dd0b0d723e 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 00000000000..d0394eab891 --- /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 00000000000..d92e2920cd0 --- /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 { +}