91 lines · cpp
1// This addresses https://github.com/llvm/llvm-project/issues/573392// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fcxx-exceptions \3// RUN: -fexceptions -emit-llvm -o - %s -O1 | FileCheck %s4 5#include "Inputs/coroutine.h"6 7struct gen {8 struct promise_type {9 gen get_return_object() noexcept {10 return gen{std::coroutine_handle<promise_type>::from_promise(*this)};11 }12 std::suspend_always initial_suspend() noexcept { return {}; }13 14 struct final_awaiter {15 ~final_awaiter() noexcept;16 bool await_ready() noexcept {17 return false;18 }19 void await_suspend(std::coroutine_handle<>) noexcept {}20 void await_resume() noexcept {}21 };22 23 final_awaiter final_suspend() noexcept {24 return {};25 }26 27 void unhandled_exception() {28 throw;29 }30 void return_void() {}31 };32 33 gen(std::coroutine_handle<promise_type> coro) noexcept34 : coro(coro)35 {36 }37 38 ~gen() noexcept {39 if (coro) {40 coro.destroy();41 }42 }43 44 gen(gen&& g) noexcept45 : coro(g.coro)46 {47 g.coro = {};48 }49 50 std::coroutine_handle<promise_type> coro;51};52 53struct X {};54 55gen maybe_throwing(bool x) {56 if (x) {57 throw X{};58 }59 co_return;60}61 62// CHECK: define{{.*}}@_Z14maybe_throwingb.destroy63// CHECK: %[[INDEX:.+]] = load i1, ptr %index.addr, align 164// CHECK: br i1 %[[INDEX]], label %[[AFTERSUSPEND:.+]], label %[[CORO_FREE:.+]]65// CHECK: [[AFTERSUSPEND]]:66// CHECK: call{{.*}}_ZN3gen12promise_type13final_awaiterD1Ev(67// CHECK: [[CORO_FREE]]:68// CHECK: call{{.*}}_ZdlPv69 70void noexcept_call() noexcept;71 72gen no_throwing() {73 noexcept_call();74 co_return;75}76 77// CHECK: define{{.*}}@_Z11no_throwingv.resume({{.*}}%[[ARG:.+]])78// CHECK: resume:79// CHECK: call{{.*}}@_Z13noexcept_callv()80// CHECK: store ptr null, ptr %[[ARG]]81// CHECK: ret void82 83// CHECK: define{{.*}}@_Z11no_throwingv.destroy({{.*}}%[[ARG:.+]])84// CHECK: %[[RESUME_FN_ADDR:.+]] = load ptr, ptr %[[ARG]]85// CHECK: %[[IF_NULL:.+]] = icmp eq ptr %[[RESUME_FN_ADDR]], null86// CHECK: br i1 %[[IF_NULL]], label %[[AFTERSUSPEND:.+]], label %[[CORO_FREE:.+]]87// CHECK: [[AFTERSUSPEND]]:88// CHECK: call{{.*}}_ZN3gen12promise_type13final_awaiterD1Ev(89// CHECK: [[CORO_FREE]]:90// CHECK: call{{.*}}_ZdlPv91