Skip to content

Commit 7699b34

Browse files
owencatstellar
authored andcommitted
release/18.x: [clang-format] Fix a regression in annotating BK_BracedInit (llvm#87450)
Backport 7c9c38e
1 parent fb86592 commit 7699b34

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -489,18 +489,23 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
489489
};
490490
SmallVector<StackEntry, 8> LBraceStack;
491491
assert(Tok->is(tok::l_brace));
492+
492493
do {
493-
// Get next non-comment, non-preprocessor token.
494494
FormatToken *NextTok;
495495
do {
496496
NextTok = Tokens->getNextToken();
497497
} while (NextTok->is(tok::comment));
498-
while (NextTok->is(tok::hash) && !Line->InMacroBody) {
499-
NextTok = Tokens->getNextToken();
500-
do {
501-
NextTok = Tokens->getNextToken();
502-
} while (NextTok->is(tok::comment) ||
503-
(NextTok->NewlinesBefore == 0 && NextTok->isNot(tok::eof)));
498+
499+
if (!Line->InMacroBody) {
500+
// Skip PPDirective lines and comments.
501+
while (NextTok->is(tok::hash)) {
502+
do {
503+
NextTok = Tokens->getNextToken();
504+
} while (NextTok->NewlinesBefore == 0 && NextTok->isNot(tok::eof));
505+
506+
while (NextTok->is(tok::comment))
507+
NextTok = Tokens->getNextToken();
508+
}
504509
}
505510

506511
switch (Tok->Tok.getKind()) {
@@ -631,6 +636,7 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
631636
default:
632637
break;
633638
}
639+
634640
PrevTok = Tok;
635641
Tok = NextTok;
636642
} while (Tok->isNot(tok::eof) && !LBraceStack.empty());

clang/unittests/Format/FormatTest.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27019,6 +27019,18 @@ TEST_F(FormatTest, PPBranchesInBracedInit) {
2701927019
"};");
2702027020
}
2702127021

27022+
TEST_F(FormatTest, PPDirectivesAndCommentsInBracedInit) {
27023+
verifyFormat("{\n"
27024+
" char *a[] = {\n"
27025+
" /* abc */ \"abc\",\n"
27026+
"#if FOO\n"
27027+
" /* xyz */ \"xyz\",\n"
27028+
"#endif\n"
27029+
" /* last */ \"last\"};\n"
27030+
"}",
27031+
getLLVMStyleWithColumns(30));
27032+
}
27033+
2702227034
TEST_F(FormatTest, StreamOutputOperator) {
2702327035
verifyFormat("std::cout << \"foo\" << \"bar\" << baz;");
2702427036
verifyFormat("std::cout << \"foo\\n\"\n"

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2609,6 +2609,19 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
26092609
EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);
26102610
EXPECT_BRACE_KIND(Tokens[13], BK_Block);
26112611
EXPECT_BRACE_KIND(Tokens[14], BK_Block);
2612+
2613+
Tokens = annotate("{\n"
2614+
" char *a[] = {\n"
2615+
" /* abc */ \"abc\",\n"
2616+
"#if FOO\n"
2617+
" /* xyz */ \"xyz\",\n"
2618+
"#endif\n"
2619+
" /* last */ \"last\"};\n"
2620+
"}");
2621+
ASSERT_EQ(Tokens.size(), 25u) << Tokens;
2622+
EXPECT_BRACE_KIND(Tokens[0], BK_Block);
2623+
EXPECT_BRACE_KIND(Tokens[7], BK_BracedInit);
2624+
EXPECT_BRACE_KIND(Tokens[21], BK_BracedInit);
26122625
}
26132626

26142627
TEST_F(TokenAnnotatorTest, StreamOperator) {

0 commit comments

Comments
 (0)