summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qbytearray.h13
-rw-r--r--src/corelib/tools/qstring.h14
-rw-r--r--src/corelib/tools/qstringbuilder.h31
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp30
4 files changed, 15 insertions, 73 deletions
diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index 45be63aa9b..0f5ebcfb18 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -169,13 +169,14 @@ struct QByteArrayDataPtr
#if defined(Q_COMPILER_LAMBDA)
# define QByteArrayLiteral(str) \
- ([]() -> QByteArrayDataPtr { \
+ ([]() -> QByteArray { \
enum { Size = sizeof(str) - 1 }; \
static const QStaticByteArrayData<Size> qbytearray_literal = { \
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(Size), \
str }; \
QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; \
- return holder; \
+ const QByteArray ba(holder); \
+ return ba; \
}()) \
/**/
@@ -185,22 +186,22 @@ struct QByteArrayDataPtr
// To do that, we need the __extension__ {( )} trick which only GCC supports
# define QByteArrayLiteral(str) \
- __extension__ ({ \
+ QByteArray(__extension__ ({ \
enum { Size = sizeof(str) - 1 }; \
static const QStaticByteArrayData<Size> qbytearray_literal = { \
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(Size), \
str }; \
QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; \
holder; \
- }) \
+ })) \
/**/
#endif
#ifndef QByteArrayLiteral
-// no lambdas, not GCC, use const char * instead
+// no lambdas, not GCC, just return a temporary QByteArray
-# define QByteArrayLiteral(str) (str)
+# define QByteArrayLiteral(str) QByteArray(str, sizeof(str) - 1)
#endif
class Q_CORE_EXPORT QByteArray
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index edb140b682..a96046d837 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -113,13 +113,14 @@ Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
# if defined(Q_COMPILER_LAMBDA)
# define QStringLiteral(str) \
- ([]() -> QStringDataPtr { \
+ ([]() -> QString { \
enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
static const QStaticStringData<Size> qstring_literal = { \
Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
QT_UNICODE_LITERAL(str) }; \
QStringDataPtr holder = { qstring_literal.data_ptr() }; \
- return holder; \
+ const QString s(holder); \
+ return s; \
}()) \
/**/
@@ -129,14 +130,14 @@ Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
// To do that, we need the __extension__ {( )} trick which only GCC supports
# define QStringLiteral(str) \
- __extension__ ({ \
+ QString(__extension__ ({ \
enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
static const QStaticStringData<Size> qstring_literal = { \
Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
QT_UNICODE_LITERAL(str) }; \
QStringDataPtr holder = { qstring_literal.data_ptr() }; \
holder; \
- }) \
+ })) \
/**/
# endif
@@ -144,9 +145,10 @@ Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
#ifndef QStringLiteral
// no lambdas, not GCC, or GCC in C++98 mode with 4-byte wchar_t
-// fallback, uses QLatin1String as next best options
+// fallback, return a temporary QString
+// source code is assumed to be encoded in UTF-8
-# define QStringLiteral(str) QLatin1String(str)
+# define QStringLiteral(str) QString::fromUtf8(str, sizeof(str) - 1)
#endif
#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h
index 9a1fd6949b..9b1cd1ee7e 100644
--- a/src/corelib/tools/qstringbuilder.h
+++ b/src/corelib/tools/qstringbuilder.h
@@ -253,19 +253,6 @@ template <> struct QConcatenable<QString> : private QAbstractConcatenable
}
};
-template <> struct QConcatenable<QStringDataPtr> : private QAbstractConcatenable
-{
- typedef QStringDataPtr type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const type &a) { return a.ptr->size; }
- static inline void appendTo(const type &a, QChar *&out)
- {
- memcpy(out, reinterpret_cast<const char*>(a.ptr->data()), sizeof(QChar) * a.ptr->size);
- out += a.ptr->size;
- }
-};
-
template <> struct QConcatenable<QStringRef> : private QAbstractConcatenable
{
typedef QStringRef type;
@@ -358,24 +345,6 @@ template <> struct QConcatenable<QByteArray> : private QAbstractConcatenable
}
};
-template <> struct QConcatenable<QByteArrayDataPtr> : private QAbstractConcatenable
-{
- typedef QByteArrayDataPtr type;
- typedef QByteArray ConvertTo;
- enum { ExactSize = false };
- static int size(const type &ba) { return ba.ptr->size; }
-#ifndef QT_NO_CAST_FROM_ASCII
- static inline QT_ASCII_CAST_WARN void appendTo(const type &a, QChar *&out)
- {
- QAbstractConcatenable::convertFromAscii(a.ptr->data(), a.ptr->size, out);
- }
-#endif
- static inline void appendTo(const type &ba, char *&out)
- {
- ::memcpy(out, ba.ptr->data(), ba.ptr->size);
- out += ba.ptr->size;
- }
-};
template <typename A, typename B>
struct QConcatenable< QStringBuilder<A, B> >
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp
index 862789cc73..556b9ac16a 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp
@@ -107,21 +107,6 @@ void runScenario()
QCOMPARE(r, r3);
#endif
- {
- static const QStaticStringData<12> literalData = {
- Q_STATIC_STRING_DATA_HEADER_INITIALIZER(12),
- { 's', 'o', 'm', 'e', ' ', 'l', 'i', 't', 'e', 'r', 'a', 'l' }
- };
- static QStringDataPtr literal = { literalData.data_ptr() };
-
- r = literal;
- QCOMPARE(r, string);
- r = r Q literal;
- QCOMPARE(r, r2);
- r = literal Q literal;
- QCOMPARE(r, r2);
- }
-
#ifndef QT_NO_CAST_FROM_ASCII
r = string P LITERAL;
QCOMPARE(r, r2);
@@ -226,21 +211,6 @@ void runScenario()
QCOMPARE(r, ba);
}
- {
- static const QStaticByteArrayData<12> literalData = {
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(12),
- { 's', 'o', 'm', 'e', ' ', 'l', 'i', 't', 'e', 'r', 'a', 'l' }
- };
- static QByteArrayDataPtr literal = { literalData.data_ptr() };
-
- QByteArray ba = literal;
- QCOMPARE(ba, QByteArray(LITERAL));
- ba = ba Q literal;
- QCOMPARE(ba, QByteArray(LITERAL LITERAL));
- ba = literal Q literal;
- QCOMPARE(ba, QByteArray(LITERAL LITERAL));
- }
-
//operator QString +=
{
QString str = QString::fromUtf8(UTF8_LITERAL);