summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qobject_p.h
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 /src/corelib/kernel/qobject_p.h
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>
Diffstat (limited to 'src/corelib/kernel/qobject_p.h')
-rw-r--r--src/corelib/kernel/qobject_p.h24
1 files changed, 24 insertions, 0 deletions
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