https://github.com/owenca created https://github.com/llvm/llvm-project/pull/145468
Fixes #145388 >From 349d309467c1251a9206f665886bde06b96ced32 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Mon, 23 Jun 2025 23:32:31 -0700 Subject: [PATCH] [clang-format] Improve QualifierAlignment in guessing macros Fixes #145388 --- clang/lib/Format/QualifierAlignmentFixer.cpp | 25 +++++++++++++------ clang/unittests/Format/QualifierFixerTest.cpp | 7 ++++-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp b/clang/lib/Format/QualifierAlignmentFixer.cpp index 8e55d339b2388..b0dda65adfba1 100644 --- a/clang/lib/Format/QualifierAlignmentFixer.cpp +++ b/clang/lib/Format/QualifierAlignmentFixer.cpp @@ -635,15 +635,26 @@ bool isConfiguredQualifierOrType(const FormatToken *Tok, // If a token is an identifier and it's upper case, it could // be a macro and hence we need to be able to ignore it. bool isPossibleMacro(const FormatToken *Tok) { - if (!Tok) - return false; + assert(Tok); if (Tok->isNot(tok::identifier)) return false; - if (Tok->TokenText.upper() == Tok->TokenText.str()) { - // T,K,U,V likely could be template arguments - return Tok->TokenText.size() != 1; - } - return false; + + const auto Text = Tok->TokenText; + assert(Text.size() > 0); + + // T,K,U,V likely could be template arguments + if (Text.size() == 1) + return false; + + // It's unlikely that qualified names are object-like macros. + const auto *Prev = Tok->getPreviousNonComment(); + if (Prev && Prev->is(tok::coloncolon)) + return false; + const auto *Next = Tok->getNextNonComment(); + if (Next && Next->is(tok::coloncolon)) + return false; + + return Text == Text.upper(); } } // namespace format diff --git a/clang/unittests/Format/QualifierFixerTest.cpp b/clang/unittests/Format/QualifierFixerTest.cpp index 3eae39f267c3e..f42f2e307f713 100644 --- a/clang/unittests/Format/QualifierFixerTest.cpp +++ b/clang/unittests/Format/QualifierFixerTest.cpp @@ -1122,14 +1122,17 @@ TEST_F(QualifierFixerTest, IsQualifierType) { } TEST_F(QualifierFixerTest, IsMacro) { - auto Tokens = annotate("INT INTPR Foo int"); ASSERT_EQ(Tokens.size(), 5u) << Tokens; - EXPECT_TRUE(isPossibleMacro(Tokens[0])); EXPECT_TRUE(isPossibleMacro(Tokens[1])); EXPECT_FALSE(isPossibleMacro(Tokens[2])); EXPECT_FALSE(isPossibleMacro(Tokens[3])); + + Tokens = annotate("FOO::BAR"); + ASSERT_EQ(Tokens.size(), 4u) << Tokens; + EXPECT_FALSE(isPossibleMacro(Tokens[0])); + EXPECT_FALSE(isPossibleMacro(Tokens[2])); } TEST_F(QualifierFixerTest, OverlappingQualifier) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits