QDate: fix C++20 builds with MSVC
Commit c4f7dba81e43c11c1e71c19ef7f0b5acad119e60 reworked the C++20 QDate constructors and introduced a helper stdSysDaysToJulianDay() method. However, the QT_POST_CXX17_API_IN_EXPORTED_CLASS was not used on this new helper function. As a result, an application which is built with C++20 but uses a pre-built QtCore that is built with C++17 cannot call QDate constructors with the new std::chorono types. An obvious fix is to add the missing macro to the function. However, we cannot do it directly, because the function is exported in C++20 builds, and adding the macro will unexport it. Use QT6_{DECL,CALL}_NEW_OVERLOAD_TAIL macros to add a new overload of the stdSysDaysToJulianDay() function and mark it as QT_POST_CXX17_API_IN_EXPORTED_CLASS. Keep the old function under the QT_VERSION < Qt 7 check to keep BC. Amends c4f7dba81e43c11c1e71c19ef7f0b5acad119e60. Fixes: QTBUG-125610 Change-Id: I999354da51ee58c3691dbc1c0351be15a18a268b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 88702cc87cf830b145c8bff5174748e3719364f9) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
eb4e5b798d
commit
d3c060defa
@ -35,28 +35,28 @@ public:
|
||||
#if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
Q_IMPLICIT constexpr QDate(std::chrono::year_month_day date) noexcept
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date QT6_CALL_NEW_OVERLOAD_TAIL) : nullJd())
|
||||
{}
|
||||
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
Q_IMPLICIT constexpr QDate(std::chrono::year_month_day_last date) noexcept
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date QT6_CALL_NEW_OVERLOAD_TAIL) : nullJd())
|
||||
{}
|
||||
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
Q_IMPLICIT constexpr QDate(std::chrono::year_month_weekday date) noexcept
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date QT6_CALL_NEW_OVERLOAD_TAIL) : nullJd())
|
||||
{}
|
||||
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
Q_IMPLICIT constexpr QDate(std::chrono::year_month_weekday_last date) noexcept
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
|
||||
: jd(date.ok() ? stdSysDaysToJulianDay(date QT6_CALL_NEW_OVERLOAD_TAIL) : nullJd())
|
||||
{}
|
||||
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
static constexpr QDate fromStdSysDays(const std::chrono::sys_days &days) noexcept
|
||||
{
|
||||
return QDate(stdSysDaysToJulianDay(days));
|
||||
return QDate(stdSysDaysToJulianDay(days QT6_CALL_NEW_OVERLOAD_TAIL));
|
||||
}
|
||||
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
@ -177,7 +177,9 @@ private:
|
||||
static constexpr inline qint64 unixEpochJd() { return Q_INT64_C(2440588); }
|
||||
|
||||
#if __cpp_lib_chrono >= 201907L
|
||||
static constexpr qint64 stdSysDaysToJulianDay(const std::chrono::sys_days &days) noexcept
|
||||
QT_POST_CXX17_API_IN_EXPORTED_CLASS
|
||||
static constexpr qint64
|
||||
stdSysDaysToJulianDay(const std::chrono::sys_days &days QT6_DECL_NEW_OVERLOAD_TAIL) noexcept
|
||||
{
|
||||
const auto epochDays = days.time_since_epoch().count();
|
||||
// minJd() and maxJd() fit into 40 bits.
|
||||
@ -189,6 +191,13 @@ private:
|
||||
}
|
||||
return unixEpochJd() + epochDays;
|
||||
}
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
|
||||
static constexpr qint64 stdSysDaysToJulianDay(const std::chrono::sys_days &days) noexcept
|
||||
{
|
||||
return stdSysDaysToJulianDay(days QT6_CALL_NEW_OVERLOAD_TAIL);
|
||||
}
|
||||
#endif // QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
|
||||
#endif // __cpp_lib_chrono >= 201907L
|
||||
|
||||
qint64 jd;
|
||||
|
Loading…
x
Reference in New Issue
Block a user