forked from qt-creator/qt-creator
CPlusPlus: Support structured bindings
While we do recommend clangd for modern code bases, we should still be able to parse basic language constructs. Fixes: QTCREATORBUG-27975 Change-Id: I189b991685a5cd5f62f2afce77878b60c895e8f9 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
42
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
42
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
@@ -1568,6 +1568,8 @@ bool Parser::parseDeclaratorOrAbstractDeclarator(DeclaratorAST *&node, Specifier
|
||||
return parseAbstractDeclarator(node, decl_specifier_list);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Parser::parseCoreDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_specifier_list, ClassSpecifierAST *)
|
||||
{
|
||||
DEBUG_THIS_RULE();
|
||||
@@ -1616,11 +1618,51 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_sp
|
||||
node = ast;
|
||||
return true;
|
||||
}
|
||||
} else if (const auto decl = parseDecompositionDeclarator()) {
|
||||
DeclaratorAST *ast = new (_pool) DeclaratorAST;
|
||||
ast->attribute_list = attributes;
|
||||
ast->ptr_operator_list = ptr_operators;
|
||||
ast->core_declarator = decl;
|
||||
node = ast;
|
||||
return true;
|
||||
}
|
||||
rewind(start);
|
||||
return false;
|
||||
}
|
||||
|
||||
DecompositionDeclaratorAST *Parser::parseDecompositionDeclarator()
|
||||
{
|
||||
if (LA() != T_LBRACKET)
|
||||
return nullptr;
|
||||
consumeToken();
|
||||
|
||||
const auto decl = new (_pool) DecompositionDeclaratorAST;
|
||||
for (NameListAST **iter = &decl->identifiers; ; iter = &(*iter)->next) {
|
||||
NameAST *name_ast = nullptr;
|
||||
if (!parseName(name_ast)) {
|
||||
error(cursor(), "expected an identifier");
|
||||
return nullptr;
|
||||
}
|
||||
*iter = new (_pool) NameListAST;
|
||||
(*iter)->value = name_ast;
|
||||
|
||||
if (LA() == T_RBRACKET) {
|
||||
consumeToken();
|
||||
return decl;
|
||||
}
|
||||
|
||||
if (LA() == T_COMMA) {
|
||||
consumeToken();
|
||||
continue;
|
||||
}
|
||||
|
||||
error(cursor(), "expected ',' or ']'");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static bool maybeCppInitializer(DeclaratorAST *declarator)
|
||||
{
|
||||
if (declarator->ptr_operator_list)
|
||||
|
||||
Reference in New Issue
Block a user