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);