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

llvm-svn: 190756
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 3b2d7ee18c5d22b0859bfde0688a1c4957af1bfc
diff --git a/include/future b/include/future
index b249464..9c4c70d 100644
--- a/include/future
+++ b/include/future
@@ -19,10 +19,10 @@
 
 enum class future_errc
 {
-    broken_promise,
-    future_already_retrieved,
+    future_already_retrieved = 1,
     promise_already_satisfied,
-    no_state
+    no_state,
+    broken_promise
 };
 
 enum class launch
@@ -379,10 +379,10 @@
 //enum class future_errc
 _LIBCPP_DECLARE_STRONG_ENUM(future_errc)
 {
-    broken_promise,
-    future_already_retrieved,
+    future_already_retrieved = 1,
     promise_already_satisfied,
-    no_state
+    no_state,
+    broken_promise
 };
 _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
 
diff --git a/src/future.cpp b/src/future.cpp
index 7d9a5b5..70919ab 100644
--- a/src/future.cpp
+++ b/src/future.cpp
@@ -26,11 +26,15 @@
     return "future";
 }
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wswitch"
+
 string
 __future_error_category::message(int ev) const
 {
     switch (static_cast<future_errc>(ev))
     {
+    case future_errc(0):  // For backwards compatibility with C++11 (LWG 2056)
     case future_errc::broken_promise:
         return string("The associated promise has been destructed prior "
                       "to the associated state becoming ready.");
@@ -46,6 +50,8 @@
     return string("unspecified future_errc value\n");
 }
 
+#pragma clang diagnostic pop
+
 const error_category&
 future_category() _NOEXCEPT
 {
diff --git a/test/thread/futures/futures.overview/future_errc.pass.cpp b/test/thread/futures/futures.overview/future_errc.pass.cpp
index 6ffaca4..7b3b70a 100644
--- a/test/thread/futures/futures.overview/future_errc.pass.cpp
+++ b/test/thread/futures/futures.overview/future_errc.pass.cpp
@@ -11,18 +11,18 @@
 
 // enum class future_errc
 // {
-//     broken_promise,
-//     future_already_retrieved,
+//     future_already_retrieved = 1,
 //     promise_already_satisfied,
 //     no_state
+//     broken_promise,
 // };
 
 #include <future>
 
 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::promise_already_satisfied) == 2, "");
     static_assert(static_cast<int>(std::future_errc::no_state) == 3, "");
+    static_assert(static_cast<int>(std::future_errc::broken_promise) == 4, "");
 }