This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGb1eeec6177fa: [clang-format] Remove special logic for
parsing concept definitions. (authored by rymiel).
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
@@ -1818,9 +1818,6 @@
break;
}
break;
- case tok::kw_concept:
- parseConcept();
- return;
case tok::kw_requires: {
if (Style.isCpp()) {
bool ParsedClause = parseRequires();
@@ -3277,26 +3274,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.
@@ -3463,6 +3440,8 @@
? TT_RequiresClauseInARequiresExpression
: TT_RequiresClause);
+ // NOTE: parseConstraintExpression is only ever called from this function.
+ // It could be inlined into here.
parseConstraintExpression();
if (!InRequiresExpression)
@@ -3496,9 +3475,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
@@ -1690,8 +1690,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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits