From 80fdc9eb939f883d3edc7002cd036db08d046487 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 23 Sep 2024 14:12:59 +0200 Subject: [PATCH] CPlusPlus: Fix pragma parsing Trailing comments were not handled properly. Amends ccae4fc93c3bdddc37e8cf68d9f0923fb64c1e7c. Fixes: QTCREATORBUG-31611 Change-Id: I9ec57e4b90faa6a5097f1bfdcaff20531b3dc589 Reviewed-by: Christian Stenger --- src/libs/cplusplus/pp-engine.cpp | 7 +++++-- tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 2357397c7dc..32de4afb894 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -1876,8 +1876,11 @@ void Preprocessor::handlePragmaDirective(PPToken *tk) lex(tk); // consume "pragma" token while (isContinuationToken(*tk)) { - if (!consumeComments(tk)) - return; + if (tk->isComment()) { + if (!consumeComments(tk)) + return; + continue; + } pragma.tokens << tk->asByteArrayRef().toByteArray(); lex(tk); } diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index 2a1c1323d4a..3764919b234 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -2105,10 +2105,12 @@ void tst_Preprocessor::pragmas() QByteArray output; MockClient client(&env, &output); Preprocessor preprocess(&client, &env); + preprocess.setKeepComments(true); QByteArray input = "#pragma once\n" "#include \n" - "#pragma pack(/*distraction*/push)\n" + "#pragma pack(/*distraction*/push) // comment\n" + "#define THE_MACRO\n" "struct S { bool b1; int i; short s; bool b2; };\n" "#pragma pack(pop)\n"; preprocess.run(QLatin1String(""), input); @@ -2117,8 +2119,9 @@ void tst_Preprocessor::pragmas() QCOMPARE(client.pragmas().at(0).tokens, QByteArrayList{"once"}); QCOMPARE(client.pragmas().at(1).line, 3); QCOMPARE(client.pragmas().at(1).tokens, (QByteArrayList{"pack", "(", "push", ")"})); - QCOMPARE(client.pragmas().at(2).line, 5); + QCOMPARE(client.pragmas().at(2).line, 6); QCOMPARE(client.pragmas().at(2).tokens, (QByteArrayList{"pack", "(", "pop", ")"})); + QCOMPARE(client.definedMacrosLine(), QList{4}); } void tst_Preprocessor::excessive_nesting()