From: Eric Fiselier Date: Tue, 27 Mar 2018 03:33:06 +0000 (+0000) Subject: [coroutines] Fix unused warning on result of co_yield. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a41408814f37f4f864fb3e57aa01919b4d871d8;p=clang [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`. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@328607 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 3cb0013c9b..57c8850ba9 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -2050,7 +2050,8 @@ bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc, return cast(this)->getResultExpr()-> isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); case CoawaitExprClass: - return cast(this)->getResumeExpr()-> + case CoyieldExprClass: + return cast(this)->getResumeExpr()-> isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); case ChooseExprClass: return cast(this)->getChosenSubExpr()-> diff --git a/test/SemaCXX/coroutines.cpp b/test/SemaCXX/coroutines.cpp index 308e70e054..c09ca57063 100644 --- a/test/SemaCXX/coroutines.cpp +++ b/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 +struct check_warning_promise { + coro get_return_object(); + Await initial_suspend(); + Await final_suspend(); + Await yield_value(int); + void return_void(); + void unhandled_exception(); +}; + + +coro> +test_no_unused_warning() { co_await awaitable_no_unused_warn(); + co_yield 42; +} + +coro> +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}} }