From 82d0e1fa3604a69030f89cc672eff962a4221145 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Wed, 14 May 2025 14:35:04 -0500 Subject: [PATCH] [ADT] Add operator! to BitmaskEnum Add a logical (boolean) "not" operator. --- llvm/include/llvm/ADT/BitmaskEnum.h | 6 ++++++ llvm/unittests/ADT/BitmaskEnumTest.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+) 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 ::value>> +constexpr bool operator!(E Val) { + return Val == static_cast(0); +} + template ::value>> constexpr bool any(E Val) { return Val != static_cast(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,