summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2019-05-13 08:04:58 +0200
committerLiang Qi <liang.qi@qt.io>2019-05-13 08:04:58 +0200
commit388fe97f2a54089544dff0ed3af6ca70bf604716 (patch)
tree163b47974c625849726804337bd667c942dfbc77 /src/corelib/kernel
parenta0c4b6f34546bdd22167a76a0540d37e9a37c0cf (diff)
parent591116490cf313808e8ba05ddd066656a1d1a566 (diff)
Merge remote-tracking branch 'origin/5.13' into dev
Conflicts: src/corelib/tools/qstring.cpp Change-Id: I81dbf90fc936c9bf08197baefa071117bddb1c63
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp2
-rw-r--r--src/corelib/kernel/qcoreapplication_win.cpp9
-rw-r--r--src/corelib/kernel/qdeadlinetimer.cpp440
-rw-r--r--src/corelib/kernel/qdeadlinetimer.h3
-rw-r--r--src/corelib/kernel/qobject.cpp4
-rw-r--r--src/corelib/kernel/qpointer.cpp8
-rw-r--r--src/corelib/kernel/qvariant.cpp6
7 files changed, 402 insertions, 70 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 7a6faf2e2b..625790abb8 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -690,7 +690,7 @@ void QCoreApplicationPrivate::initLocale()
Returns a pointer to the application's QCoreApplication (or
QGuiApplication/QApplication) instance.
- If no instance has been allocated, \c null is returned.
+ If no instance has been allocated, \nullptr is returned.
*/
/*!
diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp
index b373267fcb..75cc813298 100644
--- a/src/corelib/kernel/qcoreapplication_win.cpp
+++ b/src/corelib/kernel/qcoreapplication_win.cpp
@@ -48,6 +48,7 @@
#include "qmutex.h"
#include <private/qthread_p.h>
#endif
+#include "qtextstream.h"
#include <ctype.h>
#include <qt_windows.h>
@@ -480,6 +481,7 @@ static const char *findWMstr(uint msg)
{ 0x02DD, "WM_TABLET_FIRST + 29" },
{ 0x02DE, "WM_TABLET_FIRST + 30" },
{ 0x02DF, "WM_TABLET_LAST" },
+ { 0x02E0, "WM_DPICHANGED" },
{ 0x0300, "WM_CUT" },
{ 0x0301, "WM_COPY" },
{ 0x0302, "WM_PASTE" },
@@ -765,6 +767,13 @@ QString decodeMSG(const MSG& msg)
case WM_DESTROY:
parameters = QLatin1String("Destroy hwnd ") + hwndS;
break;
+ case 0x02E0u: { // WM_DPICHANGED
+ auto rect = reinterpret_cast<const RECT *>(lParam);
+ QTextStream(&parameters) << "DPI: " << HIWORD(wParam) << ','
+ << LOWORD(wParam) << ' ' << (rect->right - rect->left) << 'x'
+ << (rect->bottom - rect->top) << forcesign << rect->left << rect->top;
+ }
+ break;
case WM_IME_NOTIFY:
{
parameters = QLatin1String("Command(");
diff --git a/src/corelib/kernel/qdeadlinetimer.cpp b/src/corelib/kernel/qdeadlinetimer.cpp
index e0d9d9de73..06b56bb09b 100644
--- a/src/corelib/kernel/qdeadlinetimer.cpp
+++ b/src/corelib/kernel/qdeadlinetimer.cpp
@@ -39,18 +39,294 @@
#include "qdeadlinetimer.h"
#include "qdeadlinetimer_p.h"
+#include "private/qnumeric_p.h"
QT_BEGIN_NAMESPACE
-Q_DECL_CONST_FUNCTION static inline QPair<qint64, qint64> toSecsAndNSecs(qint64 nsecs)
+namespace {
+ class TimeReference
+ {
+ enum : unsigned {
+ umega = 1000 * 1000,
+ ugiga = umega * 1000
+ };
+
+ enum : qint64 {
+ kilo = 1000,
+ mega = kilo * 1000,
+ giga = mega * 1000
+ };
+
+ public:
+ enum RoundingStrategy {
+ RoundDown,
+ RoundUp,
+ RoundDefault = RoundDown
+ };
+
+ static constexpr qint64 Min = std::numeric_limits<qint64>::min();
+ static constexpr qint64 Max = std::numeric_limits<qint64>::max();
+
+ inline TimeReference(qint64 = 0, unsigned = 0);
+ inline void updateTimer(qint64 &, unsigned &);
+
+ inline bool addNanoseconds(qint64);
+ inline bool addMilliseconds(qint64);
+ bool addSecsAndNSecs(qint64, qint64);
+
+ inline bool subtract(const qint64, const unsigned);
+
+ inline bool toMilliseconds(qint64 *, RoundingStrategy = RoundDefault) const;
+ inline bool toNanoseconds(qint64 *) const;
+
+ inline void saturate(bool toMax);
+ static bool sign(qint64, qint64);
+
+ private:
+ bool adjust(const qint64, const unsigned, qint64 = 0);
+
+ private:
+ qint64 secs;
+ unsigned nsecs;
+ };
+}
+
+inline TimeReference::TimeReference(qint64 t1, unsigned t2)
+ : secs(t1), nsecs(t2)
+{
+}
+
+inline void TimeReference::updateTimer(qint64 &t1, unsigned &t2)
+{
+ t1 = secs;
+ t2 = nsecs;
+}
+
+inline void TimeReference::saturate(bool toMax)
+{
+ secs = toMax ? Max : Min;
+}
+
+/*!
+ * \internal
+ *
+ * Determines the sign of a (seconds, nanoseconds) pair
+ * for differentiating overflow from underflow. It doesn't
+ * deal with equality as it shouldn't ever be called in that case.
+ *
+ * Returns true if the pair represents a positive time offset
+ * false otherwise.
+ */
+bool TimeReference::sign(qint64 secs, qint64 nsecs)
+{
+ if (secs > 0) {
+ if (nsecs > 0)
+ return true;
+ } else {
+ if (nsecs < 0)
+ return false;
+ }
+
+ // They are different in sign
+ secs += nsecs / giga;
+ if (secs > 0)
+ return true;
+ else if (secs < 0)
+ return false;
+
+ // We should never get over|underflow out of
+ // the case: secs * giga == -nsecs
+ // So the sign of nsecs is the deciding factor
+ Q_ASSERT(nsecs % giga != 0);
+ return nsecs > 0;
+}
+
+#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
+inline bool TimeReference::addNanoseconds(qint64 arg)
+{
+ return addSecsAndNSecs(arg / giga, arg % giga);
+}
+
+inline bool TimeReference::addMilliseconds(qint64 arg)
+{
+ return addSecsAndNSecs(arg / kilo, (arg % kilo) * mega);
+}
+
+/*!
+ * \internal
+ *
+ * Adds \a t1 addSecs seconds and \a addNSecs nanoseconds to the
+ * time reference. The arguments are normalized to seconds (qint64)
+ * and nanoseconds (unsigned) before the actual calculation is
+ * delegated to adjust(). If the nanoseconds are negative the
+ * owed second used for the normalization is passed on to adjust()
+ * as third argument.
+ *
+ * Returns true if operation was successful, false on over|underflow
+ */
+bool TimeReference::addSecsAndNSecs(qint64 addSecs, qint64 addNSecs)
+{
+ // Normalize the arguments
+ if (qAbs(addNSecs) >= giga) {
+ if (add_overflow<qint64>(addSecs, addNSecs / giga, &addSecs))
+ return false;
+
+ addNSecs %= giga;
+ }
+
+ if (addNSecs < 0)
+ return adjust(addSecs, ugiga - unsigned(-addNSecs), -1);
+
+ return adjust(addSecs, unsigned(addNSecs));
+}
+
+/*!
+ * \internal
+ *
+ * Adds \a t1 seconds and \a t2 nanoseconds to the internal members.
+ * Takes into account the additional \a carrySeconds we may owe or need to carry over.
+ *
+ * Returns true if operation was successful, false on over|underflow
+ */
+bool TimeReference::adjust(const qint64 t1, const unsigned t2, qint64 carrySeconds)
+{
+ Q_STATIC_ASSERT(QDeadlineTimerNanosecondsInT2);
+ nsecs += t2;
+ if (nsecs >= ugiga) {
+ nsecs -= ugiga;
+ carrySeconds++;
+ }
+
+ // We don't worry about the order of addition, because the result returned by
+ // callers of this function is unchanged regardless of us over|underflowing.
+ // If we do, we do so by no more than a second, thus saturating the timer to
+ // Forever has the same effect as if we did the arithmetic exactly and salvaged
+ // the overflow.
+ return !add_overflow<qint64>(secs, t1, &secs) && !add_overflow<qint64>(secs, carrySeconds, &secs);
+}
+
+/*!
+ * \internal
+ *
+ * Subtracts \a t1 seconds and \a t2 nanoseconds from the time reference.
+ * When normalizing the nanoseconds to a positive number the owed seconds is
+ * passed as third argument to adjust() as the seconds may over|underflow
+ * if we do the calculation directly. There is little sense to check the
+ * seconds for over|underflow here in case we are going to need to carry
+ * over a second _after_ we add the nanoseconds.
+ *
+ * Returns true if operation was successful, false on over|underflow
+ */
+inline bool TimeReference::subtract(const qint64 t1, const unsigned t2)
+{
+ Q_ASSERT(t2 < ugiga);
+ return adjust(-t1, ugiga - t2, -1);
+}
+
+/*!
+ * \internal
+ *
+ * Converts the time reference to milliseconds.
+ *
+ * Checks are done without making use of mul_overflow because it may
+ * not be implemented on some 32bit platforms.
+ *
+ * Returns true if operation was successful, false on over|underflow
+ */
+inline bool TimeReference::toMilliseconds(qint64 *result, RoundingStrategy rounding) const
+{
+ static constexpr qint64 maxSeconds = Max / kilo;
+ static constexpr qint64 minSeconds = Min / kilo;
+ if (secs > maxSeconds || secs < minSeconds)
+ return false;
+
+ unsigned ns = rounding == RoundDown ? nsecs : nsecs + umega - 1;
+
+ return !add_overflow<qint64>(secs * kilo, ns / umega, result);
+}
+
+/*!
+ * \internal
+ *
+ * Converts the time reference to nanoseconds.
+ *
+ * Checks are done without making use of mul_overflow because it may
+ * not be implemented on some 32bit platforms.
+ *
+ * Returns true if operation was successful, false on over|underflow
+ */
+inline bool TimeReference::toNanoseconds(qint64 *result) const
+{
+ static constexpr qint64 maxSeconds = Max / giga;
+ static constexpr qint64 minSeconds = Min / giga;
+ if (secs > maxSeconds || secs < minSeconds)
+ return false;
+
+ return !add_overflow<qint64>(secs * giga, nsecs, result);
+}
+#else
+inline bool TimeReference::addNanoseconds(qint64 arg)
+{
+ return adjust(arg, 0);
+}
+
+inline bool TimeReference::addMilliseconds(qint64 arg)
+{
+ static constexpr qint64 maxMilliseconds = Max / mega;
+ if (qAbs(arg) > maxMilliseconds)
+ return false;
+
+ return addNanoseconds(arg * mega);
+}
+
+inline bool TimeReference::addSecsAndNSecs(qint64 addSecs, qint64 addNSecs)
{
- qint64 secs = nsecs / (1000*1000*1000);
- if (nsecs < 0)
- --secs;
- nsecs -= secs * 1000*1000*1000;
- return qMakePair(secs, nsecs);
+ static constexpr qint64 maxSeconds = Max / giga;
+ static constexpr qint64 minSeconds = Min / giga;
+ if (addSecs > maxSeconds || addSecs < minSeconds || add_overflow<qint64>(addSecs * giga, addNSecs, &addNSecs))
+ return false;
+
+ return addNanoseconds(addNSecs);
}
+inline bool TimeReference::adjust(const qint64 t1, const unsigned t2, qint64 carrySeconds)
+{
+ Q_STATIC_ASSERT(!QDeadlineTimerNanosecondsInT2);
+ Q_UNUSED(t2);
+ Q_UNUSED(carrySeconds);
+
+ return !add_overflow<qint64>(secs, t1, &secs);
+}
+
+inline bool TimeReference::subtract(const qint64 t1, const unsigned t2)
+{
+ Q_UNUSED(t2);
+
+ return addNanoseconds(-t1);
+}
+
+inline bool TimeReference::toMilliseconds(qint64 *result, RoundingStrategy rounding) const
+{
+ // Force QDeadlineTimer to treat the border cases as
+ // over|underflow and saturate the results returned to the user.
+ // We don't want to get valid milliseconds out of saturated timers.
+ if (secs == Max || secs == Min)
+ return false;
+
+ *result = secs / mega;
+ if (rounding == RoundUp && secs > *result * mega)
+ (*result)++;
+
+ return true;
+}
+
+inline bool TimeReference::toNanoseconds(qint64 *result) const
+{
+ *result = secs;
+ return true;
+}
+#endif
+
/*!
\class QDeadlineTimer
\inmodule QtCore
@@ -262,10 +538,17 @@ QDeadlineTimer::QDeadlineTimer(qint64 msecs, Qt::TimerType type) noexcept
*/
void QDeadlineTimer::setRemainingTime(qint64 msecs, Qt::TimerType timerType) noexcept
{
- if (msecs == -1)
+ if (msecs == -1) {
*this = QDeadlineTimer(Forever, timerType);
- else
- setPreciseRemainingTime(0, msecs * 1000 * 1000, timerType);
+ return;
+ }
+
+ *this = current(timerType);
+
+ TimeReference ref(t1, t2);
+ if (!ref.addMilliseconds(msecs))
+ ref.saturate(msecs > 0);
+ ref.updateTimer(t1, t2);
}
/*!
@@ -287,16 +570,10 @@ void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, qint64 nsecs, Qt::Time
}
*this = current(timerType);
- if (QDeadlineTimerNanosecondsInT2) {
- t1 += secs + toSecsAndNSecs(nsecs).first;
- t2 += toSecsAndNSecs(nsecs).second;
- if (t2 > 1000*1000*1000) {
- t2 -= 1000*1000*1000;
- ++t1;
- }
- } else {
- t1 += secs * 1000 * 1000 * 1000 + nsecs;
- }
+ TimeReference ref(t1, t2);
+ if (!ref.addSecsAndNSecs(secs, nsecs))
+ ref.saturate(TimeReference::sign(secs, nsecs));
+ ref.updateTimer(t1, t2);
}
/*!
@@ -391,8 +668,22 @@ void QDeadlineTimer::setTimerType(Qt::TimerType timerType)
*/
qint64 QDeadlineTimer::remainingTime() const noexcept
{
- qint64 ns = remainingTimeNSecs();
- return ns <= 0 ? ns : (ns + 999999) / (1000 * 1000);
+ if (isForever())
+ return -1;
+
+ QDeadlineTimer now = current(timerType());
+ TimeReference ref(t1, t2);
+
+ qint64 msecs;
+ if (!ref.subtract(now.t1, now.t2))
+ return 0; // We can only underflow here
+
+ // If we fail the conversion, t1 < now.t1 means we underflowed,
+ // thus the deadline had long expired
+ if (!ref.toMilliseconds(&msecs, TimeReference::RoundUp))
+ return t1 < now.t1 ? 0 : -1;
+
+ return msecs < 0 ? 0 : msecs;
}
/*!
@@ -414,14 +705,23 @@ qint64 QDeadlineTimer::remainingTimeNSecs() const noexcept
/*!
\internal
Same as remainingTimeNSecs, but may return negative remaining times. Does
- not deal with Forever.
+ not deal with Forever. In case of underflow the result is saturated to
+ the minimum possible value, on overflow - the maximum possible value.
*/
qint64 QDeadlineTimer::rawRemainingTimeNSecs() const noexcept
{
QDeadlineTimer now = current(timerType());
- if (QDeadlineTimerNanosecondsInT2)
- return (t1 - now.t1) * (1000*1000*1000) + t2 - now.t2;
- return t1 - now.t1;
+ TimeReference ref(t1, t2);
+
+ qint64 nsecs;
+ if (!ref.subtract(now.t1, now.t2))
+ return TimeReference::Min; // We can only underflow here
+
+ // If we fail the conversion, t1 < now.t1 means we underflowed,
+ // thus the deadline had long expired
+ if (!ref.toNanoseconds(&nsecs))
+ return t1 < now.t1 ? TimeReference::Min : TimeReference::Max;
+ return nsecs;
}
/*!
@@ -447,8 +747,13 @@ qint64 QDeadlineTimer::rawRemainingTimeNSecs() const noexcept
qint64 QDeadlineTimer::deadline() const noexcept
{
if (isForever())
- return t1;
- return deadlineNSecs() / (1000 * 1000);
+ return TimeReference::Max;
+
+ qint64 result;
+ if (!TimeReference(t1, t2).toMilliseconds(&result))
+ return t1 < 0 ? TimeReference::Min : TimeReference::Max;
+
+ return result;
}
/*!
@@ -457,7 +762,8 @@ qint64 QDeadlineTimer::deadline() const noexcept
same as QElapsedTimer::msecsSinceReference(). The value will be in the past
if this QDeadlineTimer has expired.
- If this QDeadlineTimer never expires, this function returns
+ If this QDeadlineTimer never expires or the number of nanoseconds until the
+ deadline can't be accommodated in the return type, this function returns
\c{std::numeric_limits<qint64>::max()}.
This function can be used to calculate the amount of time a timer is
@@ -474,10 +780,13 @@ qint64 QDeadlineTimer::deadline() const noexcept
qint64 QDeadlineTimer::deadlineNSecs() const noexcept
{
if (isForever())
- return t1;
- if (QDeadlineTimerNanosecondsInT2)
- return t1 * 1000 * 1000 * 1000 + t2;
- return t1;
+ return TimeReference::Max;
+
+ qint64 result;
+ if (!TimeReference(t1, t2).toNanoseconds(&result))
+ return t1 < 0 ? TimeReference::Min : TimeReference::Max;
+
+ return result;
}
/*!
@@ -487,18 +796,25 @@ qint64 QDeadlineTimer::deadlineNSecs() const noexcept
timerType. If the value is in the past, this QDeadlineTimer will be marked
as expired.
- If \a msecs is \c{std::numeric_limits<qint64>::max()}, this QDeadlineTimer
- will be set to never expire.
+ If \a msecs is \c{std::numeric_limits<qint64>::max()} or the deadline is
+ beyond a representable point in the future, this QDeadlineTimer will be set
+ to never expire.
\sa setPreciseDeadline(), deadline(), deadlineNSecs(), setRemainingTime()
*/
void QDeadlineTimer::setDeadline(qint64 msecs, Qt::TimerType timerType) noexcept
{
- if (msecs == (std::numeric_limits<qint64>::max)()) {
- setPreciseDeadline(msecs, 0, timerType); // msecs == MAX implies Forever
- } else {
- setPreciseDeadline(msecs / 1000, msecs % 1000 * 1000 * 1000, timerType);
+ if (msecs == TimeReference::Max) {
+ *this = QDeadlineTimer(Forever, timerType);
+ return;
}
+
+ type = timerType;
+
+ TimeReference ref;
+ if (!ref.addMilliseconds(msecs))
+ ref.saturate(msecs > 0);
+ ref.updateTimer(t1, t2);
}
/*!
@@ -516,14 +832,13 @@ void QDeadlineTimer::setDeadline(qint64 msecs, Qt::TimerType timerType) noexcept
void QDeadlineTimer::setPreciseDeadline(qint64 secs, qint64 nsecs, Qt::TimerType timerType) noexcept
{
type = timerType;
- if (secs == (std::numeric_limits<qint64>::max)() || nsecs == (std::numeric_limits<qint64>::max)()) {
- *this = QDeadlineTimer(Forever, timerType);
- } else if (QDeadlineTimerNanosecondsInT2) {
- t1 = secs + toSecsAndNSecs(nsecs).first;
- t2 = toSecsAndNSecs(nsecs).second;
- } else {
- t1 = secs * (1000*1000*1000) + nsecs;
- }
+
+ // We don't pass the seconds to the constructor, because we don't know
+ // at this point if t1 holds the seconds or nanoseconds; it's platform specific.
+ TimeReference ref;
+ if (!ref.addSecsAndNSecs(secs, nsecs))
+ ref.saturate(TimeReference::sign(secs, nsecs));
+ ref.updateTimer(t1, t2);
}
/*!
@@ -536,18 +851,14 @@ void QDeadlineTimer::setPreciseDeadline(qint64 secs, qint64 nsecs, Qt::TimerType
*/
QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcept
{
- if (dt.isForever() || nsecs == (std::numeric_limits<qint64>::max)()) {
- dt = QDeadlineTimer(Forever, dt.timerType());
- } else if (QDeadlineTimerNanosecondsInT2) {
- dt.t1 += toSecsAndNSecs(nsecs).first;
- dt.t2 += toSecsAndNSecs(nsecs).second;
- if (dt.t2 > 1000*1000*1000) {
- dt.t2 -= 1000*1000*1000;
- ++dt.t1;
- }
- } else {
- dt.t1 += nsecs;
- }
+ if (dt.isForever())
+ return dt;
+
+ TimeReference ref(dt.t1, dt.t2);
+ if (!ref.addNanoseconds(nsecs))
+ ref.saturate(nsecs > 0);
+ ref.updateTimer(dt.t1, dt.t2);
+
return dt;
}
@@ -656,6 +967,19 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
To add times of precision greater than 1 millisecond, use addNSecs().
*/
+QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs)
+{
+ if (dt.isForever())
+ return dt;
+
+ TimeReference ref(dt.t1, dt.t2);
+ if (!ref.addMilliseconds(msecs))
+ ref.saturate(msecs > 0);
+ ref.updateTimer(dt.t1, dt.t2);
+
+ return dt;
+}
+
/*!
\fn QDeadlineTimer operator+(qint64 msecs, QDeadlineTimer dt)
\relates QDeadlineTimer
diff --git a/src/corelib/kernel/qdeadlinetimer.h b/src/corelib/kernel/qdeadlinetimer.h
index 8032ee9018..9dd92481d2 100644
--- a/src/corelib/kernel/qdeadlinetimer.h
+++ b/src/corelib/kernel/qdeadlinetimer.h
@@ -108,8 +108,7 @@ public:
friend bool operator>=(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
{ return !(d1 < d2); }
- friend QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs)
- { return QDeadlineTimer::addNSecs(dt, msecs * 1000 * 1000); }
+ friend Q_CORE_EXPORT QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs);
friend QDeadlineTimer operator+(qint64 msecs, QDeadlineTimer dt)
{ return dt + msecs; }
friend QDeadlineTimer operator-(QDeadlineTimer dt, qint64 msecs)
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index b034455cc1..d5ef3ff816 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -836,7 +836,7 @@ static bool check_parent_thread(QObject *parent,
The destructor of a parent object destroys all child objects.
- Setting \a parent to 0 constructs an object with no parent. If the
+ Setting \a parent to \nullptr constructs an object with no parent. If the
object is a widget, it will become a top-level window.
\sa parent(), findChild(), findChildren()
@@ -3405,7 +3405,7 @@ bool QMetaObject::disconnectOne(const QObject *sender, int signal_index,
/*!
\internal
- Helper function to remove the connection from the senders list and setting the receivers to 0
+ Helper function to remove the connection from the senders list and set the receivers to \nullptr
*/
bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::ConnectionData *connections, int signalIndex,
const QObject *receiver, int method_index, void **slot,
diff --git a/src/corelib/kernel/qpointer.cpp b/src/corelib/kernel/qpointer.cpp
index c3dee7989e..068314633b 100644
--- a/src/corelib/kernel/qpointer.cpp
+++ b/src/corelib/kernel/qpointer.cpp
@@ -45,7 +45,7 @@
\ingroup objectmodel
A guarded pointer, QPointer<T>, behaves like a normal C++
- pointer \c{T *}, except that it is automatically set to 0 when the
+ pointer \c{T *}, except that it is automatically cleared when the
referenced object is destroyed (unlike normal C++ pointers, which
become "dangling pointers" in such cases). \c T must be a
subclass of QObject.
@@ -79,7 +79,7 @@
\snippet pointer/pointer.cpp 2
If the QLabel is deleted in the meantime, the \c label variable
- will hold 0 instead of an invalid address, and the last line will
+ will hold \nullptr instead of an invalid address, and the last line will
never be executed.
The functions and operators available with a QPointer are the
@@ -93,7 +93,7 @@
For creating guarded pointers, you can construct or assign to them
from a T* or from another guarded pointer of the same type. You
can compare them with each other using operator==() and
- operator!=(), or test for 0 with isNull(). You can dereference
+ operator!=(), or test for \nullptr with isNull(). You can dereference
them using either the \c *x or the \c x->member notation.
A guarded pointer will automatically cast to a \c T *, so you can
@@ -113,7 +113,7 @@
/*!
\fn template <class T> QPointer<T>::QPointer()
- Constructs a 0 guarded pointer.
+ Constructs a guarded pointer with value \nullptr.
\sa isNull()
*/
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index 4af2073365..1ac47f3972 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -2411,7 +2411,7 @@ void QVariant::clear()
Converts the int representation of the storage type, \a typeId, to
its string representation.
- Returns a null pointer if the type is QMetaType::UnknownType or doesn't exist.
+ Returns \nullptr if the type is QMetaType::UnknownType or doesn't exist.
*/
const char *QVariant::typeToName(int typeId)
{
@@ -4147,7 +4147,7 @@ void* QVariant::data()
/*!
Returns \c true if this is a null variant, false otherwise. A variant is
considered null if it contains no initialized value, or the contained value
- is a null pointer or is an instance of a built-in type that has an isNull
+ is \nullptr or is an instance of a built-in type that has an isNull
method, in which case the result would be the same as calling isNull on the
wrapped object.
@@ -4227,7 +4227,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
If the QVariant contains a pointer to a type derived from QObject then
\c{T} may be any QObject type. If the pointer stored in the QVariant can be
- qobject_cast to T, then that result is returned. Otherwise a null pointer is
+ qobject_cast to T, then that result is returned. Otherwise \nullptr is
returned. Note that this only works for QObject subclasses which use the
Q_OBJECT macro.