diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2020-07-19 10:55:55 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2020-07-30 20:29:23 -0700 |
commit | 61ccfefb25d61da95a1a1cdf0313da1448dc23c6 (patch) | |
tree | eb69b2f3ed3c4ad7e76738220820602d1e9815c7 /src/corelib/text/qstringview.h | |
parent | caa40f57d4d9ccf22d728e486148d2be6b29e249 (diff) |
Fix warning in QStringView::compare(QChar) on qsizetype->int
size() - 1 is converted to int as the result, but size() is a qsizetype
and could be bigger than INT_MAX. So rewrite to not depend on the cast.
This was introduced on b2f79cceb11dfd15ac9eea631bc18ad6b036eb91.
I could have replaced size() - 1 with int(size() > 1) - 1, but that's
even more complex. To simplify, I split the function in two while
retaining the C++11 constexpr requirements.
Bonus: removes the use of the ambiguously-named "empty()" function that
looks like a verb.
Fixes: QTBUG-85665
Pick-to: 5.15
Change-Id: Ieffc3453b88c4517a1dbfffd162338fdb084a376
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/text/qstringview.h')
-rw-r--r-- | src/corelib/text/qstringview.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h index 58412974bc..24cea33e7f 100644 --- a/src/corelib/text/qstringview.h +++ b/src/corelib/text/qstringview.h @@ -304,7 +304,7 @@ public: { return QtPrivate::compareStrings(*this, other, cs); } Q_REQUIRED_RESULT inline int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept; Q_REQUIRED_RESULT Q_DECL_CONSTEXPR int compare(QChar c) const noexcept - { return empty() || front() == c ? size() - 1 : *utf16() - c.unicode() ; } + { return size() >= 1 ? compare_single_char_helper(*utf16() - c.unicode()) : -1; } Q_REQUIRED_RESULT int compare(QChar c, Qt::CaseSensitivity cs) const noexcept { return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); } @@ -408,6 +408,9 @@ public: private: qsizetype m_size; const storage_type *m_data; + + Q_DECL_CONSTEXPR int compare_single_char_helper(int diff) const noexcept + { return diff ? diff : size() > 1 ? 1 : 0; } }; Q_DECLARE_TYPEINFO(QStringView, Q_PRIMITIVE_TYPE); |