[libc++][ABI Break] Make is_error_condition_enum_v and is_error_code_enum_v bool...
authorJoe Loser <joeloser93@gmail.com>
Thu, 28 Oct 2021 19:38:02 +0000 (15:38 -0400)
committerJoe Loser <joeloser93@gmail.com>
Thu, 28 Oct 2021 19:38:17 +0000 (15:38 -0400)
`is_error_condition_enum_v` and `is_error_code_enum_v` are currently of
type `size_t`, but the standard mandates they are of type `bool`.

This is an ABI break technically since the size of these variable
templates has changed. Document it as such in the release notes.

Fixes https://bugs.llvm.org/show_bug.cgi?id=50755

Reviewed By: ldionne, Quuxplusone, #libc, var-const

Differential Revision: https://reviews.llvm.org/D112553

libcxx/docs/ReleaseNotes.rst
libcxx/include/system_error
libcxx/test/std/diagnostics/syserr/is_error_code_enum.pass.cpp
libcxx/test/std/diagnostics/syserr/is_error_condition_enum.pass.cpp

index 7ad1923..d2713a9 100644 (file)
@@ -78,6 +78,12 @@ API Changes
   exceeds the maximum supported size, as required by the C++ standard.
   Previously the type ``std::length_error`` was used.
 
+ABI Changes
+-----------
+
+- The C++17 variable templates ``is_error_code_enum_v`` and
+  ``is_error_condition_enum_v`` are now of type ``bool`` instead of ``size_t``.
+
 Build System Changes
 --------------------
 
index db87c98..fcb9079 100644 (file)
@@ -46,10 +46,10 @@ template <class T> struct is_error_condition_enum
     : public false_type {};
 
 template <class _Tp>
-inline constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
+inline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
 
 template <class _Tp>
-inline constexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
+inline constexpr bool is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
 
 class error_code
 {
@@ -165,7 +165,7 @@ struct _LIBCPP_TEMPLATE_VIS is_error_code_enum
 
 #if _LIBCPP_STD_VER > 14
 template <class _Tp>
-inline constexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value;
+inline constexpr bool is_error_code_enum_v = is_error_code_enum<_Tp>::value;
 #endif
 
 // is_error_condition_enum
@@ -176,7 +176,7 @@ struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum
 
 #if _LIBCPP_STD_VER > 14
 template <class _Tp>
-inline constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
+inline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
 #endif
 
 template <>
index 2a44b5e..80735ba 100644 (file)
@@ -23,6 +23,7 @@ test()
     static_assert((std::is_error_code_enum<T>::value == Expected), "");
 #if TEST_STD_VER > 14
     static_assert((std::is_error_code_enum_v<T>      == Expected), "");
+    ASSERT_SAME_TYPE(decltype(std::is_error_code_enum_v<T>), const bool);
 #endif
 }
 
index 46178e6..2f766e6 100644 (file)
@@ -23,6 +23,7 @@ test()
     static_assert((std::is_error_condition_enum<T>::value == Expected), "");
 #if TEST_STD_VER > 14
     static_assert((std::is_error_condition_enum_v<T>        == Expected), "");
+    ASSERT_SAME_TYPE(decltype(std::is_error_condition_enum_v<T>), const bool);
 #endif
 }