forked from OSchip/llvm-project
clang-format: Understand __attribute__s preceding parameter lists.
Before: ReturnType __attribute__((unused)) function(int i); After: ReturnType __attribute__((unused)) function(int i); This fixes llvm.org/PR18632. llvm-svn: 200337
This commit is contained in:
parent
5c65e7f345
commit
559b63cbb9
|
@ -384,7 +384,8 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
|
|||
} else if (Previous.is(tok::comma) && State.Stack.back().VariablePos != 0) {
|
||||
State.Column = State.Stack.back().VariablePos;
|
||||
} else if ((PreviousNonComment &&
|
||||
PreviousNonComment->ClosesTemplateDeclaration) ||
|
||||
(PreviousNonComment->ClosesTemplateDeclaration ||
|
||||
PreviousNonComment->Type == TT_AttributeParen)) ||
|
||||
((Current.Type == TT_StartOfName ||
|
||||
Current.is(tok::kw_operator)) &&
|
||||
State.ParenLevel == 0 &&
|
||||
|
|
|
@ -27,6 +27,7 @@ namespace format {
|
|||
enum TokenType {
|
||||
TT_ArrayInitializerLSquare,
|
||||
TT_ArraySubscriptLSquare,
|
||||
TT_AttributeParen,
|
||||
TT_BinaryOperator,
|
||||
TT_BitFieldColon,
|
||||
TT_BlockComment,
|
||||
|
|
|
@ -109,6 +109,8 @@ private:
|
|||
} else if (AfterCaret) {
|
||||
// This is the parameter list of an ObjC block.
|
||||
Contexts.back().IsExpression = false;
|
||||
} else if (Left->Previous && Left->Previous->is(tok::kw___attribute)) {
|
||||
Left->Type = TT_AttributeParen;
|
||||
}
|
||||
|
||||
if (StartsObjCMethodExpr) {
|
||||
|
@ -159,6 +161,9 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
if (Left->Type == TT_AttributeParen)
|
||||
CurrentToken->Type = TT_AttributeParen;
|
||||
|
||||
if (!HasMultipleLines)
|
||||
Left->PackingKind = PPK_Inconclusive;
|
||||
else if (HasMultipleParametersOnALine)
|
||||
|
@ -1332,9 +1337,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
|||
if (Left.is(tok::colon))
|
||||
return Left.Type != TT_ObjCMethodExpr;
|
||||
if (Right.is(tok::l_paren)) {
|
||||
if (Left.is(tok::r_paren) && Left.MatchingParen &&
|
||||
Left.MatchingParen->Previous &&
|
||||
Left.MatchingParen->Previous->is(tok::kw___attribute))
|
||||
if (Left.is(tok::r_paren) && Left.Type == TT_AttributeParen)
|
||||
return true;
|
||||
return Line.Type == LT_ObjCDecl ||
|
||||
Left.isOneOf(tok::kw_return, tok::kw_new, tok::kw_delete,
|
||||
|
@ -1519,14 +1522,12 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
|
|||
return false;
|
||||
if (Left.is(tok::equal) && Line.Type == LT_VirtualFunctionDecl)
|
||||
return false;
|
||||
if (Left.Previous) {
|
||||
if (Left.is(tok::l_paren) && Right.is(tok::l_paren) &&
|
||||
Left.Previous->is(tok::kw___attribute))
|
||||
return false;
|
||||
if (Left.is(tok::l_paren) && (Left.Previous->Type == TT_BinaryOperator ||
|
||||
Left.Previous->Type == TT_CastRParen))
|
||||
return false;
|
||||
}
|
||||
if (Left.is(tok::l_paren) && Left.Type == TT_AttributeParen)
|
||||
return false;
|
||||
if (Left.is(tok::l_paren) && Left.Previous &&
|
||||
(Left.Previous->Type == TT_BinaryOperator ||
|
||||
Left.Previous->Type == TT_CastRParen))
|
||||
return false;
|
||||
if (Right.Type == TT_ImplicitStringLiteral)
|
||||
return false;
|
||||
|
||||
|
@ -1570,7 +1571,7 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
|
|||
Right.isOneOf(tok::lessless, tok::arrow, tok::period, tok::colon,
|
||||
tok::l_square, tok::at) ||
|
||||
(Left.is(tok::r_paren) &&
|
||||
Right.isOneOf(tok::identifier, tok::kw_const, tok::kw___attribute)) ||
|
||||
Right.isOneOf(tok::identifier, tok::kw_const)) ||
|
||||
(Left.is(tok::l_paren) && !Right.is(tok::r_paren));
|
||||
}
|
||||
|
||||
|
|
|
@ -4394,6 +4394,8 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
|
|||
|
||||
TEST_F(FormatTest, UnderstandsAttributes) {
|
||||
verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
|
||||
verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaa(int i);");
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, UnderstandsEllipsis) {
|
||||
|
|
Loading…
Reference in New Issue