Marshall Clow: LWG Issue 2056: future_errc enums start with value 0 (invalid value for broken_promise).

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@190756 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Howard Hinnant 2013-09-14 18:20:10 +00:00
parent a49a2c9deb
commit cd942f1840
3 changed files with 15 additions and 9 deletions

View File

@ -19,10 +19,10 @@ namespace std
enum class future_errc enum class future_errc
{ {
broken_promise, future_already_retrieved = 1,
future_already_retrieved,
promise_already_satisfied, promise_already_satisfied,
no_state no_state,
broken_promise
}; };
enum class launch enum class launch
@ -379,10 +379,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD
//enum class future_errc //enum class future_errc
_LIBCPP_DECLARE_STRONG_ENUM(future_errc) _LIBCPP_DECLARE_STRONG_ENUM(future_errc)
{ {
broken_promise, future_already_retrieved = 1,
future_already_retrieved,
promise_already_satisfied, promise_already_satisfied,
no_state no_state,
broken_promise
}; };
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc) _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)

View File

@ -26,11 +26,15 @@ __future_error_category::name() const _NOEXCEPT
return "future"; return "future";
} }
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wswitch"
string string
__future_error_category::message(int ev) const __future_error_category::message(int ev) const
{ {
switch (static_cast<future_errc>(ev)) switch (static_cast<future_errc>(ev))
{ {
case future_errc(0): // For backwards compatibility with C++11 (LWG 2056)
case future_errc::broken_promise: case future_errc::broken_promise:
return string("The associated promise has been destructed prior " return string("The associated promise has been destructed prior "
"to the associated state becoming ready."); "to the associated state becoming ready.");
@ -46,6 +50,8 @@ __future_error_category::message(int ev) const
return string("unspecified future_errc value\n"); return string("unspecified future_errc value\n");
} }
#pragma clang diagnostic pop
const error_category& const error_category&
future_category() _NOEXCEPT future_category() _NOEXCEPT
{ {

View File

@ -11,18 +11,18 @@
// enum class future_errc // enum class future_errc
// { // {
// broken_promise, // future_already_retrieved = 1,
// future_already_retrieved,
// promise_already_satisfied, // promise_already_satisfied,
// no_state // no_state
// broken_promise,
// }; // };
#include <future> #include <future>
int main() int main()
{ {
static_assert(static_cast<int>(std::future_errc::broken_promise) == 0, "");
static_assert(static_cast<int>(std::future_errc::future_already_retrieved) == 1, ""); static_assert(static_cast<int>(std::future_errc::future_already_retrieved) == 1, "");
static_assert(static_cast<int>(std::future_errc::promise_already_satisfied) == 2, ""); static_assert(static_cast<int>(std::future_errc::promise_already_satisfied) == 2, "");
static_assert(static_cast<int>(std::future_errc::no_state) == 3, ""); static_assert(static_cast<int>(std::future_errc::no_state) == 3, "");
static_assert(static_cast<int>(std::future_errc::broken_promise) == 4, "");
} }