diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-06-11 09:22:18 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-06-11 16:30:20 +0200 |
commit | 8f1b6656677344e9ca4b6798ddd900725c478b16 (patch) | |
tree | 86813a83f133731c70dd2b6202888bb05c067a04 /src/libs/cplusplus/ResolveExpression.cpp | |
parent | f1ed40a02cdb62bd80111f9b4969770215430389 (diff) | |
download | qt-creator-8f1b6656677344e9ca4b6798ddd900725c478b16.tar.gz |
C++: Handle recursive auto declarations
Remember auto declarations we have already looked up and stop if we try
it again.
Task-number: QTCREATORBUG-9503
Change-Id: I989b11609c98bf197ce916d79c9d452294355053
Reviewed-by: Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 55e1d69492..9b09c2c5b5 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -77,11 +77,13 @@ static QList<_Tp> removeDuplicates(const QList<_Tp> &results) ///////////////////////////////////////////////////////////////////// // ResolveExpression ///////////////////////////////////////////////////////////////////// -ResolveExpression::ResolveExpression(const LookupContext &context) +ResolveExpression::ResolveExpression(const LookupContext &context, + const QSet<const Declaration *> &autoDeclarationsBeingResolved) : ASTVisitor(context.expressionDocument()->translationUnit()), _scope(0), _context(context), bind(context.expressionDocument()->translationUnit()), + _autoDeclarationsBeingResolved(autoDeclarationsBeingResolved), _reference(false) { } @@ -521,6 +523,10 @@ bool ResolveExpression::visit(SimpleNameAST *ast) if (!decl) continue; + // Stop on recursive auto declarations + if (_autoDeclarationsBeingResolved.contains(decl)) + continue; + const StringLiteral *initializationString = decl->getInitializer(); if (initializationString == 0) continue; @@ -535,7 +541,8 @@ bool ResolveExpression::visit(SimpleNameAST *ast) TypeOfExpression exprTyper; Document::Ptr doc = _context.snapshot().document(QString::fromLocal8Bit(decl->fileName())); - exprTyper.init(doc, _context.snapshot(), _context.bindings()); + exprTyper.init(doc, _context.snapshot(), _context.bindings(), + QSet<const Declaration* >(_autoDeclarationsBeingResolved) << decl); Document::Ptr exprDoc = documentForExpression(exprTyper.preprocessedExpression(initializer)); @@ -545,8 +552,8 @@ bool ResolveExpression::visit(SimpleNameAST *ast) if (deduceAuto._block) continue; - const QList<LookupItem> &typeItems = - exprTyper(extractExpressionAST(exprDoc), exprDoc, decl->enclosingScope()); + const QList<LookupItem> &typeItems = exprTyper(extractExpressionAST(exprDoc), exprDoc, + decl->enclosingScope()); if (typeItems.empty()) continue; |