Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2037,13 +2037,17 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() { const FormatToken *Previous = FormatTok->Previous; - if (Previous && - (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new, - tok::kw_delete, tok::l_square) || - FormatTok->isCppStructuredBinding(Style) || Previous->closesScope() || - Previous->isSimpleTypeSpecifier())) { - nextToken(); - return false; + if (Previous) { + const FormatToken *PrevPrev = Previous->Previous; + if (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new, + tok::kw_delete, tok::l_square) || + FormatTok->isCppStructuredBinding(Style) || Previous->closesScope() || + Previous->isSimpleTypeSpecifier() || + (Previous->is(tok::star) && PrevPrev && + PrevPrev->isSimpleTypeSpecifier())) { + nextToken(); + return false; + } } nextToken(); if (FormatTok->is(tok::l_square)) Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ 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"