Fix coroutine test failures caused by API misusages.

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
This commit is contained in:
Eric Fiselier 2017-05-29 06:42:01 +00:00
parent 96ab48f9da
commit bae0a1d43c
4 changed files with 15 additions and 6 deletions

View 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;

View 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);
}

View 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);
}
}

View File

@ -37,8 +37,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);
}
}