summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-02-11 16:31:10 +0100
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-02-14 12:43:01 +0100
commitbace97aa5ba382191ccc616b33bbb11fe2b72f2b (patch)
treed258ee507e04562259d8ee61b912060d2bb034ed
parenta2206b74aedb14f8938ccad2c26d0c22cfe91963 (diff)
Improve error message when mixing incompatible Qt library versions
The implementation of the check has been moved to a single helper function. The reason for doing this check in QWidgetPrivate as well, when it's already done in QObjectPrivate, is to catch incompatible libraries where QtWidgets is the odd one out, e.g.: QtSomeModule 5.15.0 -> QtWidget 5.15.1 -> QtCore 5.15.0 Technically any non-final subclass of QObjectPrivate should have this check. Change-Id: Ia74064ad27de7335040a6d6b37d11574f818c878 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/kernel/qobject.cpp10
-rw-r--r--src/corelib/kernel/qobject_p.h24
-rw-r--r--src/widgets/kernel/qwidget.cpp10
3 files changed, 26 insertions, 18 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index a51b794604..a8e2c43934 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -184,15 +184,7 @@ QMetaObject *QObjectData::dynamicMetaObject() const
QObjectPrivate::QObjectPrivate(int version)
: threadData(nullptr), currentChildBeingDeleted(nullptr)
{
-#ifdef QT_BUILD_INTERNAL
- // Don't check the version parameter in internal builds.
- // This allows incompatible versions to be loaded, possibly for testing.
- Q_UNUSED(version);
-#else
- if (Q_UNLIKELY(version != QObjectPrivateVersion))
- qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
- version, QObjectPrivateVersion);
-#endif
+ checkForIncompatibleLibraryVersion(version);
// QObjectData initialization
q_ptr = nullptr;
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 838a9aa8c5..34b7447d5d 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -322,6 +322,8 @@ public:
virtual ~QObjectPrivate();
void deleteChildren();
+ inline void checkForIncompatibleLibraryVersion(int version) const;
+
void setParent_helper(QObject *);
void moveToThread_helper();
void setThreadData_helper(QThreadData *currentData, QThreadData *targetData);
@@ -396,6 +398,28 @@ public:
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_MOVABLE_TYPE);
+/*
+ Catch mixing of incompatible library versions.
+
+ Should be called from the constructor of every non-final subclass
+ of QObjectPrivate, to ensure we catch incompatibilities between
+ the intermediate base and subclasses thereof.
+*/
+inline void QObjectPrivate::checkForIncompatibleLibraryVersion(int version) const
+{
+#if defined(QT_BUILD_INTERNAL)
+ // Don't check the version parameter in internal builds.
+ // This allows incompatible versions to be loaded, possibly for testing.
+ Q_UNUSED(version);
+#else
+ if (Q_UNLIKELY(version != QObjectPrivateVersion)) {
+ qFatal("Cannot mix incompatible Qt library (%d.%d.%d) with this library (%d.%d.%d)",
+ (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff,
+ (QObjectPrivateVersion >> 16) & 0xff, (QObjectPrivateVersion >> 8) & 0xff, QObjectPrivateVersion & 0xff);
+ }
+#endif
+}
+
inline bool QObjectPrivate::isDeclarativeSignalConnected(uint signal_index) const
{
return declarativeData && QAbstractDeclarativeData::isSignalConnected
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index fdad879209..4ca2e996ad 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -191,15 +191,7 @@ QWidgetPrivate::QWidgetPrivate(int version)
return;
}
-#ifdef QT_BUILD_INTERNAL
- // Don't check the version parameter in internal builds.
- // This allows incompatible versions to be loaded, possibly for testing.
- Q_UNUSED(version);
-#else
- if (Q_UNLIKELY(version != QObjectPrivateVersion))
- qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
- version, QObjectPrivateVersion);
-#endif
+ checkForIncompatibleLibraryVersion(version);
isWidget = true;
memset(high_attributes, 0, sizeof(high_attributes));