diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2048,6 +2048,11 @@ nextToken(); if (FormatTok->is(tok::l_square)) return false; + if (FormatTok->is(tok::r_square)) { + const FormatToken *Next = Tokens->peekNextToken(); + if (Next && Next->is(tok::greater)) + return false; + } parseSquare(/*LambdaIntroducer=*/true); return true; } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -3336,6 +3336,14 @@ verifyFormat("if (public == private)\n"); verifyFormat("void foo(public, private)"); verifyFormat("public::foo();"); + + verifyFormat("class A {\n" + "public:\n" + " std::unique_ptr b() { return nullptr; }\n" + "\n" + "private:\n" + " int c;\n" + "};"); } TEST_F(FormatTest, SeparatesLogicalBlocks) { @@ -21487,6 +21495,7 @@ " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" " );\n" "}"); + verifyFormat("auto k = *[](int *j) { return j; }(&i);"); // Lambdas created through weird macros. verifyFormat("void f() {\n"