diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2023-03-07 10:04:14 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2023-03-13 10:21:32 +0000 |
commit | 81dcfd907b961f4f3aab438d648a3fc3a50fc4ee (patch) | |
tree | 77dba0e7d25b70473712772e22663c026ee6ff4b /src/libs/3rdparty/cplusplus/Parser.cpp | |
parent | 8d5e08c58c93ad5c7d6a1bd043e7c753c653fa1d (diff) |
CPlusPlus: Add parser support for generic lambdas
Change-Id: Id17975a4296925c10b1b43f963412eea61ccfa5d
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Parser.cpp')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 45c2493fff..f8c737c097 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -1417,8 +1417,22 @@ bool Parser::parseRequiresClauseOpt(RequiresClauseAST *&node) return true; const auto ast = new (_pool) RequiresClauseAST; ast->requires_token = consumeToken(); - if (!parseLogicalOrExpression(ast->constraint)) + if (!parsePrimaryExpression(ast->constraint)) return false; + while (true) { + if (LA() != T_PIPE_PIPE && LA() != T_AMPER_AMPER) + break; + ExpressionAST *next = nullptr; + if (!parsePrimaryExpression(next)) + return false; + + // This won't yield the right precedence, but I don't care. + BinaryExpressionAST *expr = new (_pool) BinaryExpressionAST; + expr->left_expression = ast->constraint; + expr->binary_op_token = consumeToken(); + expr->right_expression = next; + ast->constraint = expr; + } node = ast; return true; } @@ -6999,6 +7013,15 @@ bool Parser::parseLambdaExpression(ExpressionAST *&node) if (parseLambdaIntroducer(lambda_introducer)) { LambdaExpressionAST *ast = new (_pool) LambdaExpressionAST; ast->lambda_introducer = lambda_introducer; + if (_languageFeatures.cxx20Enabled && LA() == T_LESS) { + consumeToken(); + parseTemplateParameterList(ast->templateParameters); + if (LA() != T_GREATER) + return false; + consumeToken(); + parseRequiresClauseOpt(ast->requiresClause); + } + parseOptionalAttributeSpecifierSequence(ast->attributes); parseLambdaDeclarator(ast->lambda_declarator); parseCompoundStatement(ast->statement); node = ast; @@ -7023,7 +7046,9 @@ bool Parser::parseLambdaIntroducer(LambdaIntroducerAST *&node) if (LA() == T_RBRACKET) { ast->rbracket_token = consumeToken(); - if (LA() == T_LPAREN || LA() == T_LBRACE) { + // FIXME: Attributes are also allowed ... + if (LA() == T_LPAREN || LA() == T_LBRACE + || (_languageFeatures.cxx20Enabled && LA() == T_LESS)) { node = ast; return true; } @@ -7139,6 +7164,7 @@ bool Parser::parseLambdaDeclarator(LambdaDeclaratorAST *&node) parseExceptionSpecification(ast->exception_specification); parseTrailingReturnType(ast->trailing_return_type); + parseRequiresClauseOpt(ast->requiresClause); node = ast; return true; |