[libcxx-commits] [libcxx] [libc++] Backport implementation of LWG2187 (PR #222006)
A. Jiang via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Sep 8 06:57:59 PDT 2026
https://github.com/frederick-vs-ja created https://github.com/llvm/llvm-project/pull/222006
libc++ has LWG2187 implemented in 2d6e2834a8abcce862ef17c44f62e4de41662748 but only since C++14 mode. Usually, resolution of an LWG issue should be treated as a Defect Report and applied to old modes. In the case of LWG2187, the resolution should be applied to C++11.
Additionally, this patch makes `vector<bool, A>`'s `emplace` and `emplace_back` also available in C++03 mode (using non-frozen headers), because we have been doing so for the primary `vector` template.
>From 32e99d89336044634b282fb18c9cb613e3c613bb Mon Sep 17 00:00:00 2001
From: "A. Jiang" <de34 at live.cn>
Date: Tue, 8 Sep 2026 21:51:33 +0800
Subject: [PATCH] [libc++] Backport implementation of LWG2187
libc++ has LWG2187 implemented in
2d6e2834a8abcce862ef17c44f62e4de41662748 but only since C++14 mode.
Usually, resolution of an LWG issue should be treated as a Defect Report
and applied to old modes. In the case of LWG2187, the resolution should
be applied to C++11.
Additionally, this patch makes `vector<bool, A>`'s `emplace` and
`emplace_back` also available in C++03 mode (using non-frozen headers),
because we have been doing so for the primary `vector` template.
---
libcxx/include/__vector/vector_bool.h | 15 ++++++---------
libcxx/include/vector | 4 ++--
.../sequences/vector.bool/emplace.pass.cpp | 3 ++-
.../sequences/vector.bool/emplace_back.pass.cpp | 3 ++-
4 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/libcxx/include/__vector/vector_bool.h b/libcxx/include/__vector/vector_bool.h
index 6269ec287f7f9..0c7f514b4d9d7 100644
--- a/libcxx/include/__vector/vector_bool.h
+++ b/libcxx/include/__vector/vector_bool.h
@@ -322,20 +322,19 @@ class _LIBCPP_WARN_UNUSED vector<bool, _Allocator> {
}
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void push_back(const value_type& __x);
-#if _LIBCPP_STD_VER >= 14
+
template <class... _Args>
-# if _LIBCPP_STD_VER >= 17
+#if _LIBCPP_STD_VER >= 17
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference emplace_back(_Args&&... __args)
-# else
+#else
_LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args)
-# endif
+#endif
{
push_back(value_type(std::forward<_Args>(__args)...));
-# if _LIBCPP_STD_VER >= 17
+#if _LIBCPP_STD_VER >= 17
return this->back();
-# endif
- }
#endif
+ }
#if _LIBCPP_STD_VER >= 23
template <_ContainerCompatibleRange<bool> _Range>
@@ -349,12 +348,10 @@ class _LIBCPP_WARN_UNUSED vector<bool, _Allocator> {
--__size_;
}
-#if _LIBCPP_STD_VER >= 14
template <class... _Args>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator emplace(const_iterator __position, _Args&&... __args) {
return insert(__position, value_type(std::forward<_Args>(__args)...));
}
-#endif
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator insert(const_iterator __position, const value_type& __x);
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator
diff --git a/libcxx/include/vector b/libcxx/include/vector
index 0fb45f67be5f2..271ec9976d733 100644
--- a/libcxx/include/vector
+++ b/libcxx/include/vector
@@ -230,12 +230,12 @@ public:
const_reference back() const;
void push_back(const value_type& x);
- template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17
+ template <class... Args> reference emplace_back(Args&&... args); // returns void/reference until/since C++17
template<container-compatible-range<T> R>
constexpr void append_range(R&& rg); // C++23
void pop_back();
- template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14
+ template <class... Args> iterator emplace(const_iterator position, Args&&... args);
iterator insert(const_iterator position, const value_type& x);
iterator insert(const_iterator position, size_type n, const value_type& x);
template <class InputIterator>
diff --git a/libcxx/test/std/containers/sequences/vector.bool/emplace.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/emplace.pass.cpp
index 810a1968605d8..0f6c1cef4d13e 100644
--- a/libcxx/test/std/containers/sequences/vector.bool/emplace.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector.bool/emplace.pass.cpp
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
-// UNSUPPORTED: c++03, c++11
+// XFAIL: FROZEN-CXX03-HEADERS-FIXME
+
// <vector>
// vector<bool>
diff --git a/libcxx/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp
index 87da6fd9f6019..783789a78c018 100644
--- a/libcxx/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
-// UNSUPPORTED: c++03, c++11
+// XFAIL: FROZEN-CXX03-HEADERS-FIXME
+
// <vector>
// vector.bool
More information about the libcxx-commits
mailing list