[clang-format] Correctly handle SpaceBeforeParens for builtins.

That's a partial fix for https://github.com/llvm/llvm-project/issues/55292.

Before, known builtins behaved differently from other identifiers:
```
void f () { return F (__builtin_LINE() + __builtin_FOO ()); }
```
After:
```
void f () { return F (__builtin_LINE () + __builtin_FOO ()); }
```

Reviewed By: owenpan

Differential Revision: https://reviews.llvm.org/D125085
This commit is contained in:
Marek Kurdej 2022-05-06 11:27:14 +02:00
parent 91b24b0180
commit 85ec8a9ac1
2 changed files with 5 additions and 2 deletions

View file

@ -3436,9 +3436,9 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
return (Style.SpaceBeforeParens != FormatStyle::SBPO_Never) ||
spaceRequiredBeforeParens(Right);
}
// Handle builtins like identifiers.
if (Line.Type != LT_PreprocessorDirective &&
(Left.is(tok::identifier) || Left.isFunctionLikeKeyword() ||
Left.is(tok::r_paren) || Left.isSimpleTypeSpecifier()))
(Left.Tok.getIdentifierInfo() || Left.is(tok::r_paren)))
return spaceRequiredBeforeParens(Right);
return false;
}

View file

@ -15082,6 +15082,9 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
// verifyFormat("X A::operator++ (T);", Space);
verifyFormat("auto lambda = [] () { return 0; };", Space);
verifyFormat("int x = int (y);", Space);
verifyFormat("#define F(...) __VA_OPT__ (__VA_ARGS__)", Space);
verifyFormat("__builtin_LINE ()", Space);
verifyFormat("__builtin_UNKNOWN ()", Space);
FormatStyle SomeSpace = getLLVMStyle();
SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;