forked from OSchip/llvm-project
clang-format: Fix left pointer alignment after delctype/typeof
Change 272124* introduced a regression in spaceRequiredBetween for left aligned pointers to decltype and typeof expressions. This fix adds logic to fix this. The test added is based on a related test in determineStarAmpUsage. Also add test cases for the regression. http://llvm.org/viewvc/llvm-project?view=revision&revision=272124 LLVM bug tracker: https://bugs.llvm.org/show_bug.cgi?id=30407 Differential revision: https://reviews.llvm.org/D35847 Fix contributed by euhlmann! llvm-svn: 310831
This commit is contained in:
parent
0f311a4189
commit
9b5a89b0e2
|
@ -1406,11 +1406,13 @@ private:
|
|||
if (NextToken->isOneOf(tok::comma, tok::semi))
|
||||
return TT_PointerOrReference;
|
||||
|
||||
if (PrevToken->is(tok::r_paren) && PrevToken->MatchingParen &&
|
||||
PrevToken->MatchingParen->Previous &&
|
||||
PrevToken->MatchingParen->Previous->isOneOf(tok::kw_typeof,
|
||||
tok::kw_decltype))
|
||||
return TT_PointerOrReference;
|
||||
if (PrevToken->is(tok::r_paren) && PrevToken->MatchingParen) {
|
||||
FormatToken *TokenBeforeMatchingParen =
|
||||
PrevToken->MatchingParen->getPreviousNonComment();
|
||||
if (TokenBeforeMatchingParen &&
|
||||
TokenBeforeMatchingParen->isOneOf(tok::kw_typeof, tok::kw_decltype))
|
||||
return TT_PointerOrReference;
|
||||
}
|
||||
|
||||
if (PrevToken->Tok.isLiteral() ||
|
||||
PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::kw_true,
|
||||
|
@ -2214,14 +2216,23 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
|||
Left.Previous->is(tok::kw_case));
|
||||
if (Left.is(tok::l_square) && Right.is(tok::amp))
|
||||
return false;
|
||||
if (Right.is(TT_PointerOrReference))
|
||||
return (Left.is(tok::r_paren) && Line.MightBeFunctionDecl) ||
|
||||
(Left.Tok.isLiteral() ||
|
||||
if (Right.is(TT_PointerOrReference)) {
|
||||
if (Left.is(tok::r_paren) && Line.MightBeFunctionDecl) {
|
||||
if (!Left.MatchingParen)
|
||||
return true;
|
||||
FormatToken *TokenBeforeMatchingParen =
|
||||
Left.MatchingParen->getPreviousNonComment();
|
||||
if (!TokenBeforeMatchingParen ||
|
||||
!TokenBeforeMatchingParen->isOneOf(tok::kw_typeof, tok::kw_decltype))
|
||||
return true;
|
||||
}
|
||||
return (Left.Tok.isLiteral() ||
|
||||
(!Left.isOneOf(TT_PointerOrReference, tok::l_paren) &&
|
||||
(Style.PointerAlignment != FormatStyle::PAS_Left ||
|
||||
(Line.IsMultiVariableDeclStmt &&
|
||||
(Left.NestingLevel == 0 ||
|
||||
(Left.NestingLevel == 1 && Line.First->is(tok::kw_for)))))));
|
||||
}
|
||||
if (Right.is(TT_FunctionTypeLParen) && Left.isNot(tok::l_paren) &&
|
||||
(!Left.is(TT_PointerOrReference) ||
|
||||
(Style.PointerAlignment != FormatStyle::PAS_Right &&
|
||||
|
|
|
@ -5448,6 +5448,10 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
|
|||
verifyFormat("for (;; *a = b) {\n}", Left);
|
||||
verifyFormat("return *this += 1;", Left);
|
||||
verifyFormat("throw *x;", Left);
|
||||
verifyFormat("delete *x;", Left);
|
||||
verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
|
||||
verifyFormat("[](const decltype(*a)* ptr) {}", Left);
|
||||
verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
|
||||
|
||||
verifyIndependentOfContext("a = *(x + y);");
|
||||
verifyIndependentOfContext("a = &(x + y);");
|
||||
|
@ -5494,9 +5498,6 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
|
|||
verifyGoogleFormat("T** t = new T*;");
|
||||
verifyGoogleFormat("T** t = new T*();");
|
||||
|
||||
FormatStyle PointerLeft = getLLVMStyle();
|
||||
PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
|
||||
verifyFormat("delete *x;", PointerLeft);
|
||||
verifyFormat("STATIC_ASSERT((a & b) == 0);");
|
||||
verifyFormat("STATIC_ASSERT(0 == (a & b));");
|
||||
verifyFormat("template <bool a, bool b> "
|
||||
|
|
Loading…
Reference in New Issue