Skip to content

Commit

Permalink
[clang-format] Fix formatting of the array form of delete.
Browse files Browse the repository at this point in the history
Fixes #53576.

There was an inconsistency in formatting of delete expressions.

Before:
```
delete (void*)a;
delete[](void*) a;
```

After this patch:
```
delete (void*)a;
delete[] (void*)a;
```

Reviewed By: HazardyKnusperkeks, owenpan

Differential Revision: https://reviews.llvm.org/D119117
  • Loading branch information
mkurdej committed Feb 9, 2022
1 parent 49ab760 commit a77c67f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
24 changes: 23 additions & 1 deletion clang/lib/Format/TokenAnnotator.cpp
Expand Up @@ -1883,6 +1883,25 @@ class AnnotatingParser {
LeftOfParens = LeftOfParens->MatchingParen->Previous;
}

if (LeftOfParens->is(tok::r_square)) {
// delete[] (void *)ptr;
auto MayBeArrayDelete = [](FormatToken *Tok) -> FormatToken * {
if (Tok->isNot(tok::r_square))
return nullptr;

Tok = Tok->getPreviousNonComment();
if (!Tok || Tok->isNot(tok::l_square))
return nullptr;

Tok = Tok->getPreviousNonComment();
if (!Tok || Tok->isNot(tok::kw_delete))
return nullptr;
return Tok;
};
if (FormatToken *MaybeDelete = MayBeArrayDelete(LeftOfParens))
LeftOfParens = MaybeDelete;
}

// The Condition directly below this one will see the operator arguments
// as a (void *foo) cast.
// void operator delete(void *foo) ATTRIB;
Expand Down Expand Up @@ -3227,7 +3246,10 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
if (Left.isOneOf(tok::kw_try, Keywords.kw___except, tok::kw_catch))
return Style.SpaceBeforeParensOptions.AfterControlStatements ||
spaceRequiredBeforeParens(Right);
if (Left.isOneOf(tok::kw_new, tok::kw_delete))
if (Left.isOneOf(tok::kw_new, tok::kw_delete) ||
(Left.is(tok::r_square) && Left.MatchingParen &&
Left.MatchingParen->Previous &&
Left.MatchingParen->Previous->is(tok::kw_delete)))
return Style.SpaceBeforeParens != FormatStyle::SBPO_Never ||
spaceRequiredBeforeParens(Right);
}
Expand Down
1 change: 1 addition & 0 deletions clang/unittests/Format/FormatTest.cpp
Expand Up @@ -9744,6 +9744,7 @@ TEST_F(FormatTest, UnderstandsNewAndDelete) {
" new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
" typename aaaaaaaaaaaaaaaaaaaaaaaa();");
verifyFormat("delete[] h->p;");
verifyFormat("delete[] (void *)p;");

verifyFormat("void operator delete(void *foo) ATTRIB;");
verifyFormat("void operator new(void *foo) ATTRIB;");
Expand Down
22 changes: 22 additions & 0 deletions clang/unittests/Format/TokenAnnotatorTest.cpp
Expand Up @@ -97,6 +97,28 @@ TEST_F(TokenAnnotatorTest, UnderstandsLBracesInMacroDefinition) {
EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_Unknown);
}

TEST_F(TokenAnnotatorTest, UnderstandsDelete) {
auto Tokens = annotate("delete (void *)p;");
EXPECT_EQ(Tokens.size(), 8u) << Tokens;
EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);

Tokens = annotate("delete[] (void *)p;");
EXPECT_EQ(Tokens.size(), 10u) << Tokens;
EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);

Tokens = annotate("delete[] /*comment*/ (void *)p;");
EXPECT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);

Tokens = annotate("delete[/*comment*/] (void *)p;");
EXPECT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);

Tokens = annotate("delete/*comment*/[] (void *)p;");
EXPECT_EQ(Tokens.size(), 11u) << Tokens;
EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
}

} // namespace
} // namespace format
} // namespace clang

0 comments on commit a77c67f

Please sign in to comment.