[libcxx-commits] [libcxx] [libc++] Make sure `flat_set::key_compare` handle `boolean-testable` correctly (PR #132622)

Hewill Kang via libcxx-commits libcxx-commits at lists.llvm.org
Mon May 19 08:28:52 PDT 2025


https://github.com/hewillk updated https://github.com/llvm/llvm-project/pull/132622

>From cc53c5452a926be9bcd99d142e0d6565d85230ba Mon Sep 17 00:00:00 2001
From: Hewill Kang <hewillk at gmail.com>
Date: Mon, 24 Mar 2025 01:22:21 +0800
Subject: [PATCH 1/2] Make sure compare handle boolean-testable correctly

---
 libcxx/include/__flat_set/flat_set.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libcxx/include/__flat_set/flat_set.h b/libcxx/include/__flat_set/flat_set.h
index cc45db7565bd4..9074e9e9cf241 100644
--- a/libcxx/include/__flat_set/flat_set.h
+++ b/libcxx/include/__flat_set/flat_set.h
@@ -602,7 +602,7 @@ class flat_set {
 
 private:
   _LIBCPP_HIDE_FROM_ABI bool __is_sorted_and_unique(auto&& __key_container) const {
-    auto __greater_or_equal_to = [this](const auto& __x, const auto& __y) { return !__compare_(__x, __y); };
+    auto __greater_or_equal_to = [this](const auto& __x, const auto& __y) -> bool { return !__compare_(__x, __y); };
     return ranges::adjacent_find(__key_container, __greater_or_equal_to) == ranges::end(__key_container);
   }
 

>From 7e1bdf82920b2157b729e6e8e0a47e5a0cb2e5dd Mon Sep 17 00:00:00 2001
From: Hui Xie <hui.xie1990 at gmail.com>
Date: Sun, 18 May 2025 14:28:54 +0100
Subject: [PATCH 2/2] added test

---
 .../robust_against_nonbool.compile.pass.cpp   | 44 +++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 libcxx/test/std/containers/container.adaptors/flat.set/robust_against_nonbool.compile.pass.cpp

diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/robust_against_nonbool.compile.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/robust_against_nonbool.compile.pass.cpp
new file mode 100644
index 0000000000000..48d923098b9a6
--- /dev/null
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/robust_against_nonbool.compile.pass.cpp
@@ -0,0 +1,44 @@
+//===----------------------------------------------------------------------===//
+//
+// 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, c++20
+
+// <flat_set>
+//
+// flat_set should support comparator that return a non-boolean
+// value as long as the returned type is implicitly convertible to bool.
+
+#include <flat_set>
+#include <vector>
+#include <ranges>
+
+#include "boolean_testable.h"
+
+void test() {
+  using Key = StrictComparable<int>;
+  std::vector<Key> v;
+  std::flat_set<Key> m1;
+  std::flat_set m2(std::from_range, v, StrictBinaryPredicate);
+  std::flat_set m3(std::sorted_unique, v, StrictBinaryPredicate);
+  std::flat_set m4(m1.begin(), m1.end(), StrictBinaryPredicate);
+  m2.insert(m1.begin(), m1.end());
+  m2.insert(std::sorted_unique, m1.begin(), m1.end());
+  m2.insert_range(m1);
+  m3.insert(1);
+  m2.emplace(1);
+  m2.emplace_hint(m2.begin(), 1);
+  for (const auto& k : m2) {
+    (void)k;
+  }
+  (void)m2.find(Key{1});
+  (void)m2.equal_range(Key{1});
+  (void)(m2 == m2);
+  m2.erase(m2.begin());
+  m2.erase(m2.begin(), m2.end());
+  std::erase_if(m2, []<class T>(const StrictComparable<T>&) -> BooleanTestable const& { return yes; });
+}



More information about the libcxx-commits mailing list