Skip to content

Commit f74413d

Browse files
committed
[clang-format] Fix invalid code generation with comments in lambda
Fixes llvm#51234 and llvm#54496 Differential Revision: https://reviews.llvm.org/D122301
1 parent f319c24 commit f74413d

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2762,12 +2762,16 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) {
27622762
Current->SpacesRequiredBefore = 1;
27632763
}
27642764

2765-
Current->MustBreakBefore =
2766-
Current->MustBreakBefore || mustBreakBefore(Line, *Current);
2767-
2768-
if (!Current->MustBreakBefore && InFunctionDecl &&
2769-
Current->is(TT_FunctionDeclarationName))
2770-
Current->MustBreakBefore = mustBreakForReturnType(Line);
2765+
const auto &Children = Prev->Children;
2766+
if (!Children.empty() && Children.back()->Last->is(TT_LineComment)) {
2767+
Current->MustBreakBefore = true;
2768+
} else {
2769+
Current->MustBreakBefore =
2770+
Current->MustBreakBefore || mustBreakBefore(Line, *Current);
2771+
if (!Current->MustBreakBefore && InFunctionDecl &&
2772+
Current->is(TT_FunctionDeclarationName))
2773+
Current->MustBreakBefore = mustBreakForReturnType(Line);
2774+
}
27712775

27722776
Current->CanBreakBefore =
27732777
Current->MustBreakBefore || canBreakBefore(Line, *Current);

clang/unittests/Format/FormatTest.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21934,6 +21934,30 @@ TEST_F(FormatTest, LambdaWithLineComments) {
2193421934
"auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
2193521935
"{ return; }",
2193621936
LLVMWithBeforeLambdaBody);
21937+
21938+
LLVMWithBeforeLambdaBody.ColumnLimit = 0;
21939+
21940+
verifyFormat("foo([]()\n"
21941+
" {\n"
21942+
" bar(); //\n"
21943+
" return 1; // comment\n"
21944+
" }());",
21945+
"foo([]() {\n"
21946+
" bar(); //\n"
21947+
" return 1; // comment\n"
21948+
"}());",
21949+
LLVMWithBeforeLambdaBody);
21950+
verifyFormat("foo(\n"
21951+
" 1, MACRO {\n"
21952+
" baz();\n"
21953+
" bar(); // comment\n"
21954+
" },\n"
21955+
" []() {});",
21956+
"foo(\n"
21957+
" 1, MACRO { baz(); bar(); // comment\n"
21958+
" }, []() {}\n"
21959+
");",
21960+
LLVMWithBeforeLambdaBody);
2193721961
}
2193821962

2193921963
TEST_F(FormatTest, EmptyLinesInLambdas) {

0 commit comments

Comments
 (0)