predelnik updated this revision to Diff 423231. predelnik added a comment. Added annotator test, checked that it fails without a patch
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D123896/new/ https://reviews.llvm.org/D123896 Files: clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -294,6 +294,18 @@ EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown); EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]); EXPECT_TRUE(Tokens[21]->ClosesRequiresClause); + + Tokens = + 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[8], tok::kw_concept, TT_Unknown); + EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[20], tok::greater, TT_TemplateCloser); + EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser); + EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) { Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -24040,6 +24040,12 @@ verifyFormat("template <class T, class T2>\n" "concept Same = __is_same_as<T, T2>;"); + verifyFormat( + "template <class _InIt, class _OutIt>\n" + "concept _Can_reread_dest =\n" + " std::forward_iterator<_OutIt> &&\n" + " std::same_as<std::iter_value_t<_InIt>, std::iter_value_t<_OutIt>>;"); + auto Style = getLLVMStyle(); Style.BreakBeforeConceptDeclarations = FormatStyle::BBCDS_Allowed; Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2174,7 +2174,8 @@ parseBracedList(); break; case tok::less: - if (Style.Language == FormatStyle::LK_Proto) { + if (Style.Language == FormatStyle::LK_Proto || + ClosingBraceKind == tok::greater) { nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); @@ -3218,6 +3219,7 @@ if (!FormatTok->is(tok::less)) return; + nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); break; @@ -3258,9 +3260,11 @@ // Read identifier with optional template declaration. nextToken(); - if (FormatTok->is(tok::less)) + if (FormatTok->is(tok::less)) { + nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); + } break; } } while (!eof());
Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -294,6 +294,18 @@ EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown); EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]); EXPECT_TRUE(Tokens[21]->ClosesRequiresClause); + + Tokens = + 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[8], tok::kw_concept, TT_Unknown); + EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[20], tok::greater, TT_TemplateCloser); + EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser); + EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) { Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -24040,6 +24040,12 @@ verifyFormat("template <class T, class T2>\n" "concept Same = __is_same_as<T, T2>;"); + verifyFormat( + "template <class _InIt, class _OutIt>\n" + "concept _Can_reread_dest =\n" + " std::forward_iterator<_OutIt> &&\n" + " std::same_as<std::iter_value_t<_InIt>, std::iter_value_t<_OutIt>>;"); + auto Style = getLLVMStyle(); Style.BreakBeforeConceptDeclarations = FormatStyle::BBCDS_Allowed; Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2174,7 +2174,8 @@ parseBracedList(); break; case tok::less: - if (Style.Language == FormatStyle::LK_Proto) { + if (Style.Language == FormatStyle::LK_Proto || + ClosingBraceKind == tok::greater) { nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); @@ -3218,6 +3219,7 @@ if (!FormatTok->is(tok::less)) return; + nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); break; @@ -3258,9 +3260,11 @@ // Read identifier with optional template declaration. nextToken(); - if (FormatTok->is(tok::less)) + if (FormatTok->is(tok::less)) { + nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); + } break; } } while (!eof());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits