// Tests that coroutine passes are added to and run by the new pass manager // pipeline, at -O0 and above. // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm-bc -o /dev/null \ // RUN: -fdebug-pass-manager -std=c++20 \ // RUN: -O0 %s 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm-bc -o /dev/null \ // RUN: -fdebug-pass-manager -std=c++20 \ // RUN: -O1 %s 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT // // CHECK-ALL: Running pass:{{.*}}CoroEarlyPass // // CHECK-ALL: Running pass: CoroSplitPass on (_Z3foov) // CHECK-OPT: Running pass:{{.*}}CoroElidePass{{.*}} on {{.*}}_Z3foov{{.*}} // // CHECK-ALL: Running pass:{{.*}}CoroCleanupPass namespace std { struct handle {}; struct awaitable { bool await_ready() noexcept { return false; } void await_suspend(handle) noexcept {} bool await_resume() noexcept { return true; } }; template struct coroutine_handle { static handle from_address(void *address) noexcept { return {}; } }; template struct coroutine_traits { struct promise_type { awaitable initial_suspend() { return {}; } awaitable final_suspend() noexcept { return {}; } void return_void() {} T get_return_object() { return T(); } void unhandled_exception() {} }; }; } // namespace std void foo() { co_return; }