re PR c++/80145 ([c++1y] ICE after failed return type deduction)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 10 May 2017 08:34:02 +0000 (08:34 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 10 May 2017 08:34:02 +0000 (08:34 +0000)
/cp
2017-05-10  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/80145
* decl.c (finish_function): To improve error recovery, change the
logic for calling apply_deduced_return_type.

/testsuite
2017-05-10  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/80145
* g++.dg/cpp1y/auto-fn37.C: New.
* g++.dg/cpp1y/auto-fn38.C: Likewise.

From-SVN: r247828

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

index 7c6331826660a5399d4b2f5c5803fbb45510f97e..ddc571f984f9076866c968910d501e9ece0d11f7 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/80145
+       * decl.c (finish_function): To improve error recovery, change the
+       logic for calling apply_deduced_return_type.
+
 2017-05-09  Jason Merrill  <jason@redhat.com>
 
        * class.c (check_bases): Ignore empty bases.
index 74cf018fa31dfd5b69a2c09f4436f2303308d087..a5f62fe91dc4ef399d770f24707d7a7bcd319a8a 100644 (file)
@@ -15562,16 +15562,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 %<auto%> return type can be "
                  "deduced to %<void%>");
        }
-      apply_deduced_return_type (fndecl, void_type_node);
-      fntype = TREE_TYPE (fndecl);
     }
 
   // If this is a concept, check that the definition is reasonable.
index adec236c2edd058f997144593964180a9e234532..8ec71d724383a2172b2c9f0e909c852e6e485d21 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/80145
+       * g++.dg/cpp1y/auto-fn37.C: New.
+       * g++.dg/cpp1y/auto-fn38.C: Likewise.
+
 2017-05-09  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/68163
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn37.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn37.C
new file mode 100644 (file)
index 0000000..3f664b4
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/80145
+// { dg-do compile { target c++14 } }
+
+auto* foo() { return 0; }  // { dg-error "unable to deduce" }
+auto* foo();
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn38.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn38.C
new file mode 100644 (file)
index 0000000..ec3cffb
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/80145
+// { dg-do compile { target c++14 } }
+
+auto* foo() { }  // { dg-error "no return statements" }
+auto* foo();