This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGdab5e10ea5db: [clang-format] fix nested angle brackets parse inside concept definition (authored by predelnik, committed by curdeius).
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 @@ -390,6 +390,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 @@ -24114,6 +24114,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 @@ -2180,7 +2180,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); @@ -3220,6 +3221,7 @@ if (!FormatTok->is(tok::less)) return; + nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); break; @@ -3260,9 +3262,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 @@ -390,6 +390,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 @@ -24114,6 +24114,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 @@ -2180,7 +2180,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); @@ -3220,6 +3221,7 @@ if (!FormatTok->is(tok::less)) return; + nextToken(); parseBracedList(/*ContinueOnSemicolons=*/false, /*IsEnum=*/false, /*ClosingBraceKind=*/tok::greater); break; @@ -3260,9 +3262,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