coroutines: Avoid functions with unlowered coroutine trees [PR95087].
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 31 May 2020 19:30:10 +0000 (20:30 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Sun, 31 May 2020 19:48:09 +0000 (20:48 +0100)
Diagnosing bad uses of 'return' in coroutines is somewhat
tricky, since the user can use the keyword before we know
that the function is a coroutine (where such returns are not
permitted).  At present, we are just doing a check for any
use of 'return' and erroring on that.  However, we can't then
pass the function body on, since it will contain unlowered
coroutine trees.

This avoids the issue by dropping the entire function body
under that circumstance.  We could do better (for 11) but
this is intended to allow back-port of other fixes to 10.

gcc/cp/ChangeLog:

PR c++/95087
* coroutines.cc (morph_fn_to_coro): If we see an
early fatal error, drop the erroneous function body.

gcc/testsuite/ChangeLog:

PR c++/95087
* g++.dg/coroutines/co-return-syntax-08-bad-return.C:
Adjust the testcase to do the compile (rather than an
-fsyntax-only parse).

gcc/cp/coroutines.cc
gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C

index f3cf242b4f1b8c2d9550618a6a2e6eab16cfb97f..0abc579e0cb7fc5f7cf8f51dc0a3dcc66dec6ec0 100644 (file)
@@ -3585,6 +3585,9 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
         ramp return value, since the user cannot fix this - a 'return' is
         not allowed in a coroutine.  */
       TREE_NO_WARNING (orig) = true;
+      /* Discard the body, we can't process it further.  */
+      pop_stmt_list (DECL_SAVED_TREE (orig));
+      DECL_SAVED_TREE (orig) = push_stmt_list ();
       return false;
     }
 
index 4bfa41cd4a980f6e0d39407a77a75e3a4820a280..9b5375487917391ef97b2ff81403e11bc21244b9 100644 (file)
@@ -1,4 +1,4 @@
-//  { dg-additional-options "-fsyntax-only -w" }
+//  { dg-additional-options "-w" }
 
 #include "coro.h"