Skip to content

Commit

Permalink
[clang-format] Correctly annotate braces in macros (llvm#87953)
Browse files Browse the repository at this point in the history
Also fix unit tests and reformat polly.

Fixes llvm#86550.
  • Loading branch information
owenca authored Apr 10, 2024
1 parent 000f2b5 commit 58323de
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 16 deletions.
20 changes: 10 additions & 10 deletions clang/lib/Format/UnwrappedLineParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -538,16 +538,6 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
if (Style.Language == FormatStyle::LK_Proto) {
ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square);
} else {
// Skip NextTok over preprocessor lines, otherwise we may not
// properly diagnose the block as a braced intializer
// if the comma separator appears after the pp directive.
while (NextTok->is(tok::hash)) {
ScopedMacroState MacroState(*Line, Tokens, NextTok);
do {
NextTok = Tokens->getNextToken();
} while (NextTok->isNot(tok::eof));
}

// Using OriginalColumn to distinguish between ObjC methods and
// binary operators is a bit hacky.
bool NextIsObjCMethod = NextTok->isOneOf(tok::plus, tok::minus) &&
Expand Down Expand Up @@ -606,6 +596,16 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
NextTok = Tokens->getNextToken();
ProbablyBracedList = NextTok->isNot(tok::l_square);
}

// Cpp macro definition body that is a nonempty braced list or block:
if (IsCpp && Line->InMacroBody && PrevTok != FormatTok &&
!FormatTok->Previous && NextTok->is(tok::eof) &&
// A statement can end with only `;` (simple statement), a block
// closing brace (compound statement), or `:` (label statement).
// If PrevTok is a block opening brace, Tok ends an empty block.
!PrevTok->isOneOf(tok::semi, BK_Block, tok::colon)) {
ProbablyBracedList = true;
}
}
if (ProbablyBracedList) {
Tok->setBlockKind(BK_BracedInit);
Expand Down
9 changes: 8 additions & 1 deletion clang/unittests/Format/FormatTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1865,6 +1865,13 @@ TEST_F(FormatTest, UnderstandsMacros) {
verifyFormat("MACRO(co_return##something)");

verifyFormat("#define A x:");

verifyFormat("#define Foo(Bar) {#Bar}", "#define Foo(Bar) \\\n"
" { \\\n"
" #Bar \\\n"
" }");
verifyFormat("#define Foo(Bar) {#Bar}", "#define Foo(Bar) \\\n"
" { #Bar }");
}

TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
Expand Down Expand Up @@ -11033,7 +11040,7 @@ TEST_F(FormatTest, UnderstandsTemplateParameters) {
verifyFormat("some_templated_type<decltype([](int i) { return i; })>");

verifyFormat("#define FOO(typeName, realClass) \\\n"
" { #typeName, foo<FooType>(new foo<realClass>(#typeName)) }",
" {#typeName, foo<FooType>(new foo<realClass>(#typeName))}",
getLLVMStyleWithColumns(60));
}

Expand Down
21 changes: 17 additions & 4 deletions clang/unittests/Format/TokenAnnotatorTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1933,14 +1933,20 @@ TEST_F(TokenAnnotatorTest, UnderstandHashInMacro) {
" #Bar \\\n"
" }");
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_BRACE_KIND(Tokens[6], BK_Block);
EXPECT_BRACE_KIND(Tokens[9], BK_Block);
EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);
EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);

Tokens = annotate("#define Foo(Bar) \\\n"
" { #Bar }");
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_BRACE_KIND(Tokens[6], BK_Block);
EXPECT_BRACE_KIND(Tokens[9], BK_Block);
EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);
EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);

Tokens = annotate("#define FOO(typeName, realClass) \\\n"
" {#typeName, foo<Foo>(new foo<realClass>(#typeName))}");
ASSERT_EQ(Tokens.size(), 29u) << Tokens;
EXPECT_BRACE_KIND(Tokens[8], BK_BracedInit);
EXPECT_BRACE_KIND(Tokens[27], BK_BracedInit);
}

TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacros) {
Expand Down Expand Up @@ -2822,6 +2828,13 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
EXPECT_BRACE_KIND(Tokens[0], BK_Block);
EXPECT_BRACE_KIND(Tokens[7], BK_BracedInit);
EXPECT_BRACE_KIND(Tokens[21], BK_BracedInit);

Tokens =
annotate("#define SCOP_STAT(NAME, DESC) \\\n"
" {\"polly\", #NAME, \"Number of rejected regions: \" DESC}");
ASSERT_EQ(Tokens.size(), 18u) << Tokens;
EXPECT_BRACE_KIND(Tokens[8], BK_BracedInit);
EXPECT_BRACE_KIND(Tokens[16], BK_BracedInit);
}

TEST_F(TokenAnnotatorTest, StreamOperator) {
Expand Down
2 changes: 1 addition & 1 deletion polly/lib/Analysis/ScopDetectionDiagnostic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ using namespace llvm;
#define DEBUG_TYPE "polly-detect"

#define SCOP_STAT(NAME, DESC) \
{ "polly-detect", "NAME", "Number of rejected regions: " DESC }
{"polly-detect", "NAME", "Number of rejected regions: " DESC}

static Statistic RejectStatistics[] = {
SCOP_STAT(CFG, ""),
Expand Down

0 comments on commit 58323de

Please sign in to comment.