[gcc(refs/vendors/redhat/heads/gcc-8-branch)] c++: Fix ICE on popping local scope [pr84733]

Jakub Jelinek jakub@gcc.gnu.org
Thu Sep 17 16:53:00 GMT 2020


https://gcc.gnu.org/g:36a626274de8ca4d03d1b69a973544a61fdf7268

commit 36a626274de8ca4d03d1b69a973544a61fdf7268
Author: Nathan Sidwell <nathan@acm.org>
Date:   Fri Mar 27 13:24:27 2020 -0700

    c++: Fix ICE on popping local scope [pr84733]
    
            PR c++/84733
            * name-lookup.c (do_pushdecl): Look through cleanp levels.

Diff:
---
 gcc/cp/ChangeLog                      |  5 +++++
 gcc/cp/name-lookup.c                  |  3 ++-
 gcc/testsuite/g++.dg/lookup/pr84733.C | 21 +++++++++++++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5668ce6a758..7651d0e833f 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-14  Jason Merrill  <jason@redhat.com>
 
 	PR c++/92909
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 3f8e4a0e3a8..f61e748e748 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2971,7 +2971,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;
+}


More information about the Gcc-cvs mailing list