summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2022-03-07 11:51:44 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-03-08 06:47:21 +0000
commit18804cc4cd71469bdba56c2990f5a39aeca59ed9 (patch)
treeae328f7ebc0e01b23969f99f8a20fc3a493008c2
parent16598b87c65c7de25aa2863ebe6a0e86d66b6147 (diff)
tst_qstringapisymmetry: check expected overloads are selected
Check that the expected overloads are selected in QString/QAnyStringView overload sets. Change-Id: I38148c20a72eb60cf86844a39fe0ed419d2fa562 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 5235b1bdc82a02c273b0c298516dc4e9881c1e96) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp71
1 files 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 ccb5e70e6f..e93fad81c9 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 <QChar>
#include <QLatin1String>
@@ -168,6 +169,7 @@ private Q_SLOTS:
void overload_vector_char16_t() { overload<std::vector<char16_t>>(); }
void overload_vector_QChar() { overload<std::vector<QChar>>(); }
+ void overload_special();
private:
//
// Mixed UTF-16, UTF-8, Latin-1 checks:
@@ -924,27 +926,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
@@ -1006,6 +1008,51 @@ void tst_QStringApiSymmetry::overload()
}
}
+void tst_QStringApiSymmetry::overload_special()
+{
+ auto check = [](auto result, auto expected) {
+ static_assert(std::is_same_v<decltype(result), decltype(expected)>);
+ };
+
+ {
+#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<QStringView>("lhsUnicode");