Index: cp/decl.c =================================================================== --- cp/decl.c (revision 246414) +++ cp/decl.c (working copy) @@ -15573,16 +15573,19 @@ finish_function (int flags) if (!processing_template_decl && FNDECL_USED_AUTO (fndecl) && TREE_TYPE (fntype) == current_function_auto_return_pattern) { - if (!is_auto (current_function_auto_return_pattern) - && !current_function_returns_value && !current_function_returns_null) + if (is_auto (current_function_auto_return_pattern)) { + apply_deduced_return_type (fndecl, void_type_node); + fntype = TREE_TYPE (fndecl); + } + else if (!current_function_returns_value + && !current_function_returns_null) + { error ("no return statements in function returning %qT", current_function_auto_return_pattern); inform (input_location, "only plain % return type can be " "deduced to %"); } - apply_deduced_return_type (fndecl, void_type_node); - fntype = TREE_TYPE (fndecl); } // If this is a concept, check that the definition is reasonable. Index: testsuite/g++.dg/cpp1y/auto-fn37.C =================================================================== --- testsuite/g++.dg/cpp1y/auto-fn37.C (revision 0) +++ testsuite/g++.dg/cpp1y/auto-fn37.C (working copy) @@ -0,0 +1,5 @@ +// PR c++/80145 +// { dg-do compile { target c++14 } } + +auto* foo() { return 0; } // { dg-error "unable to deduce" } +auto* foo(); Index: testsuite/g++.dg/cpp1y/auto-fn38.C =================================================================== --- testsuite/g++.dg/cpp1y/auto-fn38.C (revision 0) +++ testsuite/g++.dg/cpp1y/auto-fn38.C (working copy) @@ -0,0 +1,5 @@ +// PR c++/80145 +// { dg-do compile { target c++14 } } + +auto* foo() { } // { dg-error "no return statements" } +auto* foo();