From 878b2047b52c93e904eb46ef1044819a8b5614ab Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 31 Aug 2021 08:54:24 -0700 Subject: QList::iterator: use templates for advancing operators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because of the addition of the operator T*(), the expression "it + N" where N was not exactly qsizetype but any other integer type was a compilation failure because of ambiguous overload resolution. With GCC it's apparently a warning: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: note: candidate 1: ‘QList::iterator QList::iterator::operator+(qsizetype) const [with T = char; qsizetype = long long int]’ note: candidate 2: ‘operator+(char*, ptrdiff_t {aka long int})’ (built-in) With Clang, it's an error: error: use of overloaded operator '+' is ambiguous (with operand types 'QList::const_iterator' and 'ptrdiff_t' (aka 'long')) note: candidate function inline const_iterator operator+(qsizetype j) const { return const_iterator(i+j); } note: built-in candidate operator+(const int *, long) Pick-to: 6.2 Fixes: QTBUG-96128 Change-Id: Ie72b0dd0fbe84d2caae0fffd16a06f23dd56b060 Reviewed-by: Qt CI Bot Reviewed-by: Giuseppe D'Angelo --- tests/auto/corelib/tools/qlist/tst_qlist.cpp | 134 +++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) (limited to 'tests') diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index 3d26720fab..78a6ca317a 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -2404,30 +2404,97 @@ void tst_QList::iterators() const idx = 0; auto it = v.begin(); QCOMPARE(*it, idx); + // idx == 0 std::advance(it, 7); idx += 7; QCOMPARE(*it, idx); + // idx == 7 it++; idx++; QCOMPARE(*it, idx); + // idx == 8 ++it; ++idx; QCOMPARE(*it, idx); + // idx == 9 std::advance(it, -3); idx -= 3; QCOMPARE(*it, idx); + // idx == 6 it--; idx--; QCOMPARE(*it, idx); + // idx == 5 --it; --idx; QCOMPARE(*it, idx); + // idx == 4 + + it = it + 1; + idx = idx + 1; + QCOMPARE(*it, idx); + // idx == 5 + + it = it + ptrdiff_t(1); + idx = idx + 1; + QCOMPARE(*it, idx); + // idx == 6 + + it = it + qsizetype(1); + idx = idx + 1; + QCOMPARE(*it, idx); + // idx == 7 + + it = it - qsizetype(1); + idx = idx - 1; + QCOMPARE(*it, idx); + // idx == 6 + + it = it - ptrdiff_t(1); + idx = idx - 1; + QCOMPARE(*it, idx); + // idx == 5 + + it = it - 1; + idx = idx - 1; + QCOMPARE(*it, idx); + // idx == 4 + + it -= 1; + idx -= 1; + QCOMPARE(*it, idx); + // idx == 3 + + it -= qsizetype(1); + idx -= 1; + QCOMPARE(*it, idx); + // idx == 2 + + it -= ptrdiff_t(1); + idx -= 1; + QCOMPARE(*it, idx); + // idx == 1 + + it += ptrdiff_t(1); + idx += 1; + QCOMPARE(*it, idx); + // idx == 2 + + it += qsizetype(1); + idx += 1; + QCOMPARE(*it, idx); + // idx == 3 + + it += 1; + idx += 1; + QCOMPARE(*it, idx); + // idx == 4 *it = idx + 1; QCOMPARE(*it, idx + 1); @@ -2484,30 +2551,97 @@ void tst_QList::constIterators() const qsizetype idx = 0; auto it = v.cbegin(); QCOMPARE(*it, idx); + // idx == 0 std::advance(it, 7); idx += 7; QCOMPARE(*it, idx); + // idx == 7 it++; idx++; QCOMPARE(*it, idx); + // idx == 8 ++it; ++idx; QCOMPARE(*it, idx); + // idx == 9 std::advance(it, -3); idx -= 3; QCOMPARE(*it, idx); + // idx == 6 it--; idx--; QCOMPARE(*it, idx); + // idx == 5 --it; --idx; QCOMPARE(*it, idx); + // idx == 4 + + it = it + 1; + idx = idx + 1; + QCOMPARE(*it, idx); + // idx == 5 + + it = it + ptrdiff_t(1); + idx = idx + 1; + QCOMPARE(*it, idx); + // idx == 6 + + it = it + qsizetype(1); + idx = idx + 1; + QCOMPARE(*it, idx); + // idx == 7 + + it = it - qsizetype(1); + idx = idx - 1; + QCOMPARE(*it, idx); + // idx == 6 + + it = it - ptrdiff_t(1); + idx = idx - 1; + QCOMPARE(*it, idx); + // idx == 5 + + it = it - 1; + idx = idx - 1; + QCOMPARE(*it, idx); + // idx == 4 + + it -= 1; + idx -= 1; + QCOMPARE(*it, idx); + // idx == 3 + + it -= qsizetype(1); + idx -= 1; + QCOMPARE(*it, idx); + // idx == 2 + + it -= ptrdiff_t(1); + idx -= 1; + QCOMPARE(*it, idx); + // idx == 1 + + it += ptrdiff_t(1); + idx += 1; + QCOMPARE(*it, idx); + // idx == 2 + + it += qsizetype(1); + idx += 1; + QCOMPARE(*it, idx); + // idx == 3 + + it += 1; + idx += 1; + QCOMPARE(*it, idx); + // idx == 4 // stl-style reverse iterators idx = v.size() - 1; -- cgit v1.2.3