Fix multiple bugs in coroutine tests.
authorEric Fiselier <eric@efcs.ca>
Mon, 29 May 2017 05:00:24 +0000 (05:00 +0000)
committerEric Fiselier <eric@efcs.ca>
Mon, 29 May 2017 05:00:24 +0000 (05:00 +0000)
llvm-svn: 304124

libcxx/include/experimental/coroutine
libcxx/test/libcxx/experimental/language.support/support.coroutines/dialect_support.sh.cpp

index 206fde2..42ee3ed 100644 (file)
@@ -212,6 +212,9 @@ public:
         return __tmp;
     }
 
+    // from_address cannot be used with the coroutines promise type.
+    static coroutine_handle from_address(_Promise*) = delete;
+
     _LIBCPP_ALWAYS_INLINE
     static coroutine_handle from_promise(_Promise& __promise) _NOEXCEPT {
         coroutine_handle __tmp;
index ebe447c..56f47c8 100644 (file)
@@ -27,11 +27,11 @@ coro::suspend_never sn;
 struct MyFuture {
   struct promise_type {
     typedef coro::coroutine_handle<promise_type> HandleT;
-    coro::suspend_always initial_suspend() { return sa; }
-    coro::suspend_never final_suspend() { return sn; }
+    coro::suspend_never initial_suspend() { return sn; }
+    coro::suspend_always final_suspend() { return sa; }
     coro::suspend_never yield_value(int) { return sn; }
     MyFuture get_return_object() {
-      MyFuture f(HandleT::from_address(this));
+      MyFuture f(HandleT::from_promise(*this));
       return f;
     }
     void return_void() {}
@@ -41,7 +41,6 @@ struct MyFuture {
   MyFuture() : p() {}
   MyFuture(HandleT h) : p(h) {}
 
-private:
   coro::coroutine_handle<promise_type> p;
 };
 
@@ -54,4 +53,7 @@ MyFuture test_coro() {
 int main()
 {
   MyFuture f = test_coro();
+  while (!f.p.done())
+    f.p.resume();
+  f.p.destroy();
 }