[llvm] [ADT] Add operator! to BitmaskEnum (PR #139958)

via llvm-commits llvm-commits at lists.llvm.org
Wed May 14 13:33:11 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-adt

Author: Krzysztof Parzyszek (kparzysz)

<details>
<summary>Changes</summary>

Add a logical (boolean) "not" operator.

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


2 Files Affected:

- (modified) llvm/include/llvm/ADT/BitmaskEnum.h (+6) 
- (modified) llvm/unittests/ADT/BitmaskEnumTest.cpp (+11) 


``````````diff
diff --git a/llvm/include/llvm/ADT/BitmaskEnum.h b/llvm/include/llvm/ADT/BitmaskEnum.h
index dcb13bd8ba51a..7214f25b0aa10 100644
--- a/llvm/include/llvm/ADT/BitmaskEnum.h
+++ b/llvm/include/llvm/ADT/BitmaskEnum.h
@@ -92,6 +92,7 @@
   using ::llvm::BitmaskEnumDetail::operator^=;                                 \
   using ::llvm::BitmaskEnumDetail::operator<<=;                                \
   using ::llvm::BitmaskEnumDetail::operator>>=;                                \
+  using ::llvm::BitmaskEnumDetail::operator!;                                  \
   /* Force a semicolon at the end of this macro. */                            \
   using ::llvm::BitmaskEnumDetail::any
 
@@ -141,6 +142,11 @@ constexpr unsigned bitWidth(uint64_t Value) {
   return Value ? 1 + bitWidth(Value >> 1) : 0;
 }
 
+template <typename E, typename = std::enable_if_t<is_bitmask_enum<E>::value>>
+constexpr bool operator!(E Val) {
+  return Val == static_cast<E>(0);
+}
+
 template <typename E, typename = std::enable_if_t<is_bitmask_enum<E>::value>>
 constexpr bool any(E Val) {
   return Val != static_cast<E>(0);
diff --git a/llvm/unittests/ADT/BitmaskEnumTest.cpp b/llvm/unittests/ADT/BitmaskEnumTest.cpp
index 2c0a80342a54c..b1ef8482416a9 100644
--- a/llvm/unittests/ADT/BitmaskEnumTest.cpp
+++ b/llvm/unittests/ADT/BitmaskEnumTest.cpp
@@ -176,6 +176,17 @@ TEST(BitmaskEnumTest, BitwiseNot) {
   EXPECT_EQ(15, ~V0);
 }
 
+TEST(BitmaskEnumTest, BooleanNot) {
+  bool b0 = !F0;
+  EXPECT_TRUE(b0);
+
+  bool b1 = !(F1 & F2);
+  EXPECT_TRUE(b1);
+
+  bool b2 = !(F2 | F4);
+  EXPECT_FALSE(b2);
+}
+
 enum class FlagsClass {
   F0 = 0,
   F1 = 1,

``````````

</details>


https://github.com/llvm/llvm-project/pull/139958


More information about the llvm-commits mailing list