[PATCH] D25060: [Coroutines] Fix assertion about uncorrected typos in co_await/co_yield/co_return expressions.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 28 22:09:08 PDT 2016
EricWF created this revision.
EricWF added reviewers: rsmith, GorNishanov.
EricWF added a subscriber: cfe-commits.
Herald added a subscriber: mehdi_amini.
If there is an error finding the `coroutine_traits` template when building a coroutine AST nodes we throw away the remainder of the assignment expression. If the expression has uncorrected typo's this will trigger an assertion in `~Sema()`.
This patch attempts to preemptively correct those typo's when we encounter an error building the coroutine nodes, at least for the case where the `coroutine_traits` template is invalid.
https://reviews.llvm.org/D25060
Files:
lib/Sema/SemaCoroutine.cpp
test/SemaCXX/coroutines.cpp
Index: test/SemaCXX/coroutines.cpp
===================================================================
--- test/SemaCXX/coroutines.cpp
+++ test/SemaCXX/coroutines.cpp
@@ -1,5 +1,22 @@
// RUN: %clang_cc1 -std=c++14 -fcoroutines -verify %s
+void no_coroutine_traits_bad_arg_await() {
+ co_await a; // expected-error {{include <coroutine>}}
+ // expected-error at -1 {{use of undeclared identifier 'a'}}
+}
+
+void no_coroutine_traits_bad_arg_yield() {
+ co_yield a; // expected-error {{include <coroutine>}}
+ // expected-error at -1 {{use of undeclared identifier 'a'}}
+}
+
+
+void no_coroutine_traits_bad_arg_return() {
+ co_return a; // expected-error {{include <coroutine>}}
+ // expected-error at -1 {{use of undeclared identifier 'a'}}
+}
+
+
struct awaitable {
bool await_ready();
void await_suspend(); // FIXME: coroutine_handle
Index: lib/Sema/SemaCoroutine.cpp
===================================================================
--- lib/Sema/SemaCoroutine.cpp
+++ lib/Sema/SemaCoroutine.cpp
@@ -213,6 +213,11 @@
}
ExprResult Sema::ActOnCoawaitExpr(Scope *S, SourceLocation Loc, Expr *E) {
+ auto *Coroutine = checkCoroutineContext(*this, Loc, "co_await");
+ if (!Coroutine) {
+ CorrectDelayedTyposInExpr(E);
+ return ExprError();
+ }
if (E->getType()->isPlaceholderType()) {
ExprResult R = CheckPlaceholderExpr(E);
if (R.isInvalid()) return ExprError();
@@ -222,6 +227,7 @@
ExprResult Awaitable = buildOperatorCoawaitCall(*this, S, Loc, E);
if (Awaitable.isInvalid())
return ExprError();
+
return BuildCoawaitExpr(Loc, Awaitable.get());
}
ExprResult Sema::BuildCoawaitExpr(SourceLocation Loc, Expr *E) {
@@ -275,8 +281,10 @@
ExprResult Sema::ActOnCoyieldExpr(Scope *S, SourceLocation Loc, Expr *E) {
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_yield");
- if (!Coroutine)
+ if (!Coroutine) {
+ CorrectDelayedTyposInExpr(E);
return ExprError();
+ }
// Build yield_value call.
ExprResult Awaitable =
@@ -325,6 +333,11 @@
}
StmtResult Sema::ActOnCoreturnStmt(SourceLocation Loc, Expr *E) {
+ auto *Coroutine = checkCoroutineContext(*this, Loc, "co_return");
+ if (!Coroutine) {
+ CorrectDelayedTyposInExpr(E);
+ return StmtError();
+ }
return BuildCoreturnStmt(Loc, E);
}
StmtResult Sema::BuildCoreturnStmt(SourceLocation Loc, Expr *E) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25060.72949.patch
Type: text/x-patch
Size: 2347 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160929/af3cb2b9/attachment.bin>
More information about the cfe-commits
mailing list