diff options
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r-- | src/libs/cplusplus/LookupContext.cpp | 13 |
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); + } } } } |