diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst index fea52679585a6..5ebb8c82b3049 100644 --- a/clang/docs/ClangFormatStyleOptions.rst +++ b/clang/docs/ClangFormatStyleOptions.rst @@ -3788,8 +3788,8 @@ the configuration (without a prefix: ``Auto``). }); * ``LBI_OuterScope`` (in configuration: ``OuterScope``) - Align lambda body relative to the indentation level of the outer scope - the lambda signature resides in. + For statements within block scope, align lambda body relative to the + indentation level of the outer scope the lambda signature resides in. .. code-block:: c++ diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index e78aa62f93cff..2707ea608c74e 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -2879,8 +2879,8 @@ struct FormatStyle { /// }); /// \endcode LBI_Signature, - /// Align lambda body relative to the indentation level of the outer scope - /// the lambda signature resides in. + /// For statements within block scope, align lambda body relative to the + /// indentation level of the outer scope the lambda signature resides in. /// \code /// someMethod( /// [](SomeReallyLongLambdaSignatureArgument foo) { diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index deb3e554fdc12..70abef1169751 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -1955,7 +1955,8 @@ void ContinuationIndenter::moveStatePastScopeCloser(LineState &State) { void ContinuationIndenter::moveStateToNewBlock(LineState &State) { if (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope && - State.NextToken->is(TT_LambdaLBrace)) { + State.NextToken->is(TT_LambdaLBrace) && + !State.Line->MightBeFunctionDecl) { State.Stack.back().NestedBlockIndent = State.FirstIndent; } unsigned NestedBlockIndent = State.Stack.back().NestedBlockIndent; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 0d0fbdb84e327..6c67c4253254d 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -22537,10 +22537,12 @@ TEST_F(FormatTest, FormatsLambdas) { " }\n" "}", Style); - verifyFormat("std::sort(v.begin(), v.end(),\n" - " [](const auto &foo, const auto &bar) {\n" - " return foo.baz < bar.baz;\n" - "});", + verifyFormat("void test() {\n" + " std::sort(v.begin(), v.end(),\n" + " [](const auto &foo, const auto &bar) {\n" + " return foo.baz < bar.baz;\n" + " });\n" + "};", Style); verifyFormat("void test() {\n" " (\n" @@ -22566,6 +22568,12 @@ TEST_F(FormatTest, FormatsLambdas) { " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" " }", Style); + verifyFormat("#define SORT(v) \\\n" + " std::sort(v.begin(), v.end(), \\\n" + " [](const auto &foo, const auto &bar) { \\\n" + " return foo.baz < bar.baz; \\\n" + " });", + Style); verifyFormat("void foo() {\n" " aFunction(1, b(c(foo, bar, baz, [](d) {\n" " auto f = e(d);\n" @@ -22589,9 +22597,40 @@ TEST_F(FormatTest, FormatsLambdas) { verifyFormat("Namespace::Foo::Foo(LongClassName bar,\n" " AnotherLongClassName baz)\n" " : baz{baz}, func{[&] {\n" - " auto qux = bar;\n" - " return aFunkyFunctionCall(qux);\n" - "}} {}", + " auto qux = bar;\n" + " return aFunkyFunctionCall(qux);\n" + " }} {}", + Style); + verifyFormat("void foo() {\n" + " class Foo {\n" + " public:\n" + " Foo()\n" + " : qux{[](int quux) {\n" + " auto tmp = quux;\n" + " return tmp;\n" + " }} {}\n" + "\n" + " private:\n" + " std::function qux;\n" + " };\n" + "}", + Style); + Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; + verifyFormat("Namespace::Foo::Foo(LongClassName bar,\n" + " AnotherLongClassName baz) :\n" + " baz{baz}, func{[&] {\n" + " auto qux = bar;\n" + " return aFunkyFunctionCall(qux);\n" + " }} {}", + Style); + Style.PackConstructorInitializers = FormatStyle::PCIS_Never; + verifyFormat("Namespace::Foo::Foo(LongClassName bar,\n" + " AnotherLongClassName baz) :\n" + " baz{baz},\n" + " func{[&] {\n" + " auto qux = bar;\n" + " return aFunkyFunctionCall(qux);\n" + " }} {}", Style); Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; // FIXME: The following test should pass, but fails at the time of writing.