summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <[email protected]>2024-07-13 18:55:39 +0200
committerGiuseppe D'Angelo <[email protected]>2024-07-31 17:21:20 +0200
commit1f77e8566f71d98f4bc6bbf5092594e67a32f268 (patch)
tree67943d0e0f93fc84d0db55720fbc5676b8c576a6
parent1f1f726c79ca4d539932e078857a36e8836d474b (diff)
QKeyCombination: move the operators into namespace Qt
QKeyCombination comes with a few operators that combine a Qt::Modifier and a Qt::Key. These operators are normally defined in Qt's own namespace (which by default is the global namespace), but indeed the arguments are declared in the (nested) namespace `Qt`. This is wrong, as their lookup will fail if a user places an unrelated operator| in a custom namespace U and then tries to use QKeyCombination's operators: the overload in namespace U will hide the ones defined globally; unqualified lookup (as per [over.match.oper]) will search in the namespaces associated with the parameters (QtNamespace::Qt), but the operators are *not* in there! In other words: namespace NS { X operator|(Y, Z); auto kc = Qt::Shift | Qt::Key_A; } fails to compile if QKeyCombination's operator| is *not* defined in the `Qt` namespace. Fix this by indeed defining the operator where it belongs. The functions are all inline and non-exported so there should not be any ABI issues. Change-Id: I6d7a4e976fb109b7bf514011142b9a9573e507c5 Pick-to: 6.8 6.7 6.5 6.2 Fixes: QTBUG-126820 Reviewed-by: Volker Hilsheimer <[email protected]>
-rw-r--r--src/corelib/global/qnamespace.h2
-rw-r--r--src/corelib/global/qnamespace.qdoc32
-rw-r--r--tests/auto/corelib/global/qkeycombination/tst_qkeycombination.cpp11
3 files changed, 29 insertions, 16 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index f5bb2ad921f..4c3176e75d0 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -1925,6 +1925,7 @@ private:
Q_DECLARE_TYPEINFO(QKeyCombination, Q_RELOCATABLE_TYPE);
+namespace Qt {
constexpr QKeyCombination operator|(Qt::Modifier modifier, Qt::Key key) noexcept
{
return QKeyCombination(modifier, key);
@@ -2014,6 +2015,7 @@ constexpr QKeyCombination operator+(Qt::Key key, Qt::KeyboardModifiers modifiers
return QKeyCombination(modifiers, key);
}
#endif
+}
QT_END_NAMESPACE
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 64da69c0ac1..231087350e7 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -3512,10 +3512,10 @@
*/
/*!
- \fn QKeyCombination operator|(Qt::Modifier modifier, Qt::Key key) noexcept
- \fn QKeyCombination operator|(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
- \fn QKeyCombination operator|(Qt::Key key, Qt::Modifier modifier) noexcept
- \fn QKeyCombination operator|(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::Modifier modifier, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::Key key, Qt::Modifier modifier) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
\relates QKeyCombination
@@ -3524,10 +3524,10 @@
*/
/*!
- \fn QKeyCombination operator|(Qt::Modifiers modifiers, Qt::Key key) noexcept
- \fn QKeyCombination operator|(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
- \fn QKeyCombination operator|(Qt::Key key, Qt::Modifiers modifiers) noexcept
- \fn QKeyCombination operator|(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::Modifiers modifiers, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::Key key, Qt::Modifiers modifiers) noexcept
+ \fn QKeyCombination Qt::operator|(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
\relates QKeyCombination
@@ -3536,10 +3536,10 @@
*/
/*!
- \fn QKeyCombination operator+(Qt::Modifier modifier, Qt::Key key) noexcept
- \fn QKeyCombination operator+(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
- \fn QKeyCombination operator+(Qt::Key key, Qt::Modifier modifier) noexcept
- \fn QKeyCombination operator+(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::Modifier modifier, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::Key key, Qt::Modifier modifier) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
\relates QKeyCombination
\deprecated
@@ -3551,10 +3551,10 @@
*/
/*!
- \fn QKeyCombination operator+(Qt::Modifiers modifiers, Qt::Key key) noexcept
- \fn QKeyCombination operator+(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
- \fn QKeyCombination operator+(Qt::Key key, Qt::Modifiers modifiers) noexcept
- \fn QKeyCombination operator+(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::Modifiers modifiers, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::Key key, Qt::Modifiers modifiers) noexcept
+ \fn QKeyCombination Qt::operator+(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
\relates QKeyCombination
\deprecated
diff --git a/tests/auto/corelib/global/qkeycombination/tst_qkeycombination.cpp b/tests/auto/corelib/global/qkeycombination/tst_qkeycombination.cpp
index 9941f8e1545..926f919ac9a 100644
--- a/tests/auto/corelib/global/qkeycombination/tst_qkeycombination.cpp
+++ b/tests/auto/corelib/global/qkeycombination/tst_qkeycombination.cpp
@@ -274,6 +274,17 @@ void tst_QKeyCombination::operator_or()
QCOMPARE(Qt::ControlModifier | Qt::Key_Escape, QKeyCombination(Qt::ControlModifier, Qt::Key_Escape));
}
+namespace QTBUG_126820 {
+struct S {};
+S operator|(S, S);
+S operator+(S, S);
+
+[[maybe_unused]] constexpr QKeyCombination kc1 = Qt::SHIFT | Qt::Key_A;
+#if QT_DEPRECATED_SINCE(6, 0)
+[[maybe_unused]] constexpr QKeyCombination kc2 = Qt::SHIFT + Qt::Key_A;
+#endif
+}
+
QTEST_APPLESS_MAIN(tst_QKeyCombination)
#include "tst_qkeycombination.moc"