Revert "C++: fix support for typedef of templated typedefs"

Still crashes when opening the Qt Creator project,
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 (Ubuntu 12.10).

This reverts commit 564c9b2842.

Change-Id: Ief5c0aad463d245f68805f747d277ac298796c3d
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Nikolai Kosjar
2013-04-23 11:46:55 +02:00
parent e8c23e1d71
commit 849534ec6f
5 changed files with 5 additions and 218 deletions

View File

@@ -719,22 +719,10 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name,
if (name->isNameId() || name->isTemplateNameId() || name->isAnonymousNameId()) {
flush();
if (name->isTemplateNameId()) {
// if it is a base specialization, the 'name' could be an instantiation
QMap<const TemplateNameId *, ClassOrNamespace *>::iterator it
= _instantiations.find(name->asTemplateNameId());
if (it != _instantiations.end())
return it.value();
}
foreach (Symbol *s, symbols()) {
if (Class *klass = s->asClass()) {
if (klass->identifier() && klass->identifier()->isEqualTo(name->identifier()))
return this;
if (ClassOrNamespace *typedefedType
= resolveTypedef(klass, name, searchInEnclosingScope, origin))
return typedefedType;
}
}
@@ -758,9 +746,6 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name,
}
foreach (ClassOrNamespace *u, usings()) {
// usings are not instantiated for templates
if (_templateId && u->_templateId)
continue;
if (ClassOrNamespace *r = u->lookupType_helper(name,
processed,
/*searchInEnclosingScope =*/ false,
@@ -769,21 +754,8 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name,
}
}
return lookupType_helper_inParent(name, processed, searchInEnclosingScope, origin);
}
return 0;
}
ClassOrNamespace *ClassOrNamespace::lookupType_helper_inParent(const Name *name, QSet<ClassOrNamespace *> *processed,
bool searchInEnclosingScope, ClassOrNamespace *origin)
{
if (_parent && searchInEnclosingScope) {
// for templates _parent is a base specialization,
// so we should take here rather _parent of this base specialization
ClassOrNamespace *parent = _templateId ? _parent->_parent : _parent;
if (parent)
return parent->lookupType_helper(name, processed, searchInEnclosingScope, origin);
if (_parent && searchInEnclosingScope)
return _parent->lookupType_helper(name, processed, searchInEnclosingScope, origin);
}
return 0;
@@ -823,39 +795,6 @@ ClassOrNamespace *ClassOrNamespace::findSpecializationWithPointer(const Template
return 0;
}
ClassOrNamespace *ClassOrNamespace::resolveTypedef(Class *klass, const Name *name,
bool searchInEnclosingScope,
ClassOrNamespace *origin)
{
// it can be a typedef
const unsigned memberClassCount = klass->memberCount();
for (unsigned i = 0; i < memberClassCount; ++i) {
Symbol *memberClassAsSymbol = klass->memberAt(i);
if (Declaration *declaration = memberClassAsSymbol->asDeclaration()) {
if (declaration->isTypedef()
&& name->identifier()->isEqualTo(declaration->name()->identifier())) {
if (NamedType *namedType = declaration->type()->asNamedType()) {
QSet<ClassOrNamespace *> innerProcessed;
const Name *namedTypeName = namedType->name();
const QualifiedNameId *q = namedTypeName->asQualifiedNameId();
if (q) {
if (name->isEqualTo(q->base()) && name->isEqualTo(q->name()))
return lookupType_helper_inParent(name, &innerProcessed,
searchInEnclosingScope,
origin);
if ((klass->identifier()
&& klass->identifier()->isEqualTo(q->base()->identifier())))
return this;
}
return lookupType_helper(namedTypeName, &innerProcessed, true, origin);
}
}
}
}
return 0;
}
ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespace *origin)
{
Q_ASSERT(name != 0);
@@ -1020,7 +959,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
oo.showReturnTypes = true;
oo.showTemplateParameters = true;
qDebug()<<"cloned"<<oo(clone->type());
if (Class *klass = clone->asClass()) {
if (Class *klass = s->asClass()) {
const unsigned klassMemberCount = klass->memberCount();
for (unsigned i = 0; i < klassMemberCount; ++i){
Symbol *klassMemberAsSymbol = klass->memberAt(i);

View File

@@ -111,9 +111,6 @@ private:
ClassOrNamespace *lookupType_helper(const Name *name, QSet<ClassOrNamespace *> *processed,
bool searchInEnclosingScope, ClassOrNamespace *origin);
ClassOrNamespace *lookupType_helper_inParent(const Name *name, QSet<ClassOrNamespace *> *processed,
bool searchInEnclosingScope, ClassOrNamespace *origin);
ClassOrNamespace *nestedType(const Name *name, ClassOrNamespace *origin);
void instantiateNestedClasses(ClassOrNamespace *enclosingTemplateClass,
@@ -123,8 +120,6 @@ private:
bool isInstantiateNestedClassNeeded(const QList<Symbol *>& symbols, const Subst &subst) const;
ClassOrNamespace *findSpecializationWithPointer(const TemplateNameId *templId,
const TemplateNameIdTable &specializations);
ClassOrNamespace *resolveTypedef(Class *klass, const Name *name,
bool searchInEnclosingScope, ClassOrNamespace *origin);
CreateBindings *_factory;
ClassOrNamespace *_parent;

View File

@@ -690,15 +690,8 @@ bool ResolveExpression::visit(CallAST *ast)
}
} else if (Function *funTy = ty->asFunctionType()) {
if (maybeValidPrototype(funTy, actualArgumentCount)) {
LookupItem item;
item.setType(funTy->returnType().simplified());
item.setScope(scope);
// we have to remember a binding because it can be a template instantiation
item.setBinding(result.binding());
_results.append(item);
}
if (maybeValidPrototype(funTy, actualArgumentCount))
addResult(funTy->returnType().simplified(), scope);
} else if (Class *classTy = ty->asClassType()) {
// Constructor call