From 44da43e8e42272c61cf12c05314387c785bd9749 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 22 Jun 2020 11:44:34 +0200 Subject: QString: add char8_t overload of fromUtf8() Use the overload-with-template trick from P1423 to avoid ambiguities when existing callers pass 0 or nullptr. Add a qdoc-ignored macro to hide the fact that the overload is a template. [ChangeLog][QtCore][QString] Added char8_t overload of fromUtf8(). Change-Id: Iaa2d365bfa161ef36cc73fa3bad50aabf34d01db Reviewed-by: Thiago Macieira --- doc/global/qt-cpp-defines.qdocconf | 1 + src/corelib/global/qcompilerdetection.h | 6 ++++++ src/corelib/text/qstring.cpp | 8 ++++++++ src/corelib/text/qstring.h | 5 +++++ tests/auto/corelib/text/qstring/qstring.pro | 3 ++- tests/auto/corelib/text/qstring/tst_qstring.cpp | 6 ++++++ 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/doc/global/qt-cpp-defines.qdocconf b/doc/global/qt-cpp-defines.qdocconf index d3c516a656..fd5eb46926 100644 --- a/doc/global/qt-cpp-defines.qdocconf +++ b/doc/global/qt-cpp-defines.qdocconf @@ -132,6 +132,7 @@ Cpp.ignoretokens += \ Q_SVG_EXPORT \ Q_TESTLIB_EXPORT \ Q_TYPENAME \ + Q_WEAK_OVERLOAD \ Q_WIDGETS_EXPORT \ Q_WINEXTRAS_EXPORT \ Q_XML_EXPORT \ diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index 7b86279670..6341d060f1 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -1232,6 +1232,12 @@ # define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) (x) #endif +/* + * "Weak overloads" - makes an otherwise confliciting overload weaker + * (by making it a template) + */ +#define Q_WEAK_OVERLOAD template + /* * Warning/diagnostic handling */ diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 16e9f1d63b..dff0dbce7f 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -5097,6 +5097,14 @@ QString QString::fromLocal8Bit_helper(const char *str, int size) \sa toUtf8(), fromLatin1(), fromLocal8Bit() */ +/*! + \fn QString QString::fromUtf8(const char8_t *str, qsizetype size) + \overload + \since 6.0 + + This overload is only available when compiling in C++20 mode. +*/ + /*! \fn QString QString::fromUtf8(const QByteArray &str) \overload diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index f14644d956..b77c6134d5 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -658,6 +658,11 @@ public: { return fromUtf8_helper(str, (str && size == -1) ? int(strlen(str)) : size); } +#ifdef __cpp_char8_t + Q_WEAK_OVERLOAD + static inline QString fromUtf8(const char8_t *str, qsizetype size = -1) + { return fromUtf8(reinterpret_cast(str), int(size)); } +#endif static inline QString fromLocal8Bit(const char *str, int size = -1) { return fromLocal8Bit_helper(str, (str && size == -1) ? int(strlen(str)) : size); diff --git a/tests/auto/corelib/text/qstring/qstring.pro b/tests/auto/corelib/text/qstring/qstring.pro index 5fff5530b7..9a478b134e 100644 --- a/tests/auto/corelib/text/qstring/qstring.pro +++ b/tests/auto/corelib/text/qstring/qstring.pro @@ -3,7 +3,8 @@ TARGET = tst_qstring QT = core-private testlib SOURCES = tst_qstring.cpp # DEFINES += QT_NO_CAST_TO_ASCII # actively #undef-ed by tst_qstring.cpp -qtConfig(c++11): CONFIG += c++11 +qtConfig(c++1z): CONFIG += c++1z +qtConfig(c++2a): CONFIG += c++2a DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 !qtConfig(doubleconversion):!qtConfig(system-doubleconversion) { diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index 5c46ae6ae1..61f775f4d8 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -4216,9 +4216,15 @@ void tst_QString::nullFromUtf8() a = QString::fromUtf8(0); QVERIFY(a.isNull()); QVERIFY(a.isEmpty()); + a = QString::fromUtf8(nullptr); + QVERIFY(a.isNull()); + QVERIFY(a.isEmpty()); a = QString::fromUtf8(""); QVERIFY(!a.isNull()); QVERIFY(a.isEmpty()); + a = QString::fromUtf8(u8""); // char in C++17 / char8_t in C++20 + QVERIFY(!a.isNull()); + QVERIFY(a.isEmpty()); a = QString::fromUtf8(QByteArray()); QVERIFY(a.isNull()); QVERIFY(a.isEmpty()); -- cgit v1.2.3