On 6/11/20 3:32 PM, Jason Merrill wrote:
On 6/10/20 5:11 PM, Marek Polacek wrote:
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.

Hmm, I wonder why we use NULL_TREE for the type of uninitialized enumerators in a template; why not give them integer_type_node temporarily?

But this patch is OK for 10.2.

(This is a regression and this fix is suitable for backporting.  Delaying
the warning would not be suitable to backport.)

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10/9?

gcc/cp/ChangeLog:

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

gcc/testsuite/ChangeLog:

    PR c++/95560
    * g++.dg/warn/Wshadow-local-3.C: New test.
---
  gcc/cp/name-lookup.c                        | 4 +++-
  gcc/testsuite/g++.dg/warn/Wshadow-local-3.C | 7 +++++++
  2 files changed, 10 insertions(+), 1 deletion(-)
  create mode 100644 gcc/testsuite/g++.dg/warn/Wshadow-local-3.C

diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 2ff85f1cf5e..159c98a67cd 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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
index 00000000000..fd743eca347
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wshadow-local-3.C
@@ -0,0 +1,7 @@
+// PR c++/95560
+// { dg-do compile { target c++11 } }
+
+template <typename> void fn1() {
+  bool ready;
+  enum class State { ready };
+}

base-commit: 3a391adf7a38780f8d01dbac08a2a143fc80b469



Reply via email to