https://github.com/owenca created https://github.com/llvm/llvm-project/pull/124891
Fixes #124574. >From 04fd96533a48b0f6fdbacb6c9947740bf4c58992 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Tue, 28 Jan 2025 23:16:10 -0800 Subject: [PATCH] [clang-format] Add ClassHeadName to help annotating StartOfName Fixes #124574. --- clang/lib/Format/FormatToken.h | 2 + clang/lib/Format/TokenAnnotator.cpp | 2 +- clang/lib/Format/UnwrappedLineParser.cpp | 15 +++-- clang/unittests/Format/TokenAnnotatorTest.cpp | 57 +++++++++++++++++++ 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index d97b6522f1fefa..29aba281ae1037 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -44,6 +44,8 @@ namespace format { TYPE(CaseLabelColon) \ TYPE(CastRParen) \ TYPE(ClassLBrace) \ + /* Name of class/struct/union/interface definition. */ \ + TYPE(ClassHeadName) \ TYPE(ClassRBrace) \ TYPE(CompoundRequirementLBrace) \ /* ternary ?: expression */ \ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index a172df5291ae62..328fb55e072262 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2580,7 +2580,7 @@ class AnnotatingParser { if (Style.isVerilog()) return false; - if (Tok.isNot(tok::identifier) || !Tok.Previous) + if (!Tok.Previous || Tok.isNot(tok::identifier) || Tok.is(TT_ClassHeadName)) return false; if (const auto *NextNonComment = Tok.getNextNonComment(); diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 906fc11a07d5ee..77d4afed9ba807 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -4029,7 +4029,7 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { const FormatToken &InitialToken = *FormatTok; nextToken(); - const FormatToken *ClassName = nullptr; + FormatToken *ClassName = nullptr; bool IsDerived = false; auto IsNonMacroIdentifier = [](const FormatToken *Tok) { return Tok->is(tok::identifier) && Tok->TokenText != Tok->TokenText.upper(); @@ -4059,7 +4059,7 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { } if (FormatTok->is(tok::l_square) && handleCppAttributes()) continue; - const auto *Previous = FormatTok; + auto *Previous = FormatTok; nextToken(); switch (FormatTok->Tok.getKind()) { case tok::l_paren: @@ -4074,9 +4074,12 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { case tok::hashhash: break; default: - if (!JSPastExtendsOrImplements && !ClassName && - Previous->is(tok::identifier) && Previous->isNot(TT_AttributeMacro) && - Previous->TokenText != Previous->TokenText.upper()) { + if (JSPastExtendsOrImplements || ClassName || + Previous->isNot(tok::identifier) || Previous->is(TT_AttributeMacro)) { + break; + } + if (const auto Text = Previous->TokenText; + Text.size() == 1 || Text != Text.upper()) { ClassName = Previous; } } @@ -4160,6 +4163,8 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { if (FormatTok->is(tok::l_brace)) { if (IsListInitialization()) return; + if (ClassName) + ClassName->setFinalizedType(TT_ClassHeadName); auto [OpenBraceType, ClosingBraceType] = GetBraceTypes(InitialToken); FormatTok->setFinalizedType(OpenBraceType); if (ParseAsExpr) { diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index fc77e277947c56..2d848ac79bddc3 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -479,11 +479,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) { TEST_F(TokenAnnotatorTest, UnderstandsClasses) { auto Tokens = annotate("class C {};"); ASSERT_EQ(Tokens.size(), 6u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace); EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_ClassRBrace); Tokens = annotate("const class C {} c;"); ASSERT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace); EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_ClassRBrace); @@ -494,6 +496,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsClasses) { Tokens = annotate("class [[deprecated(\"\")]] C { int i; };"); ASSERT_EQ(Tokens.size(), 17u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_ClassLBrace); EXPECT_TOKEN(Tokens[14], tok::r_brace, TT_ClassRBrace); } @@ -501,21 +504,25 @@ TEST_F(TokenAnnotatorTest, UnderstandsClasses) { TEST_F(TokenAnnotatorTest, UnderstandsStructs) { auto Tokens = annotate("struct S {};"); ASSERT_EQ(Tokens.size(), 6u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_StructRBrace); Tokens = annotate("struct macro(a) S {};"); ASSERT_EQ(Tokens.size(), 10u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[7], tok::r_brace, TT_StructRBrace); Tokens = annotate("struct EXPORT_MACRO [[nodiscard]] C { int i; };"); ASSERT_EQ(Tokens.size(), 15u) << Tokens; + EXPECT_TOKEN(Tokens[7], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_StructRBrace); Tokens = annotate("struct [[deprecated]] [[nodiscard]] C { int i; };"); ASSERT_EQ(Tokens.size(), 19u) << Tokens; + EXPECT_TOKEN(Tokens[11], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[16], tok::r_brace, TT_StructRBrace); @@ -523,12 +530,14 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) { " void f(T &t);\n" "};"); ASSERT_EQ(Tokens.size(), 18u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference); EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_StructRBrace); Tokens = annotate("template <typename T> struct S<const T[N]> {};"); ASSERT_EQ(Tokens.size(), 18u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener); EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare); EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser); @@ -537,6 +546,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) { Tokens = annotate("template <typename T> struct S<T const[N]> {};"); ASSERT_EQ(Tokens.size(), 18u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener); EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare); EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser); @@ -547,6 +557,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) { " void f(T const (&a)[n]);\n" "};"); ASSERT_EQ(Tokens.size(), 35u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[10], tok::less, TT_TemplateOpener); EXPECT_TOKEN(Tokens[13], tok::l_square, TT_ArraySubscriptLSquare); EXPECT_TOKEN(Tokens[16], tok::greater, TT_TemplateCloser); @@ -558,12 +569,24 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) { Tokens = annotate("template <typename T, enum E e> struct S {};"); ASSERT_EQ(Tokens.size(), 15u) << Tokens; + EXPECT_TOKEN(Tokens[10], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_StructLBrace); + Tokens = annotate( + "template <> struct __declspec(foo) Op<Bar *> : OpImpl<Bar *> {};"); + ASSERT_EQ(Tokens.size(), 23u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_AttributeLParen); + EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_AttributeRParen); + EXPECT_TOKEN(Tokens[8], tok::identifier, TT_ClassHeadName); + EXPECT_TOKEN(Tokens[13], tok::colon, TT_InheritanceColon); + EXPECT_TOKEN(Tokens[19], tok::l_brace, TT_StructLBrace); + EXPECT_TOKEN(Tokens[20], tok::r_brace, TT_StructRBrace); + constexpr StringRef Code{"struct EXPORT StructName {};"}; Tokens = annotate(Code); ASSERT_EQ(Tokens.size(), 7u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_StructRBrace); @@ -572,6 +595,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) { Tokens = annotate(Code, Style); ASSERT_EQ(Tokens.size(), 7u) << Tokens; EXPECT_TOKEN(Tokens[1], tok::identifier, TT_AttributeMacro); + EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_StructLBrace); EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_StructRBrace); } @@ -579,11 +603,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) { TEST_F(TokenAnnotatorTest, UnderstandsUnions) { auto Tokens = annotate("union U {};"); ASSERT_EQ(Tokens.size(), 6u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace); EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_UnionRBrace); Tokens = annotate("union U { void f() { return; } };"); ASSERT_EQ(Tokens.size(), 14u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace); EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace); EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_UnionRBrace); @@ -716,8 +742,10 @@ TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) { EXPECT_TOKEN(Tokens[11], tok::less, TT_TemplateOpener); EXPECT_TOKEN(Tokens[14], tok::greater, TT_TemplateCloser); EXPECT_FALSE(Tokens[14]->ClosesTemplateDeclaration); + EXPECT_TOKEN(Tokens[16], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[21], tok::greater, TT_TemplateCloser); EXPECT_TRUE(Tokens[21]->ClosesTemplateDeclaration); + EXPECT_TOKEN(Tokens[23], tok::identifier, TT_ClassHeadName); } TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) { @@ -800,6 +828,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsCasts) { Tokens = annotate("return (struct foo){};"); ASSERT_EQ(Tokens.size(), 9u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen); Tokens = annotate("#define FOO(bar) foo((uint64_t)&bar)"); @@ -1146,6 +1175,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser); EXPECT_EQ(Tokens[31]->FakeRParens, 1u); EXPECT_TRUE(Tokens[31]->ClosesRequiresClause); + // FIXME: + // EXPECT_TOKEN(Tokens[33], tok::identifier, TT_Unknown); // Not ClassHeadName Tokens = annotate("template<typename T>\n" @@ -1163,6 +1194,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { EXPECT_EQ(Tokens[32]->FakeRParens, 1u); EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown); EXPECT_TRUE(Tokens[33]->ClosesRequiresClause); + EXPECT_TOKEN(Tokens[35], tok::identifier, TT_Unknown); Tokens = annotate("template <typename T>\n" "void foo(T) noexcept requires Bar<T>;"); @@ -1244,6 +1276,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { "return number_zero_v<T>; }\n" "};"); ASSERT_EQ(Tokens.size(), 44u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName); + EXPECT_TOKEN(Tokens[11], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause); EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace); @@ -1255,6 +1289,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { annotate("template <class A, class B> concept C =" "std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;"); ASSERT_EQ(Tokens.size(), 31u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown); + EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[8], tok::kw_concept, TT_Unknown); EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener); EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener); @@ -1871,6 +1907,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) { ASSERT_EQ(Tokens.size(), 12u) << Tokens; EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare); EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow); + EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace); Tokens = annotate("foo([&](u32 bar) __attribute__((attr)) -> void {});"); @@ -2751,6 +2788,7 @@ TEST_F(TokenAnnotatorTest, UnderstandTableGenTokens) { // Structured statements. Tokens = Annotate("class Foo {}"); + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName); EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_FunctionLBrace); Tokens = Annotate("def Def: Foo {}"); EXPECT_TOKEN(Tokens[2], tok::colon, TT_InheritanceColon); @@ -3216,6 +3254,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) { Tokens = annotate("class Foo<int> f() {}"); ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[5], tok::identifier, TT_FunctionDeclarationName); EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionDeclarationLParen); EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_FunctionLBrace); @@ -3224,6 +3263,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) { Tokens = annotate("template <typename T> class Foo<T> f() {}"); ASSERT_EQ(Tokens.size(), 16u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[10], tok::identifier, TT_FunctionDeclarationName); EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_FunctionDeclarationLParen); EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace); @@ -3334,36 +3374,45 @@ TEST_F(TokenAnnotatorTest, BraceKind) { Tokens = annotate("struct ::Foo {};"); ASSERT_EQ(Tokens.size(), 7u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[3], BK_Block); EXPECT_BRACE_KIND(Tokens[4], BK_Block); Tokens = annotate("struct NS::Foo {};"); ASSERT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown); + EXPECT_TOKEN(Tokens[3], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[4], BK_Block); EXPECT_BRACE_KIND(Tokens[5], BK_Block); Tokens = annotate("struct Foo<int> {};"); ASSERT_EQ(Tokens.size(), 9u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[5], BK_Block); EXPECT_BRACE_KIND(Tokens[6], BK_Block); Tokens = annotate("struct Foo<int>::Bar {};"); ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown); + EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[7], BK_Block); EXPECT_BRACE_KIND(Tokens[8], BK_Block); Tokens = annotate("struct Foo<int> : Base {};"); ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[7], BK_Block); EXPECT_BRACE_KIND(Tokens[8], BK_Block); Tokens = annotate("struct Foo final {};"); ASSERT_EQ(Tokens.size(), 7u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[3], BK_Block); EXPECT_BRACE_KIND(Tokens[4], BK_Block); Tokens = annotate("struct [[foo]] [[bar]] Foo final : Base1, Base2 {};"); ASSERT_EQ(Tokens.size(), 21u) << Tokens; + EXPECT_TOKEN(Tokens[11], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[17], BK_Block); EXPECT_BRACE_KIND(Tokens[18], BK_Block); @@ -3399,6 +3448,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) { "#endif\n" "};"); ASSERT_EQ(Tokens.size(), 29u) << Tokens; + EXPECT_TOKEN(Tokens[8], tok::identifier, TT_ClassHeadName); EXPECT_BRACE_KIND(Tokens[11], BK_Block); EXPECT_BRACE_KIND(Tokens[17], BK_Block); EXPECT_BRACE_KIND(Tokens[22], BK_Block); @@ -3450,6 +3500,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) { Tokens = annotate("a = class extends goog.a {};", getGoogleStyle(FormatStyle::LK_JavaScript)); ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown); EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_ClassLBrace); EXPECT_BRACE_KIND(Tokens[7], BK_Block); EXPECT_TOKEN(Tokens[8], tok::r_brace, TT_ClassRBrace); @@ -3458,6 +3509,9 @@ TEST_F(TokenAnnotatorTest, BraceKind) { Tokens = annotate("a = class Foo extends goog.a {};", getGoogleStyle(FormatStyle::LK_JavaScript)); ASSERT_EQ(Tokens.size(), 12u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::identifier, TT_ClassHeadName); + // FIXME: + // EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown); // Not StartOfName EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_ClassLBrace); EXPECT_BRACE_KIND(Tokens[8], BK_Block); EXPECT_TOKEN(Tokens[9], tok::r_brace, TT_ClassRBrace); @@ -3466,6 +3520,8 @@ TEST_F(TokenAnnotatorTest, BraceKind) { Tokens = annotate("#define FOO(X) \\\n" " struct X##_tag_ {};"); ASSERT_EQ(Tokens.size(), 14u) << Tokens; + EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown); + EXPECT_TOKEN(Tokens[9], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_StructLBrace); EXPECT_BRACE_KIND(Tokens[10], BK_Block); EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_StructRBrace); @@ -3476,6 +3532,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) { " void f() { return; } \\\n" " };"); ASSERT_EQ(Tokens.size(), 20u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::identifier, TT_ClassHeadName); EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_StructLBrace); EXPECT_BRACE_KIND(Tokens[8], BK_Block); EXPECT_TOKEN(Tokens[10], tok::identifier, TT_FunctionDeclarationName); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits