]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix ICE in check_local_shadow with enum [PR95560]
authorMarek Polacek <polacek@redhat.com>
Thu, 11 Jun 2020 21:58:21 +0000 (17:58 -0400)
committerMarek Polacek <polacek@redhat.com>
Thu, 11 Jun 2020 21:58:21 +0000 (17:58 -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-compatible-local-3.C: New test.

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

index f5535ba50bc017d74dccdf8054629e7e0b38f184..b8eb21e0f9788f7282ddf17a902874b9b4061a56 100644 (file)
@@ -2751,7 +2751,9 @@ check_local_shadow (tree decl)
       else if (warn_shadow_local)
        warning_code = OPT_Wshadow_local;
       else if (warn_shadow_compatible_local
-              && (same_type_p (TREE_TYPE (old), TREE_TYPE (decl))
+              && ((TREE_TYPE (old)
+                   && TREE_TYPE (decl)
+                   && same_type_p (TREE_TYPE (old), TREE_TYPE (decl)))
                   || (!dependent_type_p (TREE_TYPE (decl))
                       && !dependent_type_p (TREE_TYPE (old))
                       /* If the new decl uses auto, we don't yet know
diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-compatible-local-3.C b/gcc/testsuite/g++.dg/warn/Wshadow-compatible-local-3.C
new file mode 100644 (file)
index 0000000..045dc75
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/95560
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wshadow=compatible-local" }
+
+template <typename> void fn1() {
+  bool ready;
+  enum class State { ready };
+}