Clang Project

clang_source_code/test/CodeGenCoroutines/coro-ret-void.cpp
1// RUN: %clang_cc1 -std=c++14 -fcoroutines-ts -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - -disable-llvm-passes | FileCheck %s
2
3#include "Inputs/coroutine.h"
4
5namespace coro = std::experimental::coroutines_v1;
6
7struct coro1 {
8  struct promise_type {
9    coro1 get_return_object();
10    coro::suspend_never initial_suspend();
11    coro::suspend_never final_suspend();
12    void return_void();
13  };
14};
15
16coro1 f() {
17  co_await coro::suspend_never{};
18}
19
20// CHECK-LABEL: define void @_Z1fv(
21// CHECK: call void @_ZNSt12experimental13coroutines_v113suspend_never12await_resumeEv(%"struct.std::experimental::coroutines_v1::suspend_never"*
22// CHECK: call void @_ZN5coro112promise_type11return_voidEv(%"struct.coro1::promise_type"* %__promise)
23
24struct A {
25  A();
26  ~A();
27};
28
29coro1 f2() {
30  co_return (void) A{};
31}
32
33// CHECK-LABEL: define void @_Z2f2v(
34// CHECK: call void @_ZN1AC1Ev(%struct.A* %[[AVar:.*]])
35// CHECK-NEXT: call void @_ZN1AD1Ev(%struct.A* %[[AVar]])
36// CHECK-NEXT: call void @_ZN5coro112promise_type11return_voidEv(%"struct.coro1::promise_type"*
37
38struct coro2 {
39  struct promise_type {
40    coro2 get_return_object();
41    coro::suspend_never initial_suspend();
42    coro::suspend_never final_suspend();
43    void return_value(int);
44  };
45};
46
47coro2 g() {
48  co_return 42;
49}
50
51// CHECK-LABEL: define void @_Z1gv(
52// CHECK: call void @_ZNSt12experimental13coroutines_v113suspend_never12await_resumeEv(%"struct.std::experimental::coroutines_v1::suspend_never"*
53// CHECK: call void @_ZN5coro212promise_type12return_valueEi(%"struct.coro2::promise_type"* %__promise, i32 42)
54