From 517745fc9de02f174e1d93527e84c35502fbd8b0 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 1 Mar 2021 14:17:00 +0100 Subject: [PATCH] Ensure setDateTime clears status also when short Previously, if multiplication overflowed when trying to set the date and time of a formerly short-form QDateTime, its status didn't get set to reflect the failed validity check. Added a test that now correctly detects that it's produced an invalid date-time on overflow, where previously it produced a wrong valid date-time. Change-Id: Id46ca34d1e32e9b9b0630f3723cefd1c13b5761e Reviewed-by: Thiago Macieira --- src/corelib/time/qdatetime.cpp | 4 +++- tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index a61a7d5706..faf3fe38de 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -3050,7 +3050,9 @@ static void setDateTime(QDateTimeData &d, QDate date, QTime time) if (mul_overflow(days, std::integral_constant(), &msecs) || add_overflow(msecs, qint64(ds), &msecs)) { newStatus = QDateTimePrivate::StatusFlags{}; - } else if (d.isShort()) { + msecs = 0; + } + if (d.isShort()) { // let's see if we can keep this short if (msecsCanBeSmall(msecs)) { // yes, we can diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp index 166ce260a5..ce0e899a25 100644 --- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp @@ -717,6 +717,13 @@ void tst_QDateTime::setMSecsSinceEpoch() QDateTime reference(QDate(1970, 1, 1), QTime(0, 0), Qt::UTC); QCOMPARE(dt, reference.addMSecs(msecs)); + + if ((localTimeType == LocalTimeAheadOfUtc && msecs == std::numeric_limits::max()) + || (localTimeType == LocalTimeBehindUtc && msecs == std::numeric_limits::min())) { + QDateTime curt = QDate(1970, 1, 1).startOfDay(); // initially in short-form + curt.setMSecsSinceEpoch(msecs); // Overflows due to offset + QVERIFY(!curt.isValid()); + } } void tst_QDateTime::fromMSecsSinceEpoch_data()