String API Symmetry: test for indexOf with large negative offset

Small change needed to make QString_char16 and QString_QChar return -1
in this case, but other combinations already returns -1.

[ChangeLog][QtCore][Behavior Change] QString::indexOf(QChar) and
QString::indexOf(char16_t) now treat a negative start-position, from,
bigger than the string's size as invalid. It previously
clipped such start-positions to the start of the string, inconsistently
with other QString indexOf overloads.

Change-Id: Ic56c8a558bf40a94845c649647db569892d4df02
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Mårten Nordheim 2021-05-12 09:41:35 +02:00
parent e6457d9b60
commit f9b867216b
3 changed files with 6 additions and 1 deletions

View File

@ -10157,6 +10157,8 @@ char16_t valueTypeToUtf16<char>(char t)
static inline qsizetype qFindChar(QStringView str, QChar ch, qsizetype from, Qt::CaseSensitivity cs) noexcept
{
if (-from > str.size())
return -1;
if (from < 0)
from = qMax(from + str.size(), qsizetype(0));
if (from < str.size()) {

View File

@ -2268,6 +2268,9 @@ void tst_QStringApiSymmetry::indexOf_data(bool rhsHasVariableLength)
<< a << QLatin1String("a") << zeroPos << minus1Pos << minus1Pos;
QTest::addRow("haystack: null, needle: a") << null << QLatin1String()
<< a << QLatin1String("a") << zeroPos << minus1Pos << minus1Pos;
QTest::addRow("haystack: anything, needle: a, large negative offset")
<< "anything" << QLatin1String("anything") << a << QLatin1String("a") << qsizetype(-500)
<< minus1Pos << minus1Pos;
#define ROW(h, n, st, cs, cis) \
QTest::addRow("haystack: %s, needle: %s", #h, #n) << h << QLatin1String(#h) \

View File

@ -1710,7 +1710,7 @@ void tst_Collections::qstring()
QVERIFY (hello.contains('e') != false);
QVERIFY(hello.indexOf('e') == 1);
QVERIFY(hello.indexOf('e', -10) == 1);
QVERIFY(hello.indexOf('e', -10) == -1);
QVERIFY(hello.indexOf('l') == 2);
QVERIFY(hello.indexOf('l',2) == 2);
QVERIFY(hello.indexOf('l',3) == 3);