aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2020-05-31 20:30:10 +0100
committerIain Sandoe <iain@sandoe.co.uk>2020-05-31 20:48:09 +0100
commit1bb808504643e6c3c0df0fdd68a941ed2a64c7f0 (patch)
treed4956b7cc16c35486c22497f2f76517b142632ea /gcc
parent7248bf60a27379c5f6bf863d7935f186b351580b (diff)
downloadgcc-1bb808504643e6c3c0df0fdd68a941ed2a64c7f0.zip
gcc-1bb808504643e6c3c0df0fdd68a941ed2a64c7f0.tar.gz
gcc-1bb808504643e6c3c0df0fdd68a941ed2a64c7f0.tar.bz2
coroutines: Avoid functions with unlowered coroutine trees [PR95087].
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).
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/coroutines.cc3
-rw-r--r--gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C2
2 files changed, 4 insertions, 1 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index f3cf242..0abc579 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -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;
}
diff --git a/gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C b/gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C
index 4bfa41c..9b53754 100644
--- a/gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C
+++ b/gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C
@@ -1,4 +1,4 @@
-// { dg-additional-options "-fsyntax-only -w" }
+// { dg-additional-options "-w" }
#include "coro.h"