diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp --- a/clang/lib/Sema/SemaCoroutine.cpp +++ b/clang/lib/Sema/SemaCoroutine.cpp @@ -318,7 +318,8 @@ return ExprError(); } - return S.BuildCallExpr(nullptr, Result.get(), Loc, Args, Loc, nullptr); + auto EndLoc = Args.empty() ? Loc : Args.back()->getEndLoc(); + return S.BuildCallExpr(nullptr, Result.get(), Loc, Args, EndLoc, nullptr); } // See if return type is coroutine-handle and if so, invoke builtin coro-resume diff --git a/clang/test/AST/Inputs/std-coroutine.h b/clang/test/AST/Inputs/std-coroutine.h --- a/clang/test/AST/Inputs/std-coroutine.h +++ b/clang/test/AST/Inputs/std-coroutine.h @@ -55,9 +55,9 @@ }; struct suspend_always { - bool await_ready() { return false; } - void await_suspend(coroutine_handle<>) {} - void await_resume() {} + bool await_ready() noexcept { return false; } + void await_suspend(coroutine_handle<>) noexcept {} + void await_resume() noexcept {} }; struct suspend_never { diff --git a/clang/test/AST/coroutine-co_yield-source-range.cpp b/clang/test/AST/coroutine-co_yield-source-range.cpp new file mode 100644 --- /dev/null +++ b/clang/test/AST/coroutine-co_yield-source-range.cpp @@ -0,0 +1,49 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 \ +// RUN: -fsyntax-only -ast-dump | FileCheck %s + +#include "Inputs/std-coroutine.h" + +using namespace std; + +struct Chat { + struct promise_type { + std::suspend_always initial_suspend() { return {}; } + Chat get_return_object() { + return std::coroutine_handle::from_promise(*this); + } + std::suspend_always yield_value(int m) { return {}; } + std::suspend_always final_suspend() noexcept { return {}; } + std::suspend_always return_value(int) { return {}; } + void unhandled_exception() {} + + auto await_transform(int s) { + struct awaiter { + promise_type *promise; + bool await_ready() { return true; } + int await_resume() { return promise->message; } + void await_suspend(std::coroutine_handle<>) {} + }; + + return awaiter{this}; + } + int message; + }; + + Chat(std::coroutine_handle promise); + + std::coroutine_handle handle; +}; + +Chat f(int s) { + // CHECK: CoyieldExpr {{.*}} + // CHECK-NEXT: CXXMemberCallExpr {{.*}} {{.*}} + // CHECK-NEXT: MemberExpr {{.*}} {{.*}} + // CHECK-NEXT: DeclRefExpr {{.*}} {{.*}} + // CHECK-NEXT: ImplicitCastExpr {{.*}} {{.*}} + // CHECK-NEXT: DeclRefExpr {{.*}} {{.*}} + co_yield s; + // CHECK: CoreturnStmt {{.*}} + co_return s; + // CHECK: CoawaitExpr {{.*}} 'int' + co_await s; +}