Author: klimek Date: Wed Apr 11 07:51:54 2018 New Revision: 329816 URL: http://llvm.org/viewvc/llvm-project?rev=329816&view=rev Log: Fix bugs around handling C++11 attributes.
Previously, we would format: int a() { ... } [[unused]] int b() { ... } as... int a() {} [[unused] int b() {} Now we correctly format each on its own line. Similarly, we would detect: [[unused]] int b() { return 42; } As a lambda and leave it on a single line, even if that was disallowed by the format style. Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp cfe/trunk/unittests/Format/FormatTest.cpp Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=329816&r1=329815&r2=329816&view=diff ============================================================================== --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original) +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Wed Apr 11 07:51:54 2018 @@ -449,12 +449,19 @@ void UnwrappedLineParser::calculateBrace (Style.isCpp() && NextTok->is(tok::l_paren)) || NextTok->isOneOf(tok::comma, tok::period, tok::colon, tok::r_paren, tok::r_square, tok::l_brace, - tok::l_square, tok::ellipsis) || + tok::ellipsis) || (NextTok->is(tok::identifier) && !PrevTok->isOneOf(tok::semi, tok::r_brace, tok::l_brace)) || (NextTok->is(tok::semi) && (!ExpectClassBody || LBraceStack.size() != 1)) || (NextTok->isBinaryOperator() && !NextIsObjCMethod); + if (NextTok->is(tok::l_square)) { + // We can have an array subscript after a braced init + // list, but C++11 attributes are expected after blocks. + NextTok = Tokens->getNextToken(); + ++ReadTokens; + ProbablyBracedList = NextTok->isNot(tok::l_square); + } } if (ProbablyBracedList) { Tok->BlockKind = BK_BracedInit; @@ -1406,13 +1413,16 @@ bool UnwrappedLineParser::tryToParseLamb const FormatToken *Previous = FormatTok->Previous; if (Previous && (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new, - tok::kw_delete) || + tok::kw_delete, tok::l_square) || FormatTok->isCppStructuredBinding(Style) || Previous->closesScope() || Previous->isSimpleTypeSpecifier())) { nextToken(); return false; } nextToken(); + if (FormatTok->is(tok::l_square)) { + return false; + } parseSquare(/*LambdaIntroducer=*/true); return true; } Modified: cfe/trunk/unittests/Format/FormatTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=329816&r1=329815&r2=329816&view=diff ============================================================================== --- cfe/trunk/unittests/Format/FormatTest.cpp (original) +++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Apr 11 07:51:54 2018 @@ -6078,6 +6078,21 @@ TEST_F(FormatTest, UnderstandsSquareAttr verifyFormat("void f() [[deprecated(\"so sorry\")]];"); verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); + + // Make sure we do not mistake attributes for array subscripts. + verifyFormat("int a() {}\n" + "[[unused]] int b() {}\n"); + + // On the other hand, we still need to correctly find array subscripts. + verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); + + // Make sure we do not parse attributes as lambda introducers. + FormatStyle MultiLineFunctions = getLLVMStyle(); + MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; + verifyFormat("[[unused]] int b() {\n" + " return 42;\n" + "}\n", + MultiLineFunctions); } TEST_F(FormatTest, UnderstandsEllipsis) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits