From e489d9ab9225bd8114ca7777dc56f7d804365cc9 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Mon, 25 Nov 2024 01:18:38 +0800 Subject: [PATCH] Implement LWG-4140 --- stl/inc/bitset | 2 -- stl/inc/vector | 3 --- .../tests/Dev10_860410_bitset_ctors/test.cpp | 19 +++++++++++++++++++ .../test.compile.pass.cpp | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/stl/inc/bitset b/stl/inc/bitset index 68211c8e0f9..b6e493d957c 100644 --- a/stl/inc/bitset +++ b/stl/inc/bitset @@ -109,8 +109,6 @@ public: } private: - _CONSTEXPR23 reference() noexcept : _Pbitset(nullptr), _Mypos(0) {} - _CONSTEXPR23 reference(bitset<_Bits>& _Bitset, const size_t _Pos) noexcept : _Pbitset(&_Bitset), _Mypos(_Pos) {} bitset<_Bits>* _Pbitset; diff --git a/stl/inc/vector b/stl/inc/vector index b0913e25128..4f79f4986c8 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -2444,9 +2444,6 @@ private: using _Mycont = typename _Mybase::_Mycont; using _Difference_type = typename _Mybase::_Difference_type; - // TRANSITION, ABI: non-trivial constructor - _CONSTEXPR20 _Vb_reference() = default; - public: _CONSTEXPR20 _Vb_reference(const _Vb_reference&) = default; diff --git a/tests/std/tests/Dev10_860410_bitset_ctors/test.cpp b/tests/std/tests/Dev10_860410_bitset_ctors/test.cpp index 283dedc4a51..8121cab24df 100644 --- a/tests/std/tests/Dev10_860410_bitset_ctors/test.cpp +++ b/tests/std/tests/Dev10_860410_bitset_ctors/test.cpp @@ -12,6 +12,25 @@ using namespace std; #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) +// Also test LWG-4140 "Useless default constructors for bit reference types" for bitset::reference. +namespace lwg_4140 { + struct default_constructible_type {}; + + void test_default_constructor(default_constructible_type) {} + void test_default_constructor(bitset<0>::reference) {} + void test_default_constructor(bitset<1>::reference) {} + void test_default_constructor(bitset<8>::reference) {} + void test_default_constructor(bitset<16>::reference) {} + void test_default_constructor(bitset<32>::reference) {} + void test_default_constructor(bitset<48>::reference) {} + void test_default_constructor(bitset<64>::reference) {} + void test_default_constructor(bitset<96>::reference) {} + + void test() { // COMPILE-ONLY + test_default_constructor({}); + } +} // namespace lwg_4140 + const char parsedStr[] = "1000110111110011110111111111111111010111110111100101010100001001" "1111111111111111111111111111111111111111111111111111111111111111" "0111111111111111111111111111111111111111111111111111111111111111" diff --git a/tests/std/tests/Dev11_0437519_container_requirements/test.compile.pass.cpp b/tests/std/tests/Dev11_0437519_container_requirements/test.compile.pass.cpp index bfce3726daf..97ba3180c29 100644 --- a/tests/std/tests/Dev11_0437519_container_requirements/test.compile.pass.cpp +++ b/tests/std/tests/Dev11_0437519_container_requirements/test.compile.pass.cpp @@ -3031,6 +3031,23 @@ void assert_vector_bool_noexcept() { assert_vector_bool_noexcept_impl>(); } +// Also test LWG-4140 "Useless default constructors for bit reference types" for vector::reference. +namespace lwg_4140 { + struct default_constructible_type {}; + + void test_default_constructor(default_constructible_type) {} + void test_default_constructor(std::vector::reference) {} + void test_default_constructor(std::vector>::reference) {} + void test_default_constructor(std::vector>::reference) {} +#if _HAS_CXX17 + void test_default_constructor(std::pmr::vector::reference) {} +#endif // _HAS_CXX17 + + void test() { + test_default_constructor({}); + } +} // namespace lwg_4140 + template void assert_container() { check_all_container_requirements();