From 5235b1bdc82a02c273b0c298516dc4e9881c1e96 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 7 Mar 2022 11:51:44 +0100 Subject: [PATCH] tst_qstringapisymmetry: check expected overloads are selected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check that the expected overloads are selected in QString/QAnyStringView overload sets. Pick-to: 6.3 Change-Id: I38148c20a72eb60cf86844a39fe0ed419d2fa562 Reviewed-by: Edward Welbourne Reviewed-by: MÃ¥rten Nordheim Reviewed-by: Qt CI Bot --- .../tst_qstringapisymmetry.cpp | 71 +++++++++++++++---- 1 file changed, 59 insertions(+), 12 deletions(-) diff --git a/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp b/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp index ad154f8103..56bb74d3c7 100644 --- a/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp +++ b/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp @@ -30,6 +30,7 @@ #undef QT_NO_CAST_FROM_ASCII #undef QT_NO_CAST_TO_ASCII #undef QT_ASCII_CAST_WARNINGS +#define QT_USE_QSTRINGBUILDER #include #include @@ -168,6 +169,7 @@ private Q_SLOTS: void overload_vector_char16_t() { overload>(); } void overload_vector_QChar() { overload>(); } + void overload_special(); private: // // Mixed UTF-16, UTF-8, Latin-1 checks: @@ -943,27 +945,27 @@ template <> constexpr qsizetype size(const char16_t&) { return 1; } namespace { -void overload_s_a(const QString &) {} +auto overload_s_a(const QString &s) { return s; } Q_WEAK_OVERLOAD -void overload_s_a(QAnyStringView) {} +auto overload_s_a(QAnyStringView s) { return s; } -void overload_sr_a(QString &&) {} +auto overload_sr_a(QString &&s) { return std::move(s); } Q_WEAK_OVERLOAD -void overload_sr_a(QAnyStringView) {} +auto overload_sr_a(QAnyStringView s) { return s; } Q_WEAK_OVERLOAD -void overload_a_s(const QString &) {} -void overload_a_s(QAnyStringView) {} +auto overload_a_s(const QString &s) { return s; } +auto overload_a_s(QAnyStringView s) { return s; } Q_WEAK_OVERLOAD -void overload_a_sr(QString &&) {} -void overload_a_sr(QAnyStringView) {} +auto overload_a_sr(QString &&s) { return std::move(s); } +auto overload_a_sr(QAnyStringView s) { return s; } -void overload_s_v(const QString &) {} -void overload_s_v(QStringView) {} +auto overload_s_v(const QString &s) { return s; } +auto overload_s_v(QStringView s) { return s; } -void overload_sr_v(QString &&) {} -void overload_sr_v(QStringView) {} +auto overload_sr_v(QString &&s) { return std::move(s); } +auto overload_sr_v(QStringView s) { return s; } } // unnamed namespace @@ -1025,6 +1027,51 @@ void tst_QStringApiSymmetry::overload() } } +void tst_QStringApiSymmetry::overload_special() +{ + auto check = [](auto result, auto expected) { + static_assert(std::is_same_v); + }; + + { +#define rvalue QStringLiteral("hello") + auto lvalue = rvalue; + auto builder = [&] { return lvalue % ""; }; + + // check that QString/Builder go to the QString overload in a_s(r): + + check(overload_a_s(lvalue), QString()); + check(overload_a_s(rvalue), QString()); + check(overload_a_s(builder()), QAnyStringView()); // weak overloads must match exactly + check(overload_a_s(QString(builder())), QString()); + + check(overload_a_sr(lvalue), QAnyStringView()); // lvalue can't bind to rvalue ref + check(overload_a_sr(rvalue), QString()); + check(overload_a_sr(builder()), QAnyStringView()); + check(overload_a_sr(QString(builder())), QString()); + + // check that everything goes to the QString overload in s(r)_a: + // exception: u"" + + check(overload_s_a(lvalue), QString()); + check(overload_s_a(rvalue), QString()); + check(overload_s_a(builder()), QString()); + check(overload_s_a(""), QString()); + check(overload_s_a(u""), QAnyStringView()); + check(overload_s_a(u8""), QString()); + check(overload_s_a(QLatin1String("")), QString()); + + check(overload_sr_a(lvalue), QAnyStringView()); // lvalues don't bind to rvalue refs + check(overload_sr_a(rvalue), QString()); + check(overload_sr_a(builder()), QString()); + check(overload_sr_a(""), QString()); + check(overload_sr_a(u""), QAnyStringView()); + check(overload_sr_a(u8""), QString()); + check(overload_sr_a(QLatin1String("")), QString()); +#undef rvalue + } +} + void tst_QStringApiSymmetry::compare_data(bool hasConceptOfNullAndEmpty) { QTest::addColumn("lhsUnicode");