diff mbox series

[c++/86881] -Wshadow-local-compatible ICE

Message ID ac449d21-15d3-d31b-85e5-2702708ccda9@acm.org
State New
Headers show
Series [c++/86881] -Wshadow-local-compatible ICE | expand

Commit Message

Nathan Sidwell Sept. 18, 2018, 1:49 p.m. UTC
This ICE happens when we try and figure if an unresolved auto type is 
compatible with a previous binding.  With the addition of auto, we're 
now checking too early, but that's a harder problem.   This fixes the 
ICE, but the downside is we don't warn at all, if the auto resolves to a 
compatible type.  But that's not a new problem.

Applying to trunk and gcc-8

nathan
diff mbox series

Patch

2018-09-18  Nathan Sidwell  <nathan@acm.org>

	PR c++/86881
	cp/
	* name-lookup.c (check_local_shadow): Ignore auto types.

	testsuite/
	* g++.dg/warn/pr86881.C: New.

Index: gcc/cp/name-lookup.c
===================================================================
--- gcc/cp/name-lookup.c	(revision 264371)
+++ gcc/cp/name-lookup.c	(working copy)
@@ -2764,6 +2764,13 @@  check_local_shadow (tree 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
+			  its type (the old type cannot be using auto
+			  at this point, without also being
+			  dependent).  This is an indication we're
+			  (now) doing the shadow checking too
+			  early.  */
+		       && !type_uses_auto (TREE_TYPE (decl))
 		       && can_convert (TREE_TYPE (old), TREE_TYPE (decl),
 				       tf_none))))
 	warning_code = OPT_Wshadow_compatible_local;
Index: gcc/testsuite/g++.dg/warn/pr86881.C
===================================================================
--- gcc/testsuite/g++.dg/warn/pr86881.C	(revision 0)
+++ gcc/testsuite/g++.dg/warn/pr86881.C	(working copy)
@@ -0,0 +1,20 @@ 
+// PR c++/86881 ICE with shadow warning
+// { dg-do compile { c++11 } }
+// { dg-additional-options { -Wshadow-compatible-local } }}
+
+void a() {
+  auto b([] {});
+  {
+    auto b = 0;
+  }
+}
+
+struct Proxy { };
+
+void Two ()
+{
+  auto my = Proxy ();
+  {
+    auto my = Proxy (); // { dg-warning "shadows" "" { xfail *-*-* } }
+  };
+}