rymiel updated this revision to Diff 484985. rymiel added a comment. Adapt description of parseConstraintExpression
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D140339/new/ https://reviews.llvm.org/D140339 Files: clang/lib/Format/TokenAnnotator.cpp clang/lib/Format/UnwrappedLineParser.cpp clang/lib/Format/UnwrappedLineParser.h clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -23588,10 +23588,10 @@ "concept DelayedCheck = !!false || requires(T t) { t.bar(); } " "&& sizeof(T) <= 8;"); - verifyFormat( - "template <typename T>\n" - "concept DelayedCheck = static_cast<bool>(0) ||\n" - " requires(T t) { t.bar(); } && sizeof(T) <= 8;"); + verifyFormat("template <typename T>\n" + "concept DelayedCheck =\n" + " static_cast<bool>(0) || requires(T t) { t.bar(); } && " + "sizeof(T) <= 8;"); verifyFormat("template <typename T>\n" "concept DelayedCheck = bool(0) || requires(T t) { t.bar(); } " @@ -23599,8 +23599,8 @@ verifyFormat( "template <typename T>\n" - "concept DelayedCheck = (bool)(0) ||\n" - " requires(T t) { t.bar(); } && sizeof(T) <= 8;"); + "concept DelayedCheck =\n" + " (bool)(0) || requires(T t) { t.bar(); } && sizeof(T) <= 8;"); verifyFormat("template <typename T>\n" "concept DelayedCheck = (bool)0 || requires(T t) { t.bar(); } " @@ -23636,6 +23636,9 @@ verifyFormat("template <typename T>\n" "concept True = S<T>::Value;"); + verifyFormat("template <S T>\n" + "concept True = T.field;"); + verifyFormat( "template <typename T>\n" "concept C = []() { return true; }() && requires(T t) { t.bar(); } &&\n" @@ -23914,11 +23917,9 @@ verifyFormat("template <typename T> concept True = true;", Style); verifyFormat( - "template <typename T> concept C = decltype([]() -> std::true_type {\n" - " return {};\n" - " }())::value &&\n" - " requires(T t) { t.bar(); } && " - "sizeof(T) <= 8;", + "template <typename T> concept C =\n" + " decltype([]() -> std::true_type { return {}; }())::value &&\n" + " requires(T t) { t.bar(); } && sizeof(T) <= 8;", Style); verifyFormat("template <typename T> concept Semiregular =\n" @@ -23936,21 +23937,20 @@ // The following tests are invalid C++, we just want to make sure we don't // assert. - verifyFormat("template <typename T>\n" - "concept C = requires C2<T>;"); + verifyNoCrash("template <typename T>\n" + "concept C = requires C2<T>;"); - verifyFormat("template <typename T>\n" - "concept C = 5 + 4;"); + verifyNoCrash("template <typename T>\n" + "concept C = 5 + 4;"); - verifyFormat("template <typename T>\n" - "concept C =\n" - "class X;"); + verifyNoCrash("template <typename T>\n" + "concept C = class X;"); - verifyFormat("template <typename T>\n" - "concept C = [] && true;"); + verifyNoCrash("template <typename T>\n" + "concept C = [] && true;"); - verifyFormat("template <typename T>\n" - "concept C = [] && requires(T t) { typename T::size_type; };"); + verifyNoCrash("template <typename T>\n" + "concept C = [] && requires(T t) { typename T::size_type; };"); } TEST_F(FormatTest, RequiresClausesPositions) { Index: clang/lib/Format/UnwrappedLineParser.h =================================================================== --- clang/lib/Format/UnwrappedLineParser.h +++ clang/lib/Format/UnwrappedLineParser.h @@ -158,7 +158,6 @@ void parseAccessSpecifier(); bool parseEnum(); bool parseStructLike(); - void parseConcept(); bool parseRequires(); void parseRequiresClause(FormatToken *RequiresToken); void parseRequiresExpression(FormatToken *RequiresToken); Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -1813,9 +1813,6 @@ break; } break; - case tok::kw_concept: - parseConcept(); - return; case tok::kw_requires: { if (Style.isCpp()) { bool ParsedClause = parseRequires(); @@ -3272,26 +3269,6 @@ } } -/// \brief Parses a concept definition. -/// \pre The current token has to be the concept keyword. -/// -/// Returns if either the concept has been completely parsed, or if it detects -/// that the concept definition is incorrect. -void UnwrappedLineParser::parseConcept() { - assert(FormatTok->is(tok::kw_concept) && "'concept' expected"); - nextToken(); - if (!FormatTok->is(tok::identifier)) - return; - nextToken(); - if (!FormatTok->is(tok::equal)) - return; - nextToken(); - parseConstraintExpression(); - if (FormatTok->is(tok::semi)) - nextToken(); - addUnwrappedLine(); -} - /// \brief Parses a requires, decides if it is a clause or an expression. /// \pre The current token has to be the requires keyword. /// \returns true if it parsed a clause. @@ -3458,6 +3435,8 @@ ? TT_RequiresClauseInARequiresExpression : TT_RequiresClause); + // NOTE: parseConstraintExpression is only ever called from this function. + // It could be inlined into here. parseConstraintExpression(); if (!InRequiresExpression) @@ -3491,9 +3470,8 @@ /// \brief Parses a constraint expression. /// -/// This is either the definition of a concept, or the body of a requires -/// clause. It returns, when the parsing is complete, or the expression is -/// incorrect. +/// This is the body of a requires clause. It returns, when the parsing is +/// complete, or the expression is incorrect. void UnwrappedLineParser::parseConstraintExpression() { // The special handling for lambdas is needed since tryToParseLambda() eats a // token and if a requires expression is the last part of a requires clause Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -1680,8 +1680,8 @@ if (!Tok) return false; - if (Tok->isOneOf(tok::kw_class, tok::kw_enum, tok::kw_concept, - tok::kw_struct, tok::kw_using)) { + if (Tok->isOneOf(tok::kw_class, tok::kw_enum, tok::kw_struct, + tok::kw_using)) { return false; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits