[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
This commit is contained in:
Eric Fiselier 2018-03-27 03:33:06 +00:00
parent d2e30d34b9
commit 855c09221a
2 changed files with 22 additions and 4 deletions

View File

@ -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()->

View File

@ -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_await awaitable_unused_warn(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
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}}
}