summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
authorPrzemyslaw Gorszkowski <pgorszkowski@gmail.com>2012-09-22 14:24:43 +0200
committerhjk <qthjk@ovi.com>2012-09-28 14:54:52 +0200
commit7e9913f0f540e196ca7e53217d2edf19a9e8ef29 (patch)
treeec0ee8cf284161d1c589b6ae4d2563771e7f0b1c /src/libs/cplusplus/LookupContext.cpp
parentb02e954eff366bd10d672c756208955d1f934813 (diff)
downloadqt-creator-7e9913f0f540e196ca7e53217d2edf19a9e8ef29.tar.gz
Fix crashes when typing code
Problem was with cyclic recurrence. To solve it we need to check if derived class is different class than its base class. Keep completion corrected. Include some unit tests when base class has the same name as derived. Task-number: QTCREATORBUG-7887 Change-Id: I7973c0b06e3b62d2da3d06048f4327d18a0b8011 Reviewed-by: hjk <qthjk@ovi.com>
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 8edd3b30ca..e474287d19 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -789,15 +789,37 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
return instantiation;
}
+ if (allBases.isEmpty() || allBases.size() == knownUsings.size())
+ return reference;
+
+ QList<const Name *> fullyQualifiedNameForReferenceClass =
+ LookupContext::fullyQualifiedName(referenceClass);
// Find the missing bases for regular (non-template) types.
// Ex.: class A : public B<Some>::Type {};
foreach (const Name *baseName, allBases) {
ClassOrNamespace *binding = this;
if (const QualifiedNameId *qBaseName = baseName->asQualifiedNameId()) {
+ QList<const Name *> fullyQualifiedNameForBaseClass;
+ addNames(baseName, &fullyQualifiedNameForBaseClass);
+ if (compareFullyQualifiedName(fullyQualifiedNameForReferenceClass,
+ fullyQualifiedNameForBaseClass)) {
+ continue;
+ }
+
if (const Name *qualification = qBaseName->base())
binding = lookupType(qualification);
+ else if (binding->parent() != 0)
+ //if this is global identifier we take global namespace
+ //Ex: class A{}; namespace NS { class A: public ::A{}; }
+ binding = binding->globalNamespace();
+ else
+ //if we are in the global scope
+ continue;
baseName = qBaseName->name();
}
+ else if (compareName(name, baseName)) {
+ continue;
+ }
if (binding) {
ClassOrNamespace * baseBinding = binding->lookupType(baseName);
@@ -806,7 +828,6 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
}
}
-
return reference;
}