diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index db66911f00f63b..06c34bd45eb313 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2625,8 +2625,10 @@ class AnnotatingParser { return false; // int a or auto a. - if (PreviousNotConst->isOneOf(tok::identifier, tok::kw_auto)) + if (PreviousNotConst->isOneOf(tok::identifier, tok::kw_auto) && + PreviousNotConst->isNot(TT_StatementAttributeLikeMacro)) { return true; + } // *a or &a or &&a. if (PreviousNotConst->is(TT_PointerOrReference)) diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index f70424c3ee060a..e7bc15d7e1dfa5 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -2125,6 +2125,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsTrailingReturnArrow) { ASSERT_EQ(Tokens.size(), 21u) << Tokens; EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown); + auto Style = getLLVMStyle(); + Style.StatementAttributeLikeMacros.push_back("emit"); + Tokens = annotate("emit foo()->bar;", Style); + ASSERT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[0], tok::identifier, TT_StatementAttributeLikeMacro); + EXPECT_TOKEN(Tokens[4], tok::arrow, TT_Unknown); + // Mixed Tokens = annotate("auto f() -> int { auto a = b()->c; }"); ASSERT_EQ(Tokens.size(), 18u) << Tokens; @@ -2950,6 +2957,13 @@ TEST_F(TokenAnnotatorTest, StartOfName) { ASSERT_EQ(Tokens.size(), 7u) << Tokens; EXPECT_TOKEN(Tokens[0], tok::at, TT_ObjCDecl); EXPECT_TOKEN(Tokens[2], tok::identifier, TT_StartOfName); + + auto Style = getLLVMStyle(); + Style.StatementAttributeLikeMacros.push_back("emit"); + Tokens = annotate("emit foo = 0;", Style); + ASSERT_EQ(Tokens.size(), 6u) << Tokens; + EXPECT_TOKEN(Tokens[0], tok::identifier, TT_StatementAttributeLikeMacro); + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown); } TEST_F(TokenAnnotatorTest, BraceKind) {