summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2021-11-16 14:59:30 +0100
committerMarc Mutz <marc.mutz@qt.io>2021-11-19 03:32:20 +0100
commitb7f40416692c357b440c885fe18fa70e2a829820 (patch)
treef97d1c7c0eed62f36b6f310395774b6c40203422
parent8283df4d8cee7e80ce36e724ae0824fd1e00cb24 (diff)
QAnyStringView: fix broken implicit conversion from QStringBuilder
Need to use QConcatenable<>::ConvertTo for SFINAE, the forwarded type alias in QStringBuilder itself doesn't work. [ChangeLog][QtCore][QAnyStringView/QStringBuilder] Implicit conversion from QStringBuilder to QAnyStringView now works as advertised. Pick-to: 6.2 Fixes: QTBUG-98138 Change-Id: I1c300675cf43b13017bc56398ae5d8c1c51e64fe Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/corelib/text/qanystringview.h3
-rw-r--r--src/corelib/text/qstringbuilder.h2
-rw-r--r--tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp18
3 files changed, 21 insertions, 2 deletions
diff --git a/src/corelib/text/qanystringview.h b/src/corelib/text/qanystringview.h
index 68754931e9..774651cb6a 100644
--- a/src/corelib/text/qanystringview.h
+++ b/src/corelib/text/qanystringview.h
@@ -50,6 +50,7 @@
QT_BEGIN_NAMESPACE
template <typename, typename> class QStringBuilder;
+template <typename> struct QConcatenable;
class QAnyStringView
{
@@ -163,7 +164,7 @@ public:
// defined in qstringbuilder.h
template <typename A, typename B>
inline QAnyStringView(const QStringBuilder<A, B> &expr,
- typename QStringBuilder<A, B>::ConvertTo &&capacity = {});
+ typename QConcatenable<QStringBuilder<A, B>>::ConvertTo &&capacity = {});
template <typename Container, if_compatible_container<Container> = true>
constexpr QAnyStringView(const Container &c) noexcept
diff --git a/src/corelib/text/qstringbuilder.h b/src/corelib/text/qstringbuilder.h
index 5a6a531e74..8494459d63 100644
--- a/src/corelib/text/qstringbuilder.h
+++ b/src/corelib/text/qstringbuilder.h
@@ -468,7 +468,7 @@ QString &operator+=(QString &a, const QStringBuilder<A, B> &b)
template <typename A, typename B>
QAnyStringView::QAnyStringView(const QStringBuilder<A, B> &expr,
- typename QStringBuilder<A, B>::ConvertTo &&capacity)
+ typename QConcatenable<QStringBuilder<A, B>>::ConvertTo &&capacity)
: QAnyStringView(capacity = expr) {}
QT_END_NAMESPACE
diff --git a/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp b/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp
index bbc0bdacfd..e5e3ac9f84 100644
--- a/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp
+++ b/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp
@@ -30,6 +30,7 @@
#include <QChar>
#include <QList>
#include <QString>
+#include <QStringBuilder>
#include <QVarLengthArray>
#include <QTest>
@@ -230,6 +231,12 @@ static_assert(CanConvert<std::array<wchar_t, 123>> == CanConvertFromWCharT);
static_assert(!CanConvert<std::deque<wchar_t>>);
static_assert(!CanConvert<std::list<wchar_t>>);
+//
+// QStringBuilder
+//
+
+static_assert(CanConvert<QStringBuilder<QString, QString>>);
+
class tst_QAnyStringView : public QObject
{
@@ -303,9 +310,13 @@ private Q_SLOTS:
void fromChar16TContainers() const { fromContainers<char16_t>(); }
void fromWCharTContainers() const { ONLY_WIN(fromContainers<wchar_t>()); }
+ void fromQStringBuilder_QString_QString() const { fromQStringBuilder(u"1"_qs % u"2"_qs, u"12"); }
+
void comparison();
private:
+ template <typename StringBuilder>
+ void fromQStringBuilder(StringBuilder &&sb, QStringView expected) const;
template <typename Char>
void fromArray() const;
template <typename String>
@@ -419,6 +430,13 @@ void tst_QAnyStringView::basics() const
QVERIFY(!(sv2 != sv1));
}
+template <typename StringBuilder>
+void tst_QAnyStringView::fromQStringBuilder(StringBuilder &&sb, QStringView expected) const
+{
+ auto toAnyStringView = [](QAnyStringView sv) { return sv; };
+ QCOMPARE(toAnyStringView(std::forward<StringBuilder>(sb)), expected);
+}
+
template <typename Char>
void tst_QAnyStringView::fromArray() const
{