[clang-format] clang-format eats space in front of attributes for operator delete

https://github.com/llvm/llvm-project/issues/27037

Sorry its taken so long to get to this issue! (got it before it hit its 6th birthday!)

```
void operator delete(void *foo)ATTRIB;
```

(void *foo) is incorrectly determined to be a C-Style Cast resulting in the space being removed after the ) and before the attrib, due to the detection of

```
delete (A* )a;
```

The following was previously unaffected

```
void operator new(void *foo) ATTRIB;
```

Fixes #27037

Reviewed By: curdeius, HazardyKnusperkeks

Differential Revision: https://reviews.llvm.org/D116920
This commit is contained in:
mydeveloperday 2022-01-13 07:53:00 +00:00
parent bb13036483
commit 7ee4236789
2 changed files with 12 additions and 0 deletions

View file

@ -1893,6 +1893,13 @@ private:
LeftOfParens = LeftOfParens->MatchingParen->Previous;
}
// The Condition directly below this one will see the operator arguments
// as a (void *foo) cast.
// void operator delete(void *foo) ATTRIB;
if (LeftOfParens->Tok.getIdentifierInfo() && LeftOfParens->Previous &&
LeftOfParens->Previous->is(tok::kw_operator))
return false;
// If there is an identifier (or with a few exceptions a keyword) right
// before the parentheses, this is unlikely to be a cast.
if (LeftOfParens->Tok.getIdentifierInfo() &&

View file

@ -9459,6 +9459,11 @@ TEST_F(FormatTest, UnderstandsNewAndDelete) {
" new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
" typename aaaaaaaaaaaaaaaaaaaaaaaa();");
verifyFormat("delete[] h->p;");
verifyFormat("void operator delete(void *foo) ATTRIB;");
verifyFormat("void operator new(void *foo) ATTRIB;");
verifyFormat("void operator delete[](void *foo) ATTRIB;");
verifyFormat("void operator delete(void *ptr) noexcept;");
}
TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {