This revision was automatically updated to reflect the committed changes. Closed by commit rG8d60e10ce4bd: [AST][Coroutine] Fix CoyieldExpr missing end loc (authored by dingfei <fd...@feysh.com>).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D157296/new/ https://reviews.llvm.org/D157296 Files: clang/lib/Sema/SemaCoroutine.cpp clang/test/AST/Inputs/std-coroutine.h clang/test/AST/coroutine-co_yield-source-range.cpp Index: clang/test/AST/coroutine-co_yield-source-range.cpp =================================================================== --- /dev/null +++ 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<promise_type>::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_type> promise); + + std::coroutine_handle<promise_type> handle; +}; + +Chat f(int s) { + // CHECK: CoyieldExpr {{.*}} <col:3, col:12> + // CHECK-NEXT: CXXMemberCallExpr {{.*}} <col:3, col:12> {{.*}} + // CHECK-NEXT: MemberExpr {{.*}} <col:3> {{.*}} + // CHECK-NEXT: DeclRefExpr {{.*}} <col:3> {{.*}} + // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:12> {{.*}} + // CHECK-NEXT: DeclRefExpr {{.*}} <col:12> {{.*}} + co_yield s; + // CHECK: CoreturnStmt {{.*}} <line:{{.*}}:3, col:13> + co_return s; + // CHECK: CoawaitExpr {{.*}} <col:3, col:12> 'int' + co_await s; +} Index: clang/test/AST/Inputs/std-coroutine.h =================================================================== --- clang/test/AST/Inputs/std-coroutine.h +++ 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 { Index: clang/lib/Sema/SemaCoroutine.cpp =================================================================== --- clang/lib/Sema/SemaCoroutine.cpp +++ 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
Index: clang/test/AST/coroutine-co_yield-source-range.cpp =================================================================== --- /dev/null +++ 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<promise_type>::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_type> promise); + + std::coroutine_handle<promise_type> handle; +}; + +Chat f(int s) { + // CHECK: CoyieldExpr {{.*}} <col:3, col:12> + // CHECK-NEXT: CXXMemberCallExpr {{.*}} <col:3, col:12> {{.*}} + // CHECK-NEXT: MemberExpr {{.*}} <col:3> {{.*}} + // CHECK-NEXT: DeclRefExpr {{.*}} <col:3> {{.*}} + // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:12> {{.*}} + // CHECK-NEXT: DeclRefExpr {{.*}} <col:12> {{.*}} + co_yield s; + // CHECK: CoreturnStmt {{.*}} <line:{{.*}}:3, col:13> + co_return s; + // CHECK: CoawaitExpr {{.*}} <col:3, col:12> 'int' + co_await s; +} Index: clang/test/AST/Inputs/std-coroutine.h =================================================================== --- clang/test/AST/Inputs/std-coroutine.h +++ 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 { Index: clang/lib/Sema/SemaCoroutine.cpp =================================================================== --- clang/lib/Sema/SemaCoroutine.cpp +++ 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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits