diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 24d43dad8889e166371c9ec9f9376a12868af53c..943d8efe1de0eb6dc107e419ce850093c0dc1d98 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -10609,7 +10609,7 @@ QString QString::toHtmlEscaped() const
 /*!
     \internal
  */
-void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out)
+void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW
 {
     qt_from_latin1(reinterpret_cast<ushort *>(out), a, uint(len));
 }
diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp
index eba939a413e3bba3dfe539da3fa872372595e032..85babbd698d71e50b1fcc98bd532ca178b5675c6 100644
--- a/src/corelib/tools/qstringbuilder.cpp
+++ b/src/corelib/tools/qstringbuilder.cpp
@@ -39,6 +39,7 @@
 
 #include "qstringbuilder.h"
 #include <QtCore/qtextcodec.h>
+#include <private/qutfcodec_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -107,7 +108,7 @@ QT_BEGIN_NAMESPACE
 /*!
     \internal
  */
-void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out)
+void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW
 {
     if (len == -1) {
         if (!a)
@@ -116,6 +117,7 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out
             *out++ = QLatin1Char(*a++);
         if (!*a)
             return;
+        len = int(strlen(a));
     } else {
         int i;
         for (i = 0; i < len && uchar(a[i]) < 0x80U; ++i)
@@ -127,9 +129,7 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out
     }
 
     // we need to complement with UTF-8 appending
-    QString tmp = QString::fromUtf8(a, len);
-    memcpy(out, reinterpret_cast<const char *>(tmp.constData()), sizeof(QChar) * tmp.size());
-    out += tmp.size();
+    out = QUtf8::convertToUnicode(out, a, len);
 }
 
 QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h
index faf9eb4b4d841db799de7cbd870ec40e578ff733..8ce98cbd71e3c72fa69a4541273763b077e4ea71 100644
--- a/src/corelib/tools/qstringbuilder.h
+++ b/src/corelib/tools/qstringbuilder.h
@@ -58,12 +58,12 @@ QT_BEGIN_NAMESPACE
 struct Q_CORE_EXPORT QAbstractConcatenable
 {
 protected:
-    static void convertFromAscii(const char *a, int len, QChar *&out);
-    static inline void convertFromAscii(char a, QChar *&out)
+    static void convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW;
+    static inline void convertFromAscii(char a, QChar *&out) Q_DECL_NOTHROW
     {
         *out++ = QLatin1Char(a);
     }
-    static void appendLatin1To(const char *a, int len, QChar *out);
+    static void appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW;
 };
 
 template <typename T> struct QConcatenable {};