Skip to content

Commit b1b60d4

Browse files
authored
[clang-format] Fix a bug in annotating arrows after init braces (#119958)
Fixes #59066.
1 parent f03bf8c commit b1b60d4

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2404,7 +2404,8 @@ class AnnotatingParser {
24042404
// not auto operator->() -> xxx;
24052405
Current.setType(TT_TrailingReturnArrow);
24062406
} else if (Current.is(tok::arrow) && Current.Previous &&
2407-
Current.Previous->is(tok::r_brace)) {
2407+
Current.Previous->is(tok::r_brace) &&
2408+
Current.Previous->is(BK_Block)) {
24082409
// Concept implicit conversion constraint needs to be treated like
24092410
// a trailing return type ... } -> <type>.
24102411
Current.setType(TT_TrailingReturnArrow);

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,9 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
570570
NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in,
571571
Keywords.kw_as));
572572
ProbablyBracedList =
573-
ProbablyBracedList || (IsCpp && (PrevTok->Tok.isLiteral() ||
574-
NextTok->is(tok::l_paren)));
573+
ProbablyBracedList ||
574+
(IsCpp && (PrevTok->Tok.isLiteral() ||
575+
NextTok->isOneOf(tok::l_paren, tok::arrow)));
575576

576577
// If there is a comma, semicolon or right paren after the closing
577578
// brace, we assume this is a braced initializer list.

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,6 +2277,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsTrailingReturnArrow) {
22772277
ASSERT_EQ(Tokens.size(), 21u) << Tokens;
22782278
EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown);
22792279

2280+
Tokens = annotate("Class<Type>{foo}->func(arg);");
2281+
ASSERT_EQ(Tokens.size(), 14u) << Tokens;
2282+
EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_Unknown); // Not FunctionLBrace
2283+
EXPECT_BRACE_KIND(Tokens[4], BK_BracedInit);
2284+
EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);
2285+
EXPECT_TOKEN(Tokens[7], tok::arrow, TT_Unknown);
2286+
22802287
auto Style = getLLVMStyle();
22812288
Style.StatementAttributeLikeMacros.push_back("emit");
22822289
Tokens = annotate("emit foo()->bar;", Style);

0 commit comments

Comments
 (0)