diff options
| author | Eric Fiselier <eric@efcs.ca> | 2018-03-27 03:33:06 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2018-03-27 03:33:06 +0000 |
| commit | 855c09221a679b38cbff0193b93c5c13a1c1a723 (patch) | |
| tree | 635b2248c263a59e07accb055b950b968fbf3a1a /clang | |
| parent | d2e30d34b943470025ebcf0fe18f8925c2aac012 (diff) | |
| download | bcm5719-llvm-855c09221a679b38cbff0193b93c5c13a1c1a723.tar.gz bcm5719-llvm-855c09221a679b38cbff0193b93c5c13a1c1a723.zip | |
[coroutines] Fix unused warning on result of co_yield.
This patch follows up on r328602, which fixed the spurious unused
result warning for `co_await`.
llvm-svn: 328607
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaCXX/coroutines.cpp | 21 |
2 files changed, 21 insertions, 3 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 3cb0013c9bf..57c8850ba91 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -2050,7 +2050,8 @@ bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc, return cast<GenericSelectionExpr>(this)->getResultExpr()-> isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); case CoawaitExprClass: - return cast<CoawaitExpr>(this)->getResumeExpr()-> + case CoyieldExprClass: + return cast<CoroutineSuspendExpr>(this)->getResumeExpr()-> isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); case ChooseExprClass: return cast<ChooseExpr>(this)->getChosenSubExpr()-> diff --git a/clang/test/SemaCXX/coroutines.cpp b/clang/test/SemaCXX/coroutines.cpp index 308e70e054a..c09ca570636 100644 --- a/clang/test/SemaCXX/coroutines.cpp +++ b/clang/test/SemaCXX/coroutines.cpp @@ -1338,7 +1338,6 @@ bad_coroutine_calls_with_no_matching_constructor(int, int) { } // namespace CoroHandleMemberFunctionTest - class awaitable_no_unused_warn { public: using handle_type = std::experimental::coroutine_handle<>; @@ -1357,7 +1356,25 @@ public: int await_resume() { return 1; } }; -void test_unused_warning() { +template <class Await> +struct check_warning_promise { + coro<check_warning_promise> get_return_object(); + Await initial_suspend(); + Await final_suspend(); + Await yield_value(int); + void return_void(); + void unhandled_exception(); +}; + + +coro<check_warning_promise<awaitable_no_unused_warn>> +test_no_unused_warning() { co_await awaitable_no_unused_warn(); + co_yield 42; +} + +coro<check_warning_promise<awaitable_unused_warn>> +test_unused_warning() { co_await awaitable_unused_warn(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + co_yield 42; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} } |

