diff options
author | Gor Nishanov <GorNishanov@gmail.com> | 2017-03-06 21:12:54 +0000 |
---|---|---|
committer | Gor Nishanov <GorNishanov@gmail.com> | 2017-03-06 21:12:54 +0000 |
commit | ba524690b91049ad6491d1639d500eb787607c1d (patch) | |
tree | e1a0537133a4d29088d477784a7a27fdedfe6133 /test/CodeGenCoroutines | |
parent | 01784736275cb39fdb1e64c0192d611e5a345955 (diff) |
[coroutines] Add co_return statement emission
Summary:
Added co_return statement emission.
Tweaked coro-alloc.cpp test to use co_return to trigger coroutine processing instead of co_await, since this change starts emitting the body of the coroutine and await expression handling has not been upstreamed yet.
Reviewers: rsmith, majnemer, EricWF, aaron.ballman
Reviewed By: rsmith
Subscribers: majnemer, llvm-commits, mehdi_amini
Differential Revision: https://reviews.llvm.org/D29979
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@297076 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCoroutines')
-rw-r--r-- | test/CodeGenCoroutines/coro-alloc.cpp | 10 | ||||
-rw-r--r-- | test/CodeGenCoroutines/coro-return.cpp | 52 |
2 files changed, 57 insertions, 5 deletions
diff --git a/test/CodeGenCoroutines/coro-alloc.cpp b/test/CodeGenCoroutines/coro-alloc.cpp index 7dbbdd31be..87da7aed89 100644 --- a/test/CodeGenCoroutines/coro-alloc.cpp +++ b/test/CodeGenCoroutines/coro-alloc.cpp @@ -34,7 +34,7 @@ extern "C" void f0(global_new_delete_tag) { // CHECK: %[[FRAME:.+]] = call i8* @llvm.coro.frame() // CHECK: %[[MEM:.+]] = call i8* @llvm.coro.free(token %[[ID]], i8* %[[FRAME]]) // CHECK: call void @_ZdlPv(i8* %[[MEM]]) - co_await suspend_always{}; + co_return; } struct promise_new_tag {}; @@ -59,7 +59,7 @@ extern "C" void f1(promise_new_tag ) { // CHECK: %[[FRAME:.+]] = call i8* @llvm.coro.frame() // CHECK: %[[MEM:.+]] = call i8* @llvm.coro.free(token %[[ID]], i8* %[[FRAME]]) // CHECK: call void @_ZdlPv(i8* %[[MEM]]) - co_await suspend_always{}; + co_return; } struct promise_delete_tag {}; @@ -84,7 +84,7 @@ extern "C" void f2(promise_delete_tag) { // CHECK: %[[FRAME:.+]] = call i8* @llvm.coro.frame() // CHECK: %[[MEM:.+]] = call i8* @llvm.coro.free(token %[[ID]], i8* %[[FRAME]]) // CHECK: call void @_ZNSt12experimental16coroutine_traitsIJv18promise_delete_tagEE12promise_typedlEPv(i8* %[[MEM]]) - co_await suspend_always{}; + co_return; } struct promise_sized_delete_tag {}; @@ -100,7 +100,7 @@ struct std::experimental::coroutine_traits<void, promise_sized_delete_tag> { }; }; -// CHECK-LABEL: f3( +// CHECK-LABEL: f3( extern "C" void f3(promise_sized_delete_tag) { // CHECK: %[[ID:.+]] = call token @llvm.coro.id(i32 16 // CHECK: %[[SIZE:.+]] = call i64 @llvm.coro.size.i64() @@ -110,5 +110,5 @@ extern "C" void f3(promise_sized_delete_tag) { // CHECK: %[[MEM:.+]] = call i8* @llvm.coro.free(token %[[ID]], i8* %[[FRAME]]) // CHECK: %[[SIZE2:.+]] = call i64 @llvm.coro.size.i64() // CHECK: call void @_ZNSt12experimental16coroutine_traitsIJv24promise_sized_delete_tagEE12promise_typedlEPvm(i8* %[[MEM]], i64 %[[SIZE2]]) - co_await suspend_always{}; + co_return; } diff --git a/test/CodeGenCoroutines/coro-return.cpp b/test/CodeGenCoroutines/coro-return.cpp new file mode 100644 index 0000000000..2b94da8336 --- /dev/null +++ b/test/CodeGenCoroutines/coro-return.cpp @@ -0,0 +1,52 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fcoroutines-ts -std=c++14 -emit-llvm %s -o - -disable-llvm-passes | FileCheck %s + +namespace std { +namespace experimental { +template <typename... T> +struct coroutine_traits; +} +} + +struct suspend_always { + bool await_ready(); + void await_suspend(); + void await_resume(); +}; + +template<> +struct std::experimental::coroutine_traits<void> { + struct promise_type { + void get_return_object(); + suspend_always initial_suspend(); + suspend_always final_suspend(); + void return_void(); + }; +}; + +// CHECK-LABEL: f0( +extern "C" void f0() { + // CHECK: %__promise = alloca %"struct.std::experimental::coroutine_traits<void>::promise_type" + // CHECK: %call = call i8* @_Znwm( + // CHECK: call void @_ZNSt12experimental16coroutine_traitsIJvEE12promise_type11return_voidEv(%"struct.std::experimental::coroutine_traits<void>::promise_type"* %__promise) + // CHECK: call void @_ZdlPv + co_return; +} + +template<> +struct std::experimental::coroutine_traits<int> { + struct promise_type { + int get_return_object(); + suspend_always initial_suspend(); + suspend_always final_suspend(); + void return_value(int); + }; +}; + +// CHECK-LABEL: f1( +extern "C" int f1() { + // CHECK: %__promise = alloca %"struct.std::experimental::coroutine_traits<int>::promise_type" + // CHECK: %call = call i8* @_Znwm( + // CHECK: call void @_ZNSt12experimental16coroutine_traitsIJiEE12promise_type12return_valueEi(%"struct.std::experimental::coroutine_traits<int>::promise_type"* %__promise, i32 42) + // CHECK: call void @_ZdlPv + co_return 42; +} |