Fix coroutine test failures caused by API misusages.
authorEric Fiselier <eric@efcs.ca>
Mon, 29 May 2017 06:42:01 +0000 (06:42 +0000)
committerEric Fiselier <eric@efcs.ca>
Mon, 29 May 2017 06:42:01 +0000 (06:42 +0000)
More tests to come. I think that from_address overload should be deleted
or ill-formed, except for the 'void*' one; The user cannot possibly
have a typed pointer to the coroutine state.

llvm-svn: 304131

libcxx/include/experimental/coroutine
libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.capacity/operator_bool.sh.cpp
libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.export/address.sh.cpp
libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.export/from_address.sh.cpp

index 42ee3ed..d2a03ae 100644 (file)
@@ -212,6 +212,15 @@ public:
         return __tmp;
     }
 
+    // NOTE: this overload isn't required by the standard but is needed so
+    // the deleted _Promise* overload doesn't make from_address(nullptr)
+    // ambiguous.
+    // FIXME: should from_address work with nullptr?
+    _LIBCPP_ALWAYS_INLINE
+    static coroutine_handle from_address(nullptr_t) _NOEXCEPT {
+      return {};
+    }
+
     // from_address cannot be used with the coroutines promise type.
     static coroutine_handle from_address(_Promise*) = delete;
 
index 7eae2d0..a744f56 100644 (file)
@@ -48,8 +48,8 @@ void do_test() {
     assert(bool(c) == false);
   }
   { // non-null case
-    int dummy = 42;
-    C c = C::from_address(&dummy);
+    char dummy = 42;
+    C c = C::from_address((void*)&dummy);
     assert(c.address() == &dummy);
     assert(bool(c) == true);
   }
index b5b8c10..7258f93 100644 (file)
@@ -42,8 +42,8 @@ void do_test() {
     assert(c.address() == nullptr);
   }
   {
-    int dummy = 42;
-    C c = C::from_address(&dummy);
+    char dummy = 42;
+    C c = C::from_address((void*)&dummy);
     assert(c.address() == &dummy);
   }
 }