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,