================
@@ -366,8 +366,14 @@ bool ContinuationIndenter::mustBreak(const LineState 
&State) {
   const auto &CurrentState = State.Stack.back();
   if (Style.BraceWrapping.BeforeLambdaBody && Current.CanBreakBefore &&
       Current.is(TT_LambdaLBrace) && Previous.isNot(TT_LineComment)) {
-    auto LambdaBodyLength = getLengthToMatchingParen(Current, State.Stack);
-    return LambdaBodyLength > getColumnLimit(State);
+    if (Current.MatchingParen->MustBreakBefore)
----------------
jamesg-nz wrote:

@HazardyKnusperkeks - sorry late response. After looking into it, I don't 
believe there's an issue.

The code I was talking about above: 
https://github.com/llvm/llvm-project/blob/0e01c72c5645259d9a08a1a7ed39cb5cc41ce311/clang/lib/Format/TokenAnnotator.cpp#L5297-L5299

Results in `MustBreakBefore` being set for the token (the left lambda brace), 
which therefore results in `CanBreakBefore` being set. The code exists as 
there's conditions (e.g. 
[`Left.is(TT_PointerOrReference)`](https://github.com/llvm/llvm-project/blob/0e01c72c5645259d9a08a1a7ed39cb5cc41ce311/clang/lib/Format/TokenAnnotator.cpp#L5523-L5524))
 in `TokenAnnotator::canBreakBefore()` which return `false` for the left lambda 
brace in lambdas like these:

```c++
auto select = [this]() -> const Library::Object * { return 
MyAssignment::SelectFromList(this); };
auto select = [this]() -> const Library::Object & { return 
MyAssignment::SelectFromList(this); };
auto select = [this]() -> std::unique_ptr<Object> { return 
MyAssignment::SelectFromList(this); };"
```

It's the fact it sets `CanBreakBefore` that matters so it enters the lambda 
section in `ContinuationIndenter::mustBreak()`.

Just checking `Current.MatchingParen->MustBreakBefore` inside is sufficient as 
TokenAnnotator::mustBreakBefore() returns `true` when it is called for the 
right lambda:
https://github.com/llvm/llvm-project/blob/0e01c72c5645259d9a08a1a7ed39cb5cc41ce311/clang/lib/Format/TokenAnnotator.cpp#L5283-L5293

Thus there is no need to look at `Current.MustBreakBefore`. However the generic 
condition that checks `Current.MustBreakBefore` for all tokens is in the 
condition for the next `if()` statement down, so could move the lambda `if()` 
statement down beneath that. But there's no need to do this at the moment.

So this PR looks OK as-is with respect to this.

https://github.com/llvm/llvm-project/pull/76673
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to