[clang-format] Fix a regression of annotating PointerOrReference (#149039)

Fixes #149010

(cherry picked from commit a8f5e9ed6b44562938ce07e2790be90be8f0a6b5)
This commit is contained in:
Owen Pan 2025-07-17 21:43:43 -07:00 committed by Tobias Hieta
parent e36a7daae2
commit 607677c861
2 changed files with 11 additions and 3 deletions

View File

@ -2996,14 +2996,18 @@ private:
const FormatToken *PrevToken = Tok.getPreviousNonComment();
if (!PrevToken)
return TT_UnaryOperator;
if (PrevToken->is(TT_TypeName))
if (PrevToken->isTypeName(LangOpts))
return TT_PointerOrReference;
if (PrevToken->isPlacementOperator() && Tok.is(tok::ampamp))
return TT_BinaryOperator;
const FormatToken *NextToken = Tok.getNextNonComment();
auto *NextToken = Tok.getNextNonComment();
if (!NextToken)
return TT_PointerOrReference;
if (NextToken->is(tok::greater)) {
NextToken->setFinalizedType(TT_TemplateCloser);
return TT_PointerOrReference;
}
if (InTemplateArgument && NextToken->is(tok::kw_noexcept))
return TT_BinaryOperator;
@ -3112,7 +3116,7 @@ private:
// It's more likely that & represents operator& than an uninitialized
// reference.
if (Tok.is(tok::amp) && PrevToken && PrevToken->Tok.isAnyIdentifier() &&
if (Tok.is(tok::amp) && PrevToken->Tok.isAnyIdentifier() &&
IsChainedOperatorAmpOrMember(PrevToken->getPreviousNonComment()) &&
NextToken && NextToken->Tok.isAnyIdentifier()) {
if (auto NextNext = NextToken->getNextNonComment();

View File

@ -390,6 +390,10 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_CompoundRequirementLBrace);
EXPECT_TOKEN(Tokens[22], tok::star, TT_BinaryOperator);
Tokens = annotate("bool foo = requires { static_cast<Foo &&>(1); };");
ASSERT_EQ(Tokens.size(), 17u) << Tokens;
EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_PointerOrReference);
Tokens = annotate("return s.operator int *();");
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
// Not TT_FunctionDeclarationName.