[PATCH] D109951: [clang-format] Constructor initializer lists format with pp directives
Josh Learn via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 17 00:25:55 PDT 2021
guitard0g created this revision.
guitard0g requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Currently constructor initializer lists sometimes format incorrectly
when there is a preprocessor directive in the middle of the list.
This patch fixes the issue when parsing the initilizer list by
ignoring the preprocessor directive when checking if a block is
part of an initializer list.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D109951
Files:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -19268,6 +19268,38 @@
Style);
}
+TEST_F(FormatTest, ConstructorInitializersWithPreprocessorDirective) {
+ FormatStyle Style = getLLVMStyle();
+ Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
+ Style.ConstructorInitializerIndentWidth = 4;
+ verifyFormat("SomeClass::Constructor()\n"
+ " : a{a}\n"
+ "#if CONDITION\n"
+ " , b{b}\n"
+ "#endif\n"
+ "{\n}",
+ Style);
+ Style.ConstructorInitializerIndentWidth = 2;
+ verifyFormat("SomeClass::Constructor()\n"
+ "#if CONDITION\n"
+ " : a{a}\n"
+ "#endif\n"
+ " , b{b}\n"
+ " , c{c} {\n}",
+ Style);
+ Style.ConstructorInitializerIndentWidth = 0;
+ Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
+ verifyFormat("SomeClass::Constructor()\n"
+ ": a{a}\n"
+ "#ifdef CONDITION\n"
+ ", b{b}\n"
+ "#else\n"
+ ", c{c}\n"
+ "#endif\n"
+ ", d{d} {\n}",
+ Style);
+}
+
TEST_F(FormatTest, Destructors) {
verifyFormat("void F(int &i) { i.~int(); }");
verifyFormat("void F(int &i) { i->~int(); }");
Index: clang/lib/Format/UnwrappedLineParser.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -459,6 +459,17 @@
++ReadTokens;
} while (NextTok->is(tok::comment));
+ // Skip over preprocessor lines, otherwise we may not
+ // properly diagnose the block as a braced intializer
+ // if the comma separator appears after the pp directive.
+ if (NextTok->is(tok::hash)) {
+ ScopedMacroState MacroState(*Line, Tokens, NextTok);
+ do {
+ NextTok = Tokens->getNextToken();
+ ++ReadTokens;
+ } while (NextTok->isNot(tok::eof));
+ }
+
switch (Tok->Tok.getKind()) {
case tok::l_brace:
if (Style.Language == FormatStyle::LK_JavaScript && PrevTok) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109951.373154.patch
Type: text/x-patch
Size: 2317 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210917/d74192e1/attachment-0001.bin>
More information about the cfe-commits
mailing list