diff options
author | Leandro Melo <leandro.melo@nokia.com> | 2012-09-04 15:21:03 +0200 |
---|---|---|
committer | Leandro Melo <leandro.melo@nokia.com> | 2012-09-04 15:35:01 +0200 |
commit | 6750a1c8290bccfa4698b615928fbe64fd68faa4 (patch) | |
tree | 3d2f835ca12f1d4e485e03a11c2e1b1de465e77e /src/libs/cplusplus/ResolveExpression.cpp | |
parent | 8ba422d07c4371a47b575bdef3051554cd4063e0 (diff) | |
download | qt-creator-6750a1c8290bccfa4698b615928fbe64fd68faa4.tar.gz |
C++: Fix crash when deducing auto (with invalid ids)
Task-number: QTCREATORBUG-7801
Change-Id: I61436148ed1428a50a6840ba9109310a57dabaa4
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 961795c95d..a64a61a0bc 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -473,27 +473,38 @@ bool ResolveExpression::visit(SimpleNameAST *ast) if (item.declaration() == 0) continue; - if (item.type().isAuto()) { + if (item.type().isAuto() + && _blockedIds.find(ast->name->identifier()) == _blockedIds.end()) { const Declaration *decl = item.declaration()->asDeclaration(); if (!decl) continue; - Document::Ptr doc = _context.snapshot().document(decl->fileName()); - const StringLiteral *initializationString = decl->getInitializer(); if (initializationString == 0) continue; - QByteArray initializer = QByteArray::fromRawData(initializationString->chars(), initializationString->size()).trimmed(); + const QByteArray &initializer = + QByteArray::fromRawData(initializationString->chars(), + initializationString->size()).trimmed(); // Skip lambda-function initializers if (initializer.length() > 0 && initializer[0] == '[') continue; TypeOfExpression exprTyper; + Document::Ptr doc = _context.snapshot().document(decl->fileName()); exprTyper.init(doc, _context.snapshot(), _context.bindings()); - QList<LookupItem> typeItems = exprTyper(initializer, decl->enclosingScope(), TypeOfExpression::Preprocess); + Document::Ptr exprDoc = + documentForExpression(exprTyper.preprocessedExpression(initializer)); + exprDoc->check(); + ExpressionAST *exprAST = extractExpressionAST(exprDoc); + if (!exprAST) + continue; + + _blockedIds.insert(ast->name->identifier()); + const QList<LookupItem> &typeItems = resolve(exprAST, decl->enclosingScope()); + _blockedIds.erase(ast->name->identifier()); if (typeItems.empty()) continue; |