diff --git a/src/corelib/global/qflags.h b/src/corelib/global/qflags.h index 7f96d900fbd..5e27ea9304e 100644 --- a/src/corelib/global/qflags.h +++ b/src/corelib/global/qflags.h @@ -233,6 +233,10 @@ constexpr inline QFlags operator&(Flags::enum_type f1, Flags:: { return QFlags(f1) & f2; } \ constexpr inline QFlags operator&(Flags::enum_type f1, QFlags f2) noexcept \ { return f2 & f1; } \ +constexpr inline QFlags operator^(Flags::enum_type f1, Flags::enum_type f2) noexcept \ +{ return QFlags(f1) ^ f2; } \ +constexpr inline QFlags operator^(Flags::enum_type f1, QFlags f2) noexcept \ +{ return f2 ^ f1; } \ constexpr inline void operator+(Flags::enum_type f1, Flags::enum_type f2) noexcept = delete; \ constexpr inline void operator+(Flags::enum_type f1, QFlags f2) noexcept = delete; \ constexpr inline void operator+(int f1, QFlags f2) noexcept = delete; \ diff --git a/tests/auto/corelib/global/qflags/tst_qflags.cpp b/tests/auto/corelib/global/qflags/tst_qflags.cpp index 3179cfc9d22..881c407a36b 100644 --- a/tests/auto/corelib/global/qflags/tst_qflags.cpp +++ b/tests/auto/corelib/global/qflags/tst_qflags.cpp @@ -33,6 +33,7 @@ class tst_QFlags: public QObject { Q_OBJECT private slots: + void operators() const; void testFlag() const; void testFlagZeroFlag() const; void testFlagMultiBits() const; @@ -46,6 +47,28 @@ private slots: void adl(); }; +void tst_QFlags::operators() const +{ +#define CHECK(op, LHS, RHS, RES) \ + do { \ + QCOMPARE((LHS op RHS), (RES)); \ + QCOMPARE(( /*CTAD*/ QFlags(LHS) op RHS), (RES)); \ + QCOMPARE((LHS op QFlags(RHS)), (RES)); \ + QCOMPARE((QFlags(LHS) op QFlags(RHS)), (RES)); \ + QCOMPARE((QFlags(LHS) op ## = RHS), (RES)); \ + QCOMPARE((QFlags(LHS) op ## = QFlags(RHS)), (RES)); \ + } while (false) + + CHECK(|, Qt::AlignHCenter, Qt::AlignVCenter, Qt::AlignCenter); + CHECK(|, Qt::AlignHCenter, Qt::AlignHCenter, Qt::AlignHCenter); + CHECK(&, Qt::AlignHCenter, Qt::AlignVCenter, Qt::Alignment()); + CHECK(&, Qt::AlignHCenter, Qt::AlignHCenter, Qt::AlignHCenter); + CHECK(^, Qt::AlignHCenter, Qt::AlignVCenter, Qt::AlignCenter); + CHECK(^, Qt::AlignHCenter, Qt::AlignHCenter, Qt::Alignment()); + +#undef CHECK +} + void tst_QFlags::testFlag() const { Qt::MouseButtons btn = Qt::LeftButton | Qt::RightButton;