Skip to content

[libc++] Verify that LWG4140 is implemented #128624

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 6, 2025

Conversation

frederick-vs-ja
Copy link
Contributor

According to the commit history, the constructors removed by LWG4140 have never been added to libc++.

Existence of non-public or deleted default constructor is observable, this patch tests that there's no such default constructor at all.

Closes #118356.

According to the commit history, the constructors removed by LWG4140
have never been added to libc++.

Existence of non-public or deleted default constructor is observable,
this patch tests that there're no such default constructor at all.
@frederick-vs-ja frederick-vs-ja requested a review from a team as a code owner February 25, 2025 04:21
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Feb 25, 2025
@llvmbot
Copy link
Member

llvmbot commented Feb 25, 2025

@llvm/pr-subscribers-libcxx

Author: A. Jiang (frederick-vs-ja)

Changes

According to the commit history, the constructors removed by LWG4140 have never been added to libc++.

Existence of non-public or deleted default constructor is observable, this patch tests that there's no such default constructor at all.

Closes #118356.


Full diff: https://github.com/llvm/llvm-project/pull/128624.diff

3 Files Affected:

  • (modified) libcxx/docs/Status/Cxx2cIssues.csv (+1-1)
  • (added) libcxx/test/std/containers/sequences/vector.bool/reference/ctor_no_default.compile.pass.cpp (+26)
  • (added) libcxx/test/std/utilities/template.bitset/bitset.members/reference.ctor_no_default.compile.pass.cpp (+41)
diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 1ec23dfabd5ea..731cee8df2cf3 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -98,7 +98,7 @@
 "`LWG4126 <https://wg21.link/LWG4126>`__","Some feature-test macros for fully freestanding features are not yet marked freestanding","2024-11 (Wrocław)","","",""
 "`LWG4134 <https://wg21.link/LWG4134>`__","Issue with Philox algorithm specification","2024-11 (Wrocław)","","",""
 "`LWG4135 <https://wg21.link/LWG4135>`__","The helper lambda of ``std::erase`` for list should specify return type as ``bool``","2024-11 (Wrocław)","","",""
-"`LWG4140 <https://wg21.link/LWG4140>`__","Useless default constructors for bit reference types","2024-11 (Wrocław)","","",""
+"`LWG4140 <https://wg21.link/LWG4140>`__","Useless default constructors for bit reference types","2024-11 (Wrocław)","|Complete|","",""
 "`LWG4141 <https://wg21.link/LWG4141>`__","Improve prohibitions on ""additional storage""","2024-11 (Wrocław)","","",""
 "`LWG4142 <https://wg21.link/LWG4142>`__","``format_parse_context::check_dynamic_spec`` should require at least one type","2024-11 (Wrocław)","","",""
 "`LWG4144 <https://wg21.link/LWG4144>`__","Disallow ``unique_ptr<T&, D>``","2024-11 (Wrocław)","","",""
diff --git a/libcxx/test/std/containers/sequences/vector.bool/reference/ctor_no_default.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/reference/ctor_no_default.compile.pass.cpp
new file mode 100644
index 0000000000000..a55caf28c8706
--- /dev/null
+++ b/libcxx/test/std/containers/sequences/vector.bool/reference/ctor_no_default.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <vector>
+
+#include <vector>
+#include <type_traits>
+
+#include "test_allocator.h"
+#include "test_macros.h"
+
+static_assert(!std::is_default_constructible<std::vector<bool>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::vector<bool, test_allocator<bool> >::reference>::value, "");
+
+#if TEST_STD_VER >= 11
+void test_no_ambiguity_among_default_constructors(std::enable_if<false>);
+void test_no_ambiguity_among_default_constructors(std::vector<bool>::reference);
+void test_no_ambiguity_among_default_constructors(std::vector<bool, test_allocator<bool>>::reference);
+
+ASSERT_SAME_TYPE(decltype(test_no_ambiguity_among_default_constructors({})), void);
+#endif
diff --git a/libcxx/test/std/utilities/template.bitset/bitset.members/reference.ctor_no_default.compile.pass.cpp b/libcxx/test/std/utilities/template.bitset/bitset.members/reference.ctor_no_default.compile.pass.cpp
new file mode 100644
index 0000000000000..68d6380c09b50
--- /dev/null
+++ b/libcxx/test/std/utilities/template.bitset/bitset.members/reference.ctor_no_default.compile.pass.cpp
@@ -0,0 +1,41 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <bitset>
+
+#include <bitset>
+#include <type_traits>
+
+#include "test_macros.h"
+
+static_assert(!std::is_default_constructible<std::bitset<0>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<1>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<8>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<12>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<16>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<24>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<32>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<48>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<64>::reference>::value, "");
+static_assert(!std::is_default_constructible<std::bitset<96>::reference>::value, "");
+
+#if TEST_STD_VER >= 11
+void test_no_ambiguity_among_default_constructors(std::enable_if<false>);
+void test_no_ambiguity_among_default_constructors(std::bitset<0>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<1>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<8>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<12>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<16>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<24>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<32>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<48>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<64>::reference);
+void test_no_ambiguity_among_default_constructors(std::bitset<96>::reference);
+
+ASSERT_SAME_TYPE(decltype(test_no_ambiguity_among_default_constructors({})), void);
+#endif

Copy link
Member

@mordante mordante left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! LGTM!

@frederick-vs-ja frederick-vs-ja merged commit 27e686c into llvm:main Mar 6, 2025
84 checks passed
@frederick-vs-ja frederick-vs-ja deleted the lwg-4140 branch March 6, 2025 06:01
jph-13 pushed a commit to jph-13/llvm-project that referenced this pull request Mar 21, 2025
According to the commit history, the constructors removed by LWG4140
have never been added to libc++.

Existence of non-public or deleted default constructor is observable,
this patch tests that there's no such default constructor at all.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. test-suite
Projects
None yet
Development

Successfully merging this pull request may close these issues.

LWG4140: Useless default constructors for bit reference types
4 participants