[libcxx-commits] [libcxx] [libc++] Mark vector<bool>::at() as constexpr to conform to C++20 standard (PR #121848)

Peng Liu via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jan 6 14:04:34 PST 2025


https://github.com/winner245 created https://github.com/llvm/llvm-project/pull/121848

Closes #121844.

>From ae6399b23e217906171d86642598036de88ac8c2 Mon Sep 17 00:00:00 2001
From: Peng Liu <winner245 at hotmail.com>
Date: Mon, 6 Jan 2025 16:30:53 -0500
Subject: [PATCH] Mark vector<bool>::at() as constexpr

---
 libcxx/include/__vector/vector_bool.h         |  9 ++--
 .../vector.bool/at.constexpr.pass.cpp         | 42 +++++++++++++++++++
 2 files changed, 47 insertions(+), 4 deletions(-)
 create mode 100644 libcxx/test/std/containers/sequences/vector.bool/at.constexpr.pass.cpp

diff --git a/libcxx/include/__vector/vector_bool.h b/libcxx/include/__vector/vector_bool.h
index 525fc35b26cc9e..132de16b080394 100644
--- a/libcxx/include/__vector/vector_bool.h
+++ b/libcxx/include/__vector/vector_bool.h
@@ -279,8 +279,8 @@ class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator> {
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __n) const {
     return __make_ref(__n);
   }
-  _LIBCPP_HIDE_FROM_ABI reference at(size_type __n);
-  _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __n) const;
+  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference at(size_type __n);
+  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference at(size_type __n) const;
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference front() { return __make_ref(0); }
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference front() const { return __make_ref(0); }
@@ -854,14 +854,15 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::shrink_to_fit() _NO
 }
 
 template <class _Allocator>
-typename vector<bool, _Allocator>::reference vector<bool, _Allocator>::at(size_type __n) {
+_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::reference vector<bool, _Allocator>::at(size_type __n) {
   if (__n >= size())
     this->__throw_out_of_range();
   return (*this)[__n];
 }
 
 template <class _Allocator>
-typename vector<bool, _Allocator>::const_reference vector<bool, _Allocator>::at(size_type __n) const {
+_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::const_reference
+vector<bool, _Allocator>::at(size_type __n) const {
   if (__n >= size())
     this->__throw_out_of_range();
   return (*this)[__n];
diff --git a/libcxx/test/std/containers/sequences/vector.bool/at.constexpr.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/at.constexpr.pass.cpp
new file mode 100644
index 00000000000000..cc9ce99f9488b5
--- /dev/null
+++ b/libcxx/test/std/containers/sequences/vector.bool/at.constexpr.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// constexpr const_reference at(size_type n) const;
+// constexpr reference at(size_type n);
+
+#include <cassert>
+#include <memory>
+#include <vector>
+
+#include "min_allocator.h"
+#include "test_allocator.h"
+
+template <typename T, typename Allocator>
+constexpr void test() {
+  std::vector<T, Allocator> v{1, 0, 1};
+  assert(v.at(0) == 1);
+  assert(v.at(1) == 0);
+  assert(v.at(2) == 1);
+}
+
+constexpr bool tests() {
+  test<bool, std::allocator<bool>>();
+  test<bool, min_allocator<bool>>();
+  test<bool, test_allocator<bool>>();
+
+  return true;
+}
+
+int main(int, char**) {
+  tests();
+  static_assert(tests());
+
+  return 0;
+}



More information about the libcxx-commits mailing list