QChar: remove QT_IMPLICIT_QCHAR_CONSTRUCTION opt-in
Users had eight Qt releases to adjust their code, remove the opt-out now. [ChangeLog][QtCore][QChar] Removed the QT_IMPLICIT_QCHAR_CONSTRUCTION opt-in. The respective QChar constructors (`(int)`, `(uint)`, `(uchar)`, `(uchar, uchar)`) are now always explicit. Change-Id: I2cca1f98d486840f9e6bcd6c07678f0dd81832e5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
a6d2e45d57
commit
54f2229714
|
|
@ -123,9 +123,7 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
Starting with Qt 6.0, most QChar constructors are \c explicit. This
|
||||
is done to avoid dangerous mistakes when accidentally mixing
|
||||
integral types and strings. You can opt-out (and make these
|
||||
constructors implicit) by defining the macro \c
|
||||
QT_IMPLICIT_QCHAR_CONSTRUCTION.
|
||||
integral types and strings.
|
||||
|
||||
For more information see
|
||||
\l{https://www.unicode.org/ucd/}{"About the Unicode Character Database"}.
|
||||
|
|
@ -2110,51 +2108,4 @@ static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationFo
|
|||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
\macro QT_IMPLICIT_QCHAR_CONSTRUCTION
|
||||
\since 6.0
|
||||
\relates QChar
|
||||
|
||||
Defining this macro makes certain QChar constructors implicit
|
||||
rather than explicit. This is done to enforce safe conversions:
|
||||
|
||||
\badcode
|
||||
|
||||
QString str = getString();
|
||||
if (str == 123) {
|
||||
// Oops, meant str == "123". By default does not compile,
|
||||
// *unless* this macro is defined, in which case, it's interpreted
|
||||
// as `if (str == QChar(123))`, that is, `if (str == '{')`.
|
||||
// Likely, not what we meant.
|
||||
}
|
||||
|
||||
\endcode
|
||||
|
||||
This macro is provided to keep existing code working; it is
|
||||
recommended to instead use explicit conversions and/or QLatin1Char.
|
||||
For instance:
|
||||
|
||||
\code
|
||||
|
||||
QChar c1 = 'x'; // OK, unless QT_NO_CAST_FROM_ASCII is defined
|
||||
QChar c2 = u'x'; // always OK, recommended
|
||||
QChar c3 = QLatin1Char('x'); // always OK, recommended
|
||||
|
||||
// from int to 1 UTF-16 code unit: must guarantee that the input is <= 0xFFFF
|
||||
QChar c4 = 120; // compile error, unless QT_IMPLICIT_QCHAR_CONSTRUCTION is defined
|
||||
QChar c5(120); // OK (direct initialization)
|
||||
auto c6 = QChar(120); // ditto
|
||||
|
||||
// from int/char32_t to 1/2 UTF-16 code units:
|
||||
// 𝄞 'MUSICAL SYMBOL G CLEF' (U+1D11E)
|
||||
auto c7 = QChar(0x1D11E); // compiles, but undefined behavior at runtime
|
||||
auto c8 = QChar::fromUcs4(0x1D11E); // always OK
|
||||
auto c9 = QChar::fromUcs4(U'\U0001D11E'); // always OK
|
||||
// => use c8/c9 as QStringView objects
|
||||
|
||||
\endcode
|
||||
|
||||
\sa QLatin1Char, QChar::fromUcs4, QT_NO_CAST_FROM_ASCII
|
||||
*/
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -63,17 +63,15 @@ public:
|
|||
};
|
||||
|
||||
#ifdef QT_IMPLICIT_QCHAR_CONSTRUCTION
|
||||
#define QCHAR_MAYBE_IMPLICIT Q_IMPLICIT
|
||||
#else
|
||||
#define QCHAR_MAYBE_IMPLICIT explicit
|
||||
#error This macro has been removed in Qt 6.8.
|
||||
#endif
|
||||
|
||||
constexpr Q_IMPLICIT QChar() noexcept : ucs(0) {}
|
||||
constexpr Q_IMPLICIT QChar(ushort rc) noexcept : ucs(rc) {}
|
||||
constexpr QCHAR_MAYBE_IMPLICIT QChar(uchar c, uchar r) noexcept : ucs(char16_t((r << 8) | c)) {}
|
||||
constexpr explicit QChar(uchar c, uchar r) noexcept : ucs(char16_t((r << 8) | c)) {}
|
||||
constexpr Q_IMPLICIT QChar(short rc) noexcept : ucs(char16_t(rc)) {}
|
||||
constexpr QCHAR_MAYBE_IMPLICIT QChar(uint rc) noexcept : ucs((Q_ASSERT(rc <= 0xffff), char16_t(rc))) {}
|
||||
constexpr QCHAR_MAYBE_IMPLICIT QChar(int rc) noexcept : QChar(uint(rc)) {}
|
||||
constexpr explicit QChar(uint rc) noexcept : ucs((Q_ASSERT(rc <= 0xffff), char16_t(rc))) {}
|
||||
constexpr explicit QChar(int rc) noexcept : QChar(uint(rc)) {}
|
||||
constexpr Q_IMPLICIT QChar(SpecialCharacter s) noexcept : ucs(char16_t(s)) {}
|
||||
constexpr Q_IMPLICIT QChar(QLatin1Char ch) noexcept : ucs(ch.unicode()) {}
|
||||
constexpr Q_IMPLICIT QChar(char16_t ch) noexcept : ucs(ch) {}
|
||||
|
|
@ -85,12 +83,10 @@ public:
|
|||
// Always implicit -- allow for 'x' => QChar conversions
|
||||
QT_ASCII_CAST_WARN constexpr Q_IMPLICIT QChar(char c) noexcept : ucs(uchar(c)) { }
|
||||
#ifndef QT_RESTRICTED_CAST_FROM_ASCII
|
||||
QT_ASCII_CAST_WARN constexpr QCHAR_MAYBE_IMPLICIT QChar(uchar c) noexcept : ucs(c) { }
|
||||
QT_ASCII_CAST_WARN constexpr explicit QChar(uchar c) noexcept : ucs(c) { }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef QCHAR_MAYBE_IMPLICIT
|
||||
|
||||
static constexpr QChar fromUcs2(char16_t c) noexcept { return QChar{c}; }
|
||||
static constexpr inline auto fromUcs4(char32_t c) noexcept;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue