Skip to content

Commit ccae7b4

Browse files
gedareowenca
andauthored
[clang-format] Improve BlockIndent at ColumnLimit (#93140)
Fixes #55731 The reported formatting problems were related to ignoring deep nesting of "simple" functions (causing #54808) and to allowing the trailing annotation to become separated from the closing parens, which allowed a break to occur between the closing parens and the trailing annotation. The fix for the nesting of "simple" functions is to detect them more carefully. "Simple" was defined in a comment as being a single non-expression argument. I tried to stay as close to the original intent of the implementation while fixing the various bad formatting reports. In the process of fixing these bugs, some latent bugs were discovered related to how JavaScript Template Strings are handled. Those are also fixed here. --------- Co-authored-by: Owen Pan <[email protected]>
1 parent 7e7a906 commit ccae7b4

File tree

5 files changed

+101
-3
lines changed

5 files changed

+101
-3
lines changed

clang/lib/Format/ContinuationIndenter.cpp

+35-3
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,37 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
803803
return !Tok.Previous->isOneOf(TT_CastRParen, tok::kw_for, tok::kw_while,
804804
tok::kw_switch);
805805
};
806+
auto IsFunctionCallParen = [](const FormatToken &Tok) {
807+
return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&
808+
Tok.Previous->is(tok::identifier);
809+
};
810+
const auto IsInTemplateString = [this](const FormatToken &Tok) {
811+
if (!Style.isJavaScript())
812+
return false;
813+
for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) {
814+
if (Prev->is(TT_TemplateString) && Prev->opensScope())
815+
return true;
816+
if (Prev->is(TT_TemplateString) && Prev->closesScope())
817+
break;
818+
}
819+
return false;
820+
};
821+
// Identifies simple (no expression) one-argument function calls.
822+
const auto IsSimpleFunction = [&](const FormatToken &Tok) {
823+
if (!Tok.FakeLParens.empty() && Tok.FakeLParens.back() > prec::Unknown)
824+
return false;
825+
const auto *Previous = Tok.Previous;
826+
if (!Previous || (!Previous->isOneOf(TT_FunctionDeclarationLParen,
827+
TT_LambdaDefinitionLParen) &&
828+
!IsFunctionCallParen(*Previous))) {
829+
return true;
830+
}
831+
if (IsOpeningBracket(Tok) || IsInTemplateString(Tok))
832+
return true;
833+
const auto *Next = Tok.Next;
834+
return !Next || Next->isMemberAccess() ||
835+
Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next);
836+
};
806837
if ((Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak ||
807838
Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) &&
808839
IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) &&
@@ -813,10 +844,10 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
813844
// caaaaaaaaaaaall(
814845
// caaaaaaaaaaaall(
815846
// caaaaaaaaaaaaaaaaaaaaaaall(aaaaaaaaaaaaaa, aaaaaaaaa))));
816-
Current.FakeLParens.size() > 0 &&
817-
Current.FakeLParens.back() > prec::Unknown) {
847+
!IsSimpleFunction(Current)) {
818848
CurrentState.NoLineBreak = true;
819849
}
850+
820851
if (Previous.is(TT_TemplateString) && Previous.opensScope())
821852
CurrentState.NoLineBreak = true;
822853

@@ -831,7 +862,8 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
831862
Previous.isNot(TT_TableGenDAGArgOpenerToBreak) &&
832863
!(Current.MacroParent && Previous.MacroParent) &&
833864
(Current.isNot(TT_LineComment) ||
834-
Previous.isOneOf(BK_BracedInit, TT_VerilogMultiLineListLParen))) {
865+
Previous.isOneOf(BK_BracedInit, TT_VerilogMultiLineListLParen)) &&
866+
!IsInTemplateString(Current)) {
835867
CurrentState.Indent = State.Column + Spaces;
836868
CurrentState.IsAligned = true;
837869
}

clang/lib/Format/FormatToken.h

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ namespace format {
102102
TYPE(JsTypeColon) \
103103
TYPE(JsTypeOperator) \
104104
TYPE(JsTypeOptionalQuestion) \
105+
TYPE(LambdaDefinitionLParen) \
105106
TYPE(LambdaLBrace) \
106107
TYPE(LambdaLSquare) \
107108
TYPE(LeadingJavaAnnotation) \

clang/lib/Format/TokenAnnotator.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static bool canBeObjCSelectorComponent(const FormatToken &Tok) {
6262

6363
/// With `Left` being '(', check if we're at either `[...](` or
6464
/// `[...]<...>(`, where the [ opens a lambda capture list.
65+
// FIXME: this doesn't cover attributes/constraints before the l_paren.
6566
static bool isLambdaParameterList(const FormatToken *Left) {
6667
// Skip <...> if present.
6768
if (Left->Previous && Left->Previous->is(tok::greater) &&
@@ -365,6 +366,7 @@ class AnnotatingParser {
365366
Contexts.back().IsExpression = false;
366367
} else if (isLambdaParameterList(&OpeningParen)) {
367368
// This is a parameter list of a lambda expression.
369+
OpeningParen.setType(TT_LambdaDefinitionLParen);
368370
Contexts.back().IsExpression = false;
369371
} else if (OpeningParen.is(TT_RequiresExpressionLParen)) {
370372
Contexts.back().IsExpression = false;
@@ -6196,6 +6198,12 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
61966198
return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf()));
61976199
}
61986200

6201+
if (Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) &&
6202+
Right.is(TT_TrailingAnnotation) &&
6203+
Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) {
6204+
return false;
6205+
}
6206+
61996207
// Allow breaking after a trailing annotation, e.g. after a method
62006208
// declaration.
62016209
if (Left.is(TT_TrailingAnnotation)) {

clang/unittests/Format/FormatTest.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -9338,6 +9338,31 @@ TEST_F(FormatTest, AlignsAfterOpenBracket) {
93389338
" aaaaaaaaaaaaaaaa\n"
93399339
");",
93409340
Style);
9341+
verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9342+
" const bool &aaaaaaaaa, const void *aaaaaaaaaa\n"
9343+
") const {\n"
9344+
" return true;\n"
9345+
"}",
9346+
Style);
9347+
verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaa(\n"
9348+
" const bool &aaaaaaaaaa, const void *aaaaaaaaaa\n"
9349+
") const;",
9350+
Style);
9351+
verifyFormat("void aaaaaaaaa(\n"
9352+
" int aaaaaa, int bbbbbb, int cccccc, int dddddddddd\n"
9353+
") const noexcept -> std::vector<of_very_long_type>;",
9354+
Style);
9355+
verifyFormat(
9356+
"x = aaaaaaaaaaaaaaa(\n"
9357+
" \"a aaaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa aaaaaaaaaaaaa\"\n"
9358+
");",
9359+
Style);
9360+
Style.ColumnLimit = 60;
9361+
verifyFormat("auto lambda =\n"
9362+
" [&b](\n"
9363+
" auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9364+
" ) {};",
9365+
Style);
93419366
}
93429367

93439368
TEST_F(FormatTest, ParenthesesAndOperandAlignment) {

clang/unittests/Format/TokenAnnotatorTest.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -1645,38 +1645,45 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
16451645
auto Tokens = annotate("[]() constexpr {}");
16461646
ASSERT_EQ(Tokens.size(), 8u) << Tokens;
16471647
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1648+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16481649
EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
16491650

16501651
Tokens = annotate("[]() consteval {}");
16511652
ASSERT_EQ(Tokens.size(), 8u) << Tokens;
16521653
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1654+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16531655
EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
16541656

16551657
Tokens = annotate("[]() mutable {}");
16561658
ASSERT_EQ(Tokens.size(), 8u) << Tokens;
16571659
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1660+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16581661
EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
16591662

16601663
Tokens = annotate("[]() static {}");
16611664
ASSERT_EQ(Tokens.size(), 8u) << Tokens;
16621665
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1666+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16631667
EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
16641668

16651669
Tokens = annotate("[]() -> auto {}");
16661670
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
16671671
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1672+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16681673
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
16691674
EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
16701675

16711676
Tokens = annotate("[]() -> auto & {}");
16721677
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
16731678
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1679+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16741680
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
16751681
EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
16761682

16771683
Tokens = annotate("[]() -> auto * {}");
16781684
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
16791685
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1686+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
16801687
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
16811688
EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
16821689

@@ -1705,13 +1712,15 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17051712
Tokens = annotate("foo([&](u32 bar) __attribute__((attr)) -> void {});");
17061713
ASSERT_EQ(Tokens.size(), 22u) << Tokens;
17071714
EXPECT_TOKEN(Tokens[2], tok::l_square, TT_LambdaLSquare);
1715+
EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);
17081716
EXPECT_TOKEN(Tokens[15], tok::arrow, TT_TrailingReturnArrow);
17091717
EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
17101718

17111719
Tokens = annotate("[] <typename T> () {}");
17121720
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
17131721
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17141722
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1723+
EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);
17151724
EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_LambdaLBrace);
17161725

17171726
Tokens = annotate("[] <typename T> {}");
@@ -1724,6 +1733,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17241733
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
17251734
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17261735
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1736+
EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_LambdaDefinitionLParen);
17271737
EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
17281738

17291739
Tokens = annotate("[] <typename... T> {}");
@@ -1736,6 +1746,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17361746
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
17371747
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17381748
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1749+
EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_LambdaDefinitionLParen);
17391750
EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
17401751

17411752
Tokens = annotate("[] <int... T> {}");
@@ -1748,6 +1759,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17481759
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
17491760
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17501761
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1762+
EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_LambdaDefinitionLParen);
17511763
EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
17521764

17531765
Tokens = annotate("[] <Foo... T> {}");
@@ -1761,6 +1773,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17611773
ASSERT_EQ(Tokens.size(), 18u) << Tokens;
17621774
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17631775
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1776+
EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);
17641777
EXPECT_TOKEN(Tokens[10], tok::kw_requires, TT_RequiresClause);
17651778
EXPECT_TRUE(Tokens[14]->ClosesRequiresClause);
17661779
EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);
@@ -1769,6 +1782,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17691782
ASSERT_EQ(Tokens.size(), 19u) << Tokens;
17701783
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17711784
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1785+
EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);
17721786
EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_PointerOrReference);
17731787
EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
17741788
EXPECT_TRUE(Tokens[15]->ClosesRequiresClause);
@@ -1778,6 +1792,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17781792
ASSERT_EQ(Tokens.size(), 23u) << Tokens;
17791793
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17801794
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1795+
EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);
17811796
EXPECT_TOKEN(Tokens[10], tok::kw_requires, TT_RequiresClause);
17821797
EXPECT_TRUE(Tokens[19]->ClosesRequiresClause);
17831798
EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
@@ -1786,6 +1801,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17861801
ASSERT_EQ(Tokens.size(), 20u) << Tokens;
17871802
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17881803
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1804+
EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);
17891805
EXPECT_TOKEN(Tokens[10], tok::arrow, TT_TrailingReturnArrow);
17901806
EXPECT_TOKEN(Tokens[12], tok::kw_requires, TT_RequiresClause);
17911807
EXPECT_TRUE(Tokens[16]->ClosesRequiresClause);
@@ -1797,6 +1813,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17971813
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
17981814
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
17991815
EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1816+
// FIXME:
1817+
// EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_LambdaDefinitionLParen);
18001818
EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);
18011819

18021820
Tokens = annotate("[] <typename T> requires Bar<T> (T &&t) {}");
@@ -1805,6 +1823,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18051823
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18061824
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
18071825
EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1826+
// FIXME:
1827+
// EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_LambdaDefinitionLParen);
18081828
EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_PointerOrReference);
18091829
EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_LambdaLBrace);
18101830

@@ -1814,6 +1834,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18141834
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18151835
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
18161836
EXPECT_TRUE(Tokens[15]->ClosesRequiresClause);
1837+
// FIXME:
1838+
// EXPECT_TOKEN(Tokens[16], tok::l_paren, TT_LambdaDefinitionLParen);
18171839
EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
18181840

18191841
Tokens = annotate("[] <typename T> requires true (T&& t) {}");
@@ -1822,6 +1844,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18221844
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18231845
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
18241846
EXPECT_TRUE(Tokens[7]->ClosesRequiresClause);
1847+
// FIXME:
1848+
// EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);
18251849
EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
18261850
EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);
18271851

@@ -1856,6 +1880,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18561880
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18571881
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
18581882
EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1883+
// FIXME:
1884+
// EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_LambdaDefinitionLParen);
18591885
EXPECT_TOKEN(Tokens[15], tok::kw_requires, TT_RequiresClause);
18601886
EXPECT_TRUE(Tokens[19]->ClosesRequiresClause);
18611887
EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
@@ -1865,20 +1891,23 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18651891
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
18661892
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18671893
EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
1894+
EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);
18681895
EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);
18691896

18701897
Tokens = annotate("[] <int I = 0> (T t) {}");
18711898
ASSERT_EQ(Tokens.size(), 15u) << Tokens;
18721899
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
18731900
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18741901
EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
1902+
EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);
18751903
EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);
18761904

18771905
Tokens = annotate("[] <bool b = false> (T t) {}");
18781906
ASSERT_EQ(Tokens.size(), 15u) << Tokens;
18791907
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
18801908
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18811909
EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
1910+
EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);
18821911
EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);
18831912

18841913
Tokens = annotate("[] <bool b = true && false> (T&& t) {}");
@@ -1887,6 +1916,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18871916
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18881917
EXPECT_TOKEN(Tokens[7], tok::ampamp, TT_BinaryOperator);
18891918
EXPECT_TOKEN(Tokens[9], tok::greater, TT_TemplateCloser);
1919+
EXPECT_TOKEN(Tokens[10], tok::l_paren, TT_LambdaDefinitionLParen);
18901920
EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_PointerOrReference);
18911921
EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);
18921922

@@ -1896,6 +1926,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18961926
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18971927
EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
18981928
EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause);
1929+
// FIXME:
1930+
// EXPECT_TOKEN(Tokens[13], tok::l_paren, TT_LambdaDefinitionLParen);
18991931
EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
19001932
}
19011933

0 commit comments

Comments
 (0)