[libcxx-commits] [libcxx] P1957R2: remove special-case for booleans in std::variant (PR #71502)
David Benjamin via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Nov 15 09:27:11 PST 2023
https://github.com/davidben updated https://github.com/llvm/llvm-project/pull/71502
>From 6dca95f524ca80a8f406f0cb1cc7882ed0a392cc Mon Sep 17 00:00:00 2001
From: David Benjamin <davidben at google.com>
Date: Tue, 7 Nov 2023 03:53:37 -0500
Subject: [PATCH 1/4] P1957R2: remove special-case for booleans in std::variant
This picks up the std::variant half of P1957R2. Fixes #62332.
---
libcxx/docs/Status/Cxx20Papers.csv | 2 +-
libcxx/include/variant | 16 ----------------
.../variant.variant/variant.assign/T.pass.cpp | 4 ++--
.../variant.variant/variant.assign/conv.pass.cpp | 2 +-
.../variant.variant/variant.ctor/T.pass.cpp | 12 ++++++++++--
.../variant.variant/variant.ctor/conv.pass.cpp | 2 +-
6 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/libcxx/docs/Status/Cxx20Papers.csv b/libcxx/docs/Status/Cxx20Papers.csv
index dd6fcf9a7583ce3..d6d82af5fafe3e4 100644
--- a/libcxx/docs/Status/Cxx20Papers.csv
+++ b/libcxx/docs/Status/Cxx20Papers.csv
@@ -173,7 +173,7 @@
"`P1868R2 <https://wg21.link/P1868R2>`__","LWG","width: clarifying units of width and precision in std::format","Prague","|Complete|","14.0"
"`P1937R2 <https://wg21.link/P1937R2>`__","CWG","Fixing inconsistencies between constexpr and consteval functions","Prague","* *",""
"`P1956R1 <https://wg21.link/P1956R1>`__","LWG","On the names of low-level bit manipulation functions","Prague","|Complete|","12.0"
-"`P1957R2 <https://wg21.link/P1957R2>`__","CWG","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","Prague","* *",""
+"`P1957R2 <https://wg21.link/P1957R2>`__","CWG","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","Prague","|Complete|","18.0"
"`P1963R0 <https://wg21.link/P1963R0>`__","LWG","Fixing US 313","Prague","* *","",""
"`P1964R2 <https://wg21.link/P1964R2>`__","LWG","Wording for boolean-testable","Prague","|Complete|","13.0"
"`P1970R2 <https://wg21.link/P1970R2>`__","LWG","Consistency for size() functions: Add ranges::ssize","Prague","|Complete|","15.0","|ranges|"
diff --git a/libcxx/include/variant b/libcxx/include/variant
index 7df2e87cf3bf986..d89c0596b1db0de 100644
--- a/libcxx/include/variant
+++ b/libcxx/include/variant
@@ -1252,22 +1252,6 @@ struct __overload {
auto operator()(_Tp, _Up&&) const -> __check_for_narrowing<_Tp, _Up>;
};
-template <class _Tp, size_t>
-struct __overload_bool {
- template <class _Up, class _Ap = __remove_cvref_t<_Up>>
- auto operator()(bool, _Up&&) const
- -> enable_if_t<is_same_v<_Ap, bool>, __type_identity<_Tp>>;
-};
-
-template <size_t _Idx>
-struct __overload<bool, _Idx> : __overload_bool<bool, _Idx> {};
-template <size_t _Idx>
-struct __overload<bool const, _Idx> : __overload_bool<bool const, _Idx> {};
-template <size_t _Idx>
-struct __overload<bool volatile, _Idx> : __overload_bool<bool volatile, _Idx> {};
-template <size_t _Idx>
-struct __overload<bool const volatile, _Idx> : __overload_bool<bool const volatile, _Idx> {};
-
template <class ..._Bases>
struct __all_overloads : _Bases... {
void operator()() const;
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp
index 0cab5689114360a..bc1c9be870cd3bf 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp
@@ -145,8 +145,8 @@ void test_T_assignment_sfinae() {
};
static_assert(!std::is_assignable<V, X>::value,
"no boolean conversion in operator=");
- static_assert(!std::is_assignable<V, std::false_type>::value,
- "no converted to bool in operator=");
+ static_assert(std::is_assignable<V, std::false_type>::value,
+ "converted to bool in operator=");
}
{
struct X {};
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp
index 5c1bf2bbc00bcaf..6ca04a931c73c72 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp
@@ -35,7 +35,7 @@ int main(int, char**)
static_assert(!std::is_assignable<std::variant<int, const bool>, decltype("meow")>::value, "");
static_assert(!std::is_assignable<std::variant<int, const volatile bool>, decltype("meow")>::value, "");
- static_assert(!std::is_assignable<std::variant<bool>, std::true_type>::value, "");
+ static_assert(std::is_assignable<std::variant<bool>, std::true_type>::value, "");
static_assert(!std::is_assignable<std::variant<bool>, std::unique_ptr<char> >::value, "");
static_assert(!std::is_assignable<std::variant<bool>, decltype(nullptr)>::value, "");
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
index 5d3e8d884ee1ae3..0518c214c553eb4 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
@@ -19,6 +19,7 @@
#include <type_traits>
#include <variant>
#include <memory>
+#include <vector>
#include "test_macros.h"
#include "variant_test_helpers.h"
@@ -79,8 +80,8 @@ void test_T_ctor_sfinae() {
};
static_assert(!std::is_constructible<V, X>::value,
"no boolean conversion in constructor");
- static_assert(!std::is_constructible<V, std::false_type>::value,
- "no converted to bool in constructor");
+ static_assert(std::is_constructible<V, std::false_type>::value,
+ "converted to bool in constructor");
}
{
struct X {};
@@ -198,11 +199,18 @@ void test_construction_with_repeated_types() {
static_assert(std::is_constructible<V, Bar>::value, "");
}
+void test_vector_bool() {
+ std::vector<bool> vec = {true};
+ std::variant<bool, int> v = vec[0];
+ assert(v.index() == 0);
+}
+
int main(int, char**) {
test_T_ctor_basic();
test_T_ctor_noexcept();
test_T_ctor_sfinae();
test_no_narrowing_check_for_class_types();
test_construction_with_repeated_types();
+ test_vector_bool();
return 0;
}
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp
index 152f694ce30f433..1d30b0b4db35ebb 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp
@@ -34,7 +34,7 @@ int main(int, char**)
static_assert(!std::is_constructible<std::variant<int, const bool>, decltype("meow")>::value, "");
static_assert(!std::is_constructible<std::variant<int, const volatile bool>, decltype("meow")>::value, "");
- static_assert(!std::is_constructible<std::variant<bool>, std::true_type>::value, "");
+ static_assert(std::is_constructible<std::variant<bool>, std::true_type>::value, "");
static_assert(!std::is_constructible<std::variant<bool>, std::unique_ptr<char> >::value, "");
static_assert(!std::is_constructible<std::variant<bool>, decltype(nullptr)>::value, "");
>From f879e2ebae3deec82e6577594a350826f6f5f870 Mon Sep 17 00:00:00 2001
From: David Benjamin <davidben at google.com>
Date: Tue, 14 Nov 2023 14:16:49 -0500
Subject: [PATCH 2/4] Remove const volatile bool tests
These now trigger errors in C++26:
> error: volatile-qualified parameter type 'const volatile bool' is deprecated [-Werror,-Wdeprecated-volatile]
Since std::variant no longer treats const volatile bool specially, just
remove the lines.
---
.../variant/variant.variant/variant.assign/conv.pass.cpp | 1 -
.../utilities/variant/variant.variant/variant.ctor/conv.pass.cpp | 1 -
2 files changed, 2 deletions(-)
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp
index 6ca04a931c73c72..d93d429e262c05b 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp
@@ -33,7 +33,6 @@ int main(int, char**)
static_assert(!std::is_assignable<std::variant<int, bool>, decltype("meow")>::value, "");
static_assert(!std::is_assignable<std::variant<int, const bool>, decltype("meow")>::value, "");
- static_assert(!std::is_assignable<std::variant<int, const volatile bool>, decltype("meow")>::value, "");
static_assert(std::is_assignable<std::variant<bool>, std::true_type>::value, "");
static_assert(!std::is_assignable<std::variant<bool>, std::unique_ptr<char> >::value, "");
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp
index 1d30b0b4db35ebb..7a4c68b5dacca7f 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp
@@ -32,7 +32,6 @@ int main(int, char**)
static_assert(!std::is_constructible<std::variant<int, bool>, decltype("meow")>::value, "");
static_assert(!std::is_constructible<std::variant<int, const bool>, decltype("meow")>::value, "");
- static_assert(!std::is_constructible<std::variant<int, const volatile bool>, decltype("meow")>::value, "");
static_assert(std::is_constructible<std::variant<bool>, std::true_type>::value, "");
static_assert(!std::is_constructible<std::variant<bool>, std::unique_ptr<char> >::value, "");
>From 9e6a349d51424a62882658f5f80d92e81d78fdaf Mon Sep 17 00:00:00 2001
From: David Benjamin <davidben at google.com>
Date: Wed, 15 Nov 2023 12:18:32 -0500
Subject: [PATCH 3/4] More tests
---
.../variant/variant.variant/variant.assign/T.pass.cpp | 10 ++++++++++
.../variant/variant.variant/variant.ctor/T.pass.cpp | 1 +
2 files changed, 11 insertions(+)
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp
index bc1c9be870cd3bf..c63626090c2fe9a 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp
@@ -19,6 +19,7 @@
#include <string>
#include <type_traits>
#include <variant>
+#include <vector>
#include <memory>
#include "test_macros.h"
@@ -295,12 +296,21 @@ void test_T_assignment_performs_assignment() {
#endif // TEST_HAS_NO_EXCEPTIONS
}
+void test_T_assignment_vector_bool() {
+ std::vector<bool> vec = {true};
+ std::variant<bool, int> v;
+ v = vec[0];
+ assert(v.index() == 0);
+ assert(std::get<0>(v) == true);
+}
+
int main(int, char**) {
test_T_assignment_basic();
test_T_assignment_performs_construction();
test_T_assignment_performs_assignment();
test_T_assignment_noexcept();
test_T_assignment_sfinae();
+ test_T_assignment_vector_bool();
return 0;
}
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
index 0518c214c553eb4..3bc8fd8b5f3cd40 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
@@ -203,6 +203,7 @@ void test_vector_bool() {
std::vector<bool> vec = {true};
std::variant<bool, int> v = vec[0];
assert(v.index() == 0);
+ assert(std::get<0>(v) == true);
}
int main(int, char**) {
>From a790bb818644f020d786328223844cde1071634f Mon Sep 17 00:00:00 2001
From: David Benjamin <davidben at google.com>
Date: Wed, 15 Nov 2023 12:18:34 -0500
Subject: [PATCH 4/4] Remove more C++26-incompatible volatiles
---
.../utilities/variant/variant.variant/variant.ctor/T.pass.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
index 3bc8fd8b5f3cd40..04329f4f412b06a 100644
--- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
+++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
@@ -139,12 +139,12 @@ void test_T_ctor_basic() {
assert(std::get<0>(v) == "foo");
}
{
- std::variant<bool volatile, std::unique_ptr<int>> v = nullptr;
+ std::variant<bool, std::unique_ptr<int>> v = nullptr;
assert(v.index() == 1);
assert(std::get<1>(v) == nullptr);
}
{
- std::variant<bool volatile const, int> v = true;
+ std::variant<bool const, int> v = true;
assert(v.index() == 0);
assert(std::get<0>(v));
}
More information about the libcxx-commits
mailing list