diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 303205408aee2c37b8d87dff8cc4640b0ff9f14b..45cf36f5882cf7cfbfdc84948475305d3e6ada5c 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -1137,9 +1137,9 @@ void Preprocessor::trackExpansionCycles(PPToken *tk)
     }
 }
 
-static void adjustForCommentNewlines(unsigned *currentLine, const PPToken &tk)
+static void adjustForCommentOrStringNewlines(unsigned *currentLine, const PPToken &tk)
 {
-    if (tk.is(T_COMMENT) || tk.is(T_DOXY_COMMENT))
+    if (tk.is(T_COMMENT) || tk.is(T_DOXY_COMMENT) || tk.isStringLiteral())
         (*currentLine) += tk.asByteArrayRef().count('\n');
 }
 
@@ -1147,7 +1147,7 @@ void Preprocessor::synchronizeOutputLines(const PPToken &tk, bool forceLine)
 {
     if (m_state.m_expansionStatus != NotExpanding
             || (!forceLine && m_env->currentLine == tk.lineno)) {
-        adjustForCommentNewlines(&m_env->currentLine, tk);
+        adjustForCommentOrStringNewlines(&m_env->currentLine, tk);
         return;
     }
 
@@ -1164,7 +1164,7 @@ void Preprocessor::synchronizeOutputLines(const PPToken &tk, bool forceLine)
     }
 
     m_env->currentLine = tk.lineno;
-    adjustForCommentNewlines(&m_env->currentLine, tk);
+    adjustForCommentOrStringNewlines(&m_env->currentLine, tk);
 }
 
 void Preprocessor::removeTrailingOutputLines()
diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp
index ae6f83708ce0c796fea49bb82546e1723927bcd5..b1659bdad8ec799656a16f439ba5f690b8ecfd87 100644
--- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp
+++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp
@@ -336,6 +336,8 @@ private slots:
     void comments_within2_data();
     void multitokens_argument();
     void multitokens_argument_data();
+    void multiline_strings();
+    void multiline_strings_data();
 };
 
 // Remove all #... lines, and 'simplify' string, to allow easily comparing the result
@@ -1298,6 +1300,27 @@ void tst_Preprocessor::comments_within2_data()
     QTest::newRow("case 4") << original << expected;
 }
 
+void tst_Preprocessor::multiline_strings()
+{
+    compare_input_output();
+}
+
+void tst_Preprocessor::multiline_strings_data()
+{
+    QTest::addColumn<QByteArray>("input");
+    QTest::addColumn<QByteArray>("output");
+
+    QByteArray original;
+    QByteArray expected;
+
+    original = "const char *s = \"abc\\\n"
+               "xyz\";\n";
+    expected = "# 1 \"<stdin>\"\n"
+               "const char *s = \"abc\\\n"
+               "xyz\";\n";
+    QTest::newRow("case 1") << original << expected;
+}
+
 void tst_Preprocessor::compare_input_output(bool keepComments)
 {
     QFETCH(QByteArray, input);