summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index a8a65fd7b8..aa292ee194 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -275,7 +275,8 @@ ClassOrNamespace *LookupContext::globalNamespace() const
}
ClassOrNamespace *LookupContext::lookupType(const Name *name, Scope *scope,
- ClassOrNamespace* enclosingTemplateInstantiation) const
+ ClassOrNamespace* enclosingTemplateInstantiation,
+ QSet<const Declaration *> typedefsBeingResolved) const
{
if (! scope) {
return 0;
@@ -294,8 +295,14 @@ ClassOrNamespace *LookupContext::lookupType(const Name *name, Scope *scope,
Overview oo;
qDebug() << "Looks like" << oo(name) << "is a typedef for" << oo(d->type());
#endif // DEBUG_LOOKUP
- if (const NamedType *namedTy = d->type()->asNamedType())
- return lookupType(namedTy->name(), scope);
+ if (const NamedType *namedTy = d->type()->asNamedType()) {
+ // Stop on recursive typedef declarations
+ if (typedefsBeingResolved.contains(d))
+ return 0;
+ return lookupType(namedTy->name(), scope, 0,
+ QSet<const Declaration *>(typedefsBeingResolved)
+ << d);
+ }
}
}
}