llvm-capstone/clang/test/AST/coroutine-source-location-crash.cpp
Nathan Ridge df2a4eae6b [clang] Expose CoawaitExpr's operand in the AST
Previously the Expr returned by getOperand() was actually the
subexpression common to the "ready", "suspend", and "resume"
expressions, which often isn't just the operand but e.g.
await_transform() called on the operand.

It's important for the AST to expose the operand as written
in the source for traversals and tools like clangd to work
correctly.

Fixes https://github.com/clangd/clangd/issues/939

Differential Revision: https://reviews.llvm.org/D115187
2022-05-17 08:13:37 -04:00

44 lines
1.3 KiB
C++

// Test without serialization:
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 \
// RUN: -fsyntax-only -ast-dump | FileCheck %s
//
// Test with serialization:
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -std=c++20 -emit-pch -o %t %s
// RUN: %clang_cc1 -x c++ -triple x86_64-apple-darwin9 -std=c++20 -include-pch %t \
// RUN: -ast-dump-all /dev/null \
// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
// RUN: | FileCheck %s
#include "Inputs/std-coroutine.h"
using namespace std;
struct A {
bool await_ready();
void await_resume();
template <typename F>
void await_suspend(F);
};
struct coro_t {
struct promise_type {
coro_t get_return_object();
suspend_never initial_suspend();
suspend_never final_suspend() noexcept;
void return_void();
static void unhandled_exception();
};
};
// {{0x[0-9a-fA-F]+}} <line:[[@LINE+1]]:1, col:36>
// CHECK-LABEL: FunctionDecl {{.*}} f 'coro_t (int)'
coro_t f(int n) {
A a{};
// CHECK: CoawaitExpr {{0x[0-9a-fA-F]+}} <col:3, col:12>
// CHECK-NEXT: DeclRefExpr {{0x[0-9a-fA-F]+}} <col:12>
// CHECK-NEXT: DeclRefExpr {{0x[0-9a-fA-F]+}} <col:12>
// CHECK-NEXT: CXXMemberCallExpr {{0x[0-9a-fA-F]+}} <col:12>
// CHECK-NEXT: MemberExpr {{0x[0-9a-fA-F]+}} <col:12>
co_await a;
}