PR c++/83947 - ICE with auto declarations.
authorJason Merrill <jason@redhat.com>
Tue, 23 Jan 2018 21:23:53 +0000 (16:23 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 23 Jan 2018 21:23:53 +0000 (16:23 -0500)
* pt.c (do_auto_deduction): Don't deduce from an auto decl.
* decl.c (undeduced_auto_decl): Limit to vars and fns.

From-SVN: r257000

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1y/auto-fn46.C [new file with mode: 0644]

index 1f26155ddf1217b37ad990a8bc1ce13c24426a8b..9c2cba991211c1ec7e2d8c6e11d4862dd28e6bdf 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-23  Jason Merrill  <jason@redhat.com>
+
+       PR c++/83947 - ICE with auto declarations.
+       * pt.c (do_auto_deduction): Don't deduce from an auto decl.
+       * decl.c (undeduced_auto_decl): Limit to vars and fns.
+
 2018-01-23  David Malcolm  <dmalcolm@redhat.com>
 
        PR c++/83974
index 5f197ef68d8c4a8383ef433f76d06b0f2017fbc2..1970865f3670abe9f9cea427402375c8bd62e103 100644 (file)
@@ -16195,15 +16195,17 @@ fndecl_declared_return_type (tree fn)
   return TREE_TYPE (TREE_TYPE (fn));
 }
 
-/* Returns true iff DECL was declared with an auto type and it has
-   not yet been deduced to a real type.  */
+/* Returns true iff DECL is a variable or function declared with an auto type
+   that has not yet been deduced to a real type.  */
 
 bool
 undeduced_auto_decl (tree decl)
 {
   if (cxx_dialect < cxx11)
     return false;
-  return type_uses_auto (TREE_TYPE (decl));
+  return ((VAR_OR_FUNCTION_DECL_P (decl)
+          || TREE_CODE (decl) == TEMPLATE_DECL)
+         && type_uses_auto (TREE_TYPE (decl)));
 }
 
 /* Complain if DECL has an undeduced return type.  */
index fe64b0647b042c089519cbb2da37dc62ffef5bfd..d39b54ed408d8ad3a4e7e276c9d7c77042a8d36a 100644 (file)
@@ -25884,6 +25884,10 @@ do_auto_deduction (tree type, tree init, tree auto_node,
        from ahead of time isn't worth the trouble.  */
     return type;
 
+  /* Similarly, we can't deduce from another undeduced decl.  */
+  if (init && undeduced_auto_decl (init))
+    return type;
+
   if (tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node))
     /* C++17 class template argument deduction.  */
     return do_class_deduction (type, tmpl, init, flags, complain);
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn46.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn46.C
new file mode 100644 (file)
index 0000000..120a4dd
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/83947
+// { dg-do compile { target c++14 } }
+
+auto f ();
+template < int > auto g (f);   // { dg-error "before deduction" }
+auto h = g < 0 > ();