Author: Owen Pan Date: 2024-09-07T16:56:28-07:00 New Revision: bcd586b5abfc7c22a1c0eca3a7abf18e7a09518d
URL: https://github.com/llvm/llvm-project/commit/bcd586b5abfc7c22a1c0eca3a7abf18e7a09518d DIFF: https://github.com/llvm/llvm-project/commit/bcd586b5abfc7c22a1c0eca3a7abf18e7a09518d.diff LOG: [clang-format] Fix a bug in annotating CastRParen (#107675) Fixes #107568. Added: Modified: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 6a1cf61659fd97..dfa703aed0d34d 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2874,21 +2874,26 @@ class AnnotatingParser { if (Line.InPPDirective && AfterRParen->is(tok::minus)) return false; + const auto *Prev = BeforeRParen; + + // Look for a function pointer type, e.g. `(*)()`. + if (Prev->is(tok::r_paren)) { + if (Prev->is(TT_CastRParen)) + return false; + Prev = Prev->MatchingParen; + if (!Prev) + return false; + Prev = Prev->Previous; + if (!Prev || Prev->isNot(tok::r_paren)) + return false; + Prev = Prev->MatchingParen; + return Prev && Prev->is(TT_FunctionTypeLParen); + } + // Search for unexpected tokens. - for (auto *Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous) { - if (Prev->is(tok::r_paren)) { - if (Prev->is(TT_CastRParen)) - return false; - Prev = Prev->MatchingParen; - if (!Prev) - return false; - if (Prev->is(TT_FunctionTypeLParen)) - break; - continue; - } + for (Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous) if (!Prev->isOneOf(tok::kw_const, tok::identifier, tok::coloncolon)) return false; - } return true; } diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 1bb796fd6f5ee9..36a6db9283893e 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -775,6 +775,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsCasts) { EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown); EXPECT_TOKEN(Tokens[9], tok::minus, TT_BinaryOperator); + Tokens = annotate("return (double)(foo(30)) - 15;"); + ASSERT_EQ(Tokens.size(), 14u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen); + EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_Unknown); + EXPECT_TOKEN(Tokens[10], tok::minus, TT_BinaryOperator); + auto Style = getLLVMStyle(); Style.TypeNames.push_back("Foo"); Tokens = annotate("#define FOO(bar) foo((Foo)&bar)", Style); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits