c++: Fix ICE in check_local_shadow with enum [PR95560]
authorMarek Polacek <polacek@redhat.com>
Tue, 16 Jun 2020 17:02:23 +0000 (13:02 -0400)
committerMarek Polacek <polacek@redhat.com>
Tue, 16 Jun 2020 17:08:57 +0000 (13:08 -0400)
Another indication that perhaps this warning is emitted too early.  We
crash because same_type_p gets a null type: we have an enumerator
without a fixed underlying type and finish_enum_value_list hasn't yet
run.  So check if the type is null before calling same_type_p.

PR c++/95560
* name-lookup.c (check_local_shadow): Check if types are
non-null before calling same_type_p.

* g++.dg/warn/Wshadow-local-3.C: New test.

gcc/cp/name-lookup.c
gcc/testsuite/g++.dg/warn/Wshadow-local-3.C [new file with mode: 0644]

index 2ff85f1cf5e29864950798b32a0d407858d0fc86..159c98a67cd563cf573a338e4a40f4327c5117de 100644 (file)
@@ -2762,7 +2762,9 @@ check_local_shadow (tree decl)
       enum opt_code warning_code;
       if (warn_shadow)
        warning_code = OPT_Wshadow;
-      else if (same_type_p (TREE_TYPE (old), TREE_TYPE (decl))
+      else if ((TREE_TYPE (old)
+               && TREE_TYPE (decl)
+               && same_type_p (TREE_TYPE (old), TREE_TYPE (decl)))
               || TREE_CODE (decl) == TYPE_DECL
               || TREE_CODE (old) == TYPE_DECL
               || (!dependent_type_p (TREE_TYPE (decl))
diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-local-3.C b/gcc/testsuite/g++.dg/warn/Wshadow-local-3.C
new file mode 100644 (file)
index 0000000..fd743ec
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/95560
+// { dg-do compile { target c++11 } }
+
+template <typename> void fn1() {
+  bool ready;
+  enum class State { ready };
+}