From e34ba1898e11a709803ff85917f129de4ecca8e5 Mon Sep 17 00:00:00 2001 From: Owen Pan Date: Tue, 29 Apr 2025 19:24:39 -0700 Subject: [PATCH] [clang-format] Correctly annotate user-defined conversion function call Fix #137770 --- clang/lib/Format/TokenAnnotator.cpp | 13 +++++++++---- clang/unittests/Format/TokenAnnotatorTest.cpp | 10 ++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index e56cc92987af7..ea0086fd49a33 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -1656,11 +1656,15 @@ class AnnotatingParser { // Skip to l_paren. for (LParen = CurrentToken->Next; LParen && LParen->isNot(tok::l_paren); LParen = LParen->Next) { + if (LParen->isPointerOrReference()) + LParen->setFinalizedType(TT_PointerOrReference); } } if (LParen && LParen->is(tok::l_paren)) { - Tok->setFinalizedType(TT_FunctionDeclarationName); - LParen->setFinalizedType(TT_FunctionDeclarationLParen); + if (!Contexts.back().IsExpression) { + Tok->setFinalizedType(TT_FunctionDeclarationName); + LParen->setFinalizedType(TT_FunctionDeclarationLParen); + } break; } } @@ -1683,7 +1687,8 @@ class AnnotatingParser { if (CurrentToken->is(tok::comma) && Previous->isNot(tok::kw_operator)) break; if (Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator, tok::comma, - tok::star, tok::arrow, tok::amp, tok::ampamp) || + tok::arrow) || + Previous->isPointerOrReference() || // User defined literal. Previous->TokenText.starts_with("\"\"")) { Previous->setType(TT_OverloadedOperator); @@ -3026,7 +3031,7 @@ class AnnotatingParser { if (!NextToken || NextToken->isOneOf(tok::arrow, tok::equal, tok::comma, tok::r_paren, - TT_RequiresClause, TT_FunctionDeclarationLParen) || + TT_RequiresClause) || (NextToken->is(tok::kw_noexcept) && !IsExpression) || NextToken->canBePointerOrReferenceQualifier() || (NextToken->is(tok::l_brace) && !NextToken->getNextNonComment())) { diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 844f51f9e7c2e..124fb43dcf5ac 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -392,9 +392,15 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) { Tokens = annotate("return s.operator int *();"); ASSERT_EQ(Tokens.size(), 10u) << Tokens; - EXPECT_TOKEN(Tokens[3], tok::kw_operator, TT_FunctionDeclarationName); + // Not TT_FunctionDeclarationName. + EXPECT_TOKEN(Tokens[3], tok::kw_operator, TT_Unknown); EXPECT_TOKEN(Tokens[5], tok::star, TT_PointerOrReference); - EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionDeclarationLParen); + // Not TT_FunctionDeclarationLParen. + EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_Unknown); + + Tokens = annotate("B &b = x.operator B &();"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[8], tok::amp, TT_PointerOrReference); Tokens = annotate("int8_t *a = MacroCall(int8_t, width * height * length);"); ASSERT_EQ(Tokens.size(), 16u) << Tokens;