Skip to content

Commit a7bca18

Browse files
authored
[clang-format] Correctly annotate braces in macro definitions (#123279)
Fixes #123179.
1 parent 143c33c commit a7bca18

File tree

3 files changed

+19
-17
lines changed

3 files changed

+19
-17
lines changed

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,14 +503,14 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
503503
auto *NextTok = Tokens->getNextNonComment();
504504

505505
if (!Line->InMacroBody && !Style.isTableGen()) {
506-
// Skip PPDirective lines and comments.
506+
// Skip PPDirective lines (except macro definitions) and comments.
507507
while (NextTok->is(tok::hash)) {
508508
NextTok = Tokens->getNextToken();
509-
if (NextTok->is(tok::pp_not_keyword))
509+
if (NextTok->isOneOf(tok::pp_not_keyword, tok::pp_define))
510510
break;
511511
do {
512512
NextTok = Tokens->getNextToken();
513-
} while (!NextTok->HasUnescapedNewline && NextTok->isNot(tok::eof));
513+
} while (NextTok->NewlinesBefore == 0 && NextTok->isNot(tok::eof));
514514

515515
while (NextTok->is(tok::comment))
516516
NextTok = Tokens->getNextToken();

clang/unittests/Format/FormatTest.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5732,23 +5732,12 @@ TEST_F(FormatTest, HashInMacroDefinition) {
57325732

57335733
verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
57345734

5735-
#if 0
5736-
// FIXME: The correct format is:
57375735
verifyFormat("{\n"
57385736
" {\n"
57395737
"#define GEN_ID(_x) char *_x{#_x}\n"
57405738
" GEN_ID(one);\n"
57415739
" }\n"
57425740
"}");
5743-
#endif
5744-
verifyFormat("{\n"
5745-
" {\n"
5746-
"#define GEN_ID(_x) \\\n"
5747-
" char *_x { #_x }\n"
5748-
" GEN_ID(one);\n"
5749-
" }\n"
5750-
"}",
5751-
getGoogleStyle());
57525741
}
57535742

57545743
TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3413,14 +3413,27 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
34133413
EXPECT_BRACE_KIND(Tokens[0], BK_Block);
34143414
EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_BlockLBrace);
34153415
EXPECT_BRACE_KIND(Tokens[1], BK_Block);
3416-
#if 0
3417-
// FIXME:
34183416
EXPECT_BRACE_KIND(Tokens[11], BK_BracedInit);
34193417
EXPECT_BRACE_KIND(Tokens[14], BK_BracedInit);
3420-
#endif
34213418
EXPECT_BRACE_KIND(Tokens[20], BK_Block);
34223419
EXPECT_BRACE_KIND(Tokens[21], BK_Block);
34233420

3421+
Tokens = annotate("{\n"
3422+
"#define FOO \\\n"
3423+
" { \\\n"
3424+
" case bar: { \\\n"
3425+
" break; \\\n"
3426+
" } \\\n"
3427+
" }\n"
3428+
"}");
3429+
ASSERT_EQ(Tokens.size(), 15u) << Tokens;
3430+
EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_BlockLBrace);
3431+
EXPECT_BRACE_KIND(Tokens[4], BK_Block);
3432+
EXPECT_TOKEN(Tokens[7], tok::colon, TT_CaseLabelColon);
3433+
EXPECT_BRACE_KIND(Tokens[8], BK_Block);
3434+
EXPECT_BRACE_KIND(Tokens[11], BK_Block);
3435+
EXPECT_BRACE_KIND(Tokens[12], BK_Block);
3436+
34243437
Tokens = annotate("a = class extends goog.a {};",
34253438
getGoogleStyle(FormatStyle::LK_JavaScript));
34263439
ASSERT_EQ(Tokens.size(), 11u) << Tokens;

0 commit comments

Comments
 (0)