Author: Björn Schäpers Date: 2022-07-18T21:41:09+02:00 New Revision: 2b04c41b28320c1e399209fbe7a5a8d540578999
URL: https://github.com/llvm/llvm-project/commit/2b04c41b28320c1e399209fbe7a5a8d540578999 DIFF: https://github.com/llvm/llvm-project/commit/2b04c41b28320c1e399209fbe7a5a8d540578999.diff LOG: [clang-format] Fix misannotation of colon in presence of requires clause For clauses without parentheses it was annotated as TT_InheritanceColon. Relates to https://github.com/llvm/llvm-project/issues/56215 Differential Revision: https://reviews.llvm.org/D129940 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 e0dc7a7f05c9..5991cf23d5dc 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -999,7 +999,8 @@ class AnnotatingParser { FormatToken *Prev = Tok->getPreviousNonComment(); if (!Prev) break; - if (Prev->isOneOf(tok::r_paren, tok::kw_noexcept)) { + if (Prev->isOneOf(tok::r_paren, tok::kw_noexcept) || + Prev->ClosesRequiresClause) { Tok->setType(TT_CtorInitializerColon); } else if (Prev->is(tok::kw_try)) { // Member initializer list within function try block. diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index a2474d5c10f8..ed6fb414d618 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -802,6 +802,70 @@ TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) { << I; } } + + BaseTokens = annotate("constexpr Foo(Foo const &other)\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"); + + ConstrainedTokens = annotate("constexpr Foo(Foo const &other)\n" + " requires std::is_copy_constructible<T>\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"); + + NumberOfBaseTokens = 26u; + NumberOfAdditionalRequiresClauseTokens = 7u; + NumberOfTokensBeforeRequires = 8u; + + ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; + ASSERT_EQ(ConstrainedTokens.size(), + NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) + << ConstrainedTokens; + + for (auto I = 0u; I < NumberOfBaseTokens; ++I) { + if (I < NumberOfTokensBeforeRequires) { + EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; + } else { + EXPECT_EQ(*BaseTokens[I], + *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) + << I; + } + } + + BaseTokens = annotate("constexpr Foo(Foo const &other)\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"); + + ConstrainedTokens = annotate("constexpr Foo(Foo const &other)\n" + " requires (std::is_copy_constructible<T>)\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"); + + NumberOfBaseTokens = 26u; + NumberOfAdditionalRequiresClauseTokens = 9u; + NumberOfTokensBeforeRequires = 8u; + + ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; + ASSERT_EQ(ConstrainedTokens.size(), + NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) + << ConstrainedTokens; + + for (auto I = 0u; I < NumberOfBaseTokens; ++I) { + if (I < NumberOfTokensBeforeRequires) { + EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; + } else { + EXPECT_EQ(*BaseTokens[I], + *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) + << I; + } + } } TEST_F(TokenAnnotatorTest, UnderstandsAsm) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits