summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/ResolveExpression.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-06-11 09:22:18 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-06-11 16:30:20 +0200
commit8f1b6656677344e9ca4b6798ddd900725c478b16 (patch)
tree86813a83f133731c70dd2b6202888bb05c067a04 /src/libs/cplusplus/ResolveExpression.cpp
parentf1ed40a02cdb62bd80111f9b4969770215430389 (diff)
downloadqt-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.cpp15
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;