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.
(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 -- Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA