summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp430
-rw-r--r--src/libs/cplusplus/DeprecatedGenTemplateInstance.h63
-rw-r--r--src/libs/cplusplus/Dumpers.cpp2
-rw-r--r--src/libs/cplusplus/LookupContext.cpp52
-rw-r--r--src/libs/cplusplus/LookupContext.h7
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp42
-rw-r--r--src/libs/cplusplus/ResolveExpression.h1
-rw-r--r--src/libs/cplusplus/cplusplus-lib.pri2
-rw-r--r--src/libs/cplusplus/cplusplus.qbs1
-rw-r--r--tests/auto/cplusplus/semantic/tst_semantic.cpp11
10 files changed, 31 insertions, 580 deletions
diff --git a/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp b/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp
deleted file mode 100644
index e037f87c58..0000000000
--- a/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp
+++ /dev/null
@@ -1,430 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms and
-** conditions see http://www.qt.io/terms-conditions. For further information
-** use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-****************************************************************************/
-
-#include "DeprecatedGenTemplateInstance.h"
-#include "Overview.h"
-
-#include <cplusplus/Control.h>
-#include <cplusplus/Scope.h>
-#include <cplusplus/Names.h>
-#include <cplusplus/Symbols.h>
-#include <cplusplus/CoreTypes.h>
-#include <cplusplus/Literals.h>
-
-#include <QVarLengthArray>
-#include <QDebug>
-
-using namespace CPlusPlus;
-
-namespace {
-
-class ApplySubstitution
-{
-public:
- ApplySubstitution(Control *control, Symbol *symbol, const DeprecatedGenTemplateInstance::Substitution &substitution);
- ~ApplySubstitution();
-
- inline Control *control() const { return _control; }
-
- FullySpecifiedType apply(const Name *name);
- FullySpecifiedType apply(const FullySpecifiedType &type);
-
- int findSubstitution(const Identifier *id) const;
- FullySpecifiedType applySubstitution(int index) const;
-
-private:
- class ApplyToType: protected TypeVisitor
- {
- public:
- ApplyToType(ApplySubstitution *q)
- : q(q) {}
-
- FullySpecifiedType operator()(const FullySpecifiedType &ty)
- {
- FullySpecifiedType previousType = switchType(ty);
- accept(ty.type());
- return switchType(previousType);
- }
-
- protected:
- using TypeVisitor::visit;
-
- Control *control() const
- { return q->control(); }
-
- FullySpecifiedType switchType(const FullySpecifiedType &type)
- {
- FullySpecifiedType previousType = _type;
- _type = type;
- return previousType;
- }
-
- virtual void visit(VoidType *)
- {
- // nothing to do
- }
-
- virtual void visit(IntegerType *)
- {
- // nothing to do
- }
-
- virtual void visit(FloatType *)
- {
- // nothing to do
- }
-
- virtual void visit(PointerToMemberType *)
- {
- qDebug() << Q_FUNC_INFO; // ### TODO
- }
-
- virtual void visit(PointerType *ptrTy)
- {
- _type.setType(control()->pointerType(q->apply(ptrTy->elementType())));
- }
-
- virtual void visit(ReferenceType *refTy)
- {
- _type.setType(control()->referenceType(q->apply(refTy->elementType()), refTy->isRvalueReference()));
- }
-
- virtual void visit(ArrayType *arrayTy)
- {
- _type.setType(control()->arrayType(q->apply(arrayTy->elementType()), arrayTy->size()));
- }
-
- virtual void visit(NamedType *ty)
- {
- FullySpecifiedType n = q->apply(ty->name());
- _type.setType(n.type());
- }
-
- virtual void visit(Function *funTy)
- {
- Function *fun = control()->newFunction(/*sourceLocation=*/ 0, funTy->name());
- fun->setEnclosingScope(funTy->enclosingScope());
- fun->setConst(funTy->isConst());
- fun->setVolatile(funTy->isVolatile());
- fun->setVirtual(funTy->isVirtual());
- fun->setOverride(funTy->isOverride());
- fun->setFinal(funTy->isFinal());
- fun->setAmbiguous(funTy->isAmbiguous());
- fun->setVariadic(funTy->isVariadic());
-
- fun->setReturnType(q->apply(funTy->returnType()));
-
- for (unsigned i = 0, argc = funTy->argumentCount(); i < argc; ++i) {
- Argument *originalArgument = funTy->argumentAt(i)->asArgument();
- Argument *arg = control()->newArgument(/*sourceLocation*/ 0,
- originalArgument->name());
-
- arg->setType(q->apply(originalArgument->type()));
- arg->setInitializer(originalArgument->initializer());
- fun->addMember(arg);
- }
-
- _type.setType(fun);
- }
-
- virtual void visit(Namespace *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(Class *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(Enum *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(ForwardClassDeclaration *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(ObjCClass *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(ObjCProtocol *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(ObjCMethod *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(ObjCForwardClassDeclaration *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- virtual void visit(ObjCForwardProtocolDeclaration *)
- {
- qDebug() << Q_FUNC_INFO;
- }
-
- private:
- ApplySubstitution *q;
- FullySpecifiedType _type;
- QHash<Symbol *, FullySpecifiedType> _processed;
- };
-
- class ApplyToName: protected NameVisitor
- {
- public:
- ApplyToName(ApplySubstitution *q): q(q) {}
-
- FullySpecifiedType operator()(const Name *name)
- {
- FullySpecifiedType previousType = switchType(FullySpecifiedType());
- accept(name);
- return switchType(previousType);
- }
-
- protected:
- Control *control() const
- { return q->control(); }
-
- int findSubstitution(const Identifier *id) const
- { return q->findSubstitution(id); }
-
- FullySpecifiedType applySubstitution(int index) const
- { return q->applySubstitution(index); }
-
- FullySpecifiedType switchType(const FullySpecifiedType &type)
- {
- FullySpecifiedType previousType = _type;
- _type = type;
- return previousType;
- }
-
- virtual void visit(const Identifier *name)
- {
- int index = findSubstitution(name->identifier());
-
- if (index != -1)
- _type = applySubstitution(index);
-
- else
- _type = control()->namedType(name);
- }
-
- virtual void visit(const TemplateNameId *name)
- {
- QVarLengthArray<FullySpecifiedType, 8> arguments(name->templateArgumentCount());
- for (unsigned i = 0; i < name->templateArgumentCount(); ++i) {
- FullySpecifiedType argTy = name->templateArgumentAt(i);
- arguments[i] = q->apply(argTy);
- }
-
- const TemplateNameId *templId = control()->templateNameId(name->identifier(),
- name->isSpecialization(),
- arguments.data(),
- arguments.size());
- _type = control()->namedType(templId);
- }
-
- const Name *instantiate(const Name *name)
- {
- if (! name)
- return name;
-
- if (const Identifier *nameId = name->asNameId()) {
- const Identifier *id = control()->identifier(nameId->chars(), nameId->size());
- return id;
-
- } else if (const TemplateNameId *templId = name->asTemplateNameId()) {
- QVarLengthArray<FullySpecifiedType, 8> arguments(templId->templateArgumentCount());
- for (unsigned templateArgIndex = 0; templateArgIndex < templId->templateArgumentCount();
- ++templateArgIndex) {
- FullySpecifiedType argTy = templId->templateArgumentAt(templateArgIndex);
- arguments[templateArgIndex] = q->apply(argTy);
- }
- const Identifier *id = control()->identifier(templId->identifier()->chars(),
- templId->identifier()->size());
- return control()->templateNameId(id, templId->isSpecialization(), arguments.data(),
- arguments.size());
-
- } else if (const QualifiedNameId *qq = name->asQualifiedNameId()) {
- const Name *base = instantiate(qq->base());
- const Name *name = instantiate(qq->name());
-
- return control()->qualifiedNameId(base, name);
-
- } else if (const OperatorNameId *op = name->asOperatorNameId()) {
- return control()->operatorNameId(op->kind());
-
- } else if (const ConversionNameId *c = name->asConversionNameId()) {
- FullySpecifiedType ty = q->apply(c->type());
- return control()->conversionNameId(ty);
-
- }
-
- return 0;
- }
-
- virtual void visit(const QualifiedNameId *name)
- {
- if (const Name *n = instantiate(name))
- _type = control()->namedType(n);
- }
-
- virtual void visit(const DestructorNameId *name)
- {
- Overview oo;
- qWarning() << "ignored name:" << oo.prettyName(name);
- }
-
- virtual void visit(const OperatorNameId *name)
- {
- Overview oo;
- qWarning() << "ignored name:" << oo.prettyName(name);
- }
-
- virtual void visit(const ConversionNameId *name)
- {
- Overview oo;
- qWarning() << "ignored name:" << oo.prettyName(name);
- }
-
- virtual void visit(const SelectorNameId *name)
- {
- Overview oo;
- qWarning() << "ignored name:" << oo.prettyName(name);
- }
-
- private:
- ApplySubstitution *q;
- FullySpecifiedType _type;
- };
-
-public: // attributes
- Control *_control;
- Symbol *symbol;
- DeprecatedGenTemplateInstance::Substitution substitution;
- ApplyToType applyToType;
- ApplyToName applyToName;
-};
-
-ApplySubstitution::ApplySubstitution(Control *control, Symbol *symbol,
- const DeprecatedGenTemplateInstance::Substitution &substitution)
- : _control(control), symbol(symbol),
- substitution(substitution),
- applyToType(this), applyToName(this)
-{ }
-
-ApplySubstitution::~ApplySubstitution()
-{
-}
-
-FullySpecifiedType ApplySubstitution::apply(const Name *name)
-{
- FullySpecifiedType ty = applyToName(name);
- return ty;
-}
-
-FullySpecifiedType ApplySubstitution::apply(const FullySpecifiedType &type)
-{
- FullySpecifiedType ty = applyToType(type);
- return ty;
-}
-
-int ApplySubstitution::findSubstitution(const Identifier *id) const
-{
- Q_ASSERT(id != 0);
-
- for (int index = 0; index < substitution.size(); ++index) {
- QPair<const Identifier *, FullySpecifiedType> s = substitution.at(index);
-
- if (id->match(s.first))
- return index;
- }
-
- return -1;
-}
-
-FullySpecifiedType ApplySubstitution::applySubstitution(int index) const
-{
- Q_ASSERT(index != -1);
- Q_ASSERT(index < substitution.size());
-
- return substitution.at(index).second;
-}
-
-} // end of anonymous namespace
-
-DeprecatedGenTemplateInstance::DeprecatedGenTemplateInstance(QSharedPointer<Control> control, const Substitution &substitution)
- : _control(control),
- _substitution(substitution)
-{ }
-
-FullySpecifiedType DeprecatedGenTemplateInstance::gen(Symbol *symbol)
-{
- ApplySubstitution o(_control.data(), symbol, _substitution);
- return o.apply(symbol->type());
-}
-
-FullySpecifiedType DeprecatedGenTemplateInstance::instantiate(const Name *className, Symbol *candidate,
- QSharedPointer<Control> control)
-{
- if (className) {
- if (const TemplateNameId *templId = className->asTemplateNameId()) {
- if (Template *templ = candidate->enclosingTemplate()) {
- DeprecatedGenTemplateInstance::Substitution subst;
-
- for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) {
- FullySpecifiedType templArgTy = templId->templateArgumentAt(i);
-
- if (i < templ->templateParameterCount()) {
- const Name *templArgName = templ->templateParameterAt(i)->name();
-
- if (templArgName && templArgName->identifier()) {
- const Identifier *templArgId = templArgName->identifier();
- subst.append(qMakePair(templArgId, templArgTy));
- }
- }
- }
-
- DeprecatedGenTemplateInstance inst(control, subst);
- return inst.gen(candidate);
- }
- }
- }
- return candidate->type();
-}
diff --git a/src/libs/cplusplus/DeprecatedGenTemplateInstance.h b/src/libs/cplusplus/DeprecatedGenTemplateInstance.h
deleted file mode 100644
index 9e488478c6..0000000000
--- a/src/libs/cplusplus/DeprecatedGenTemplateInstance.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms and
-** conditions see http://www.qt.io/terms-conditions. For further information
-** use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-****************************************************************************/
-
-#ifndef CPLUSPLUS_DEPRECATEDGENTEMPLATEINSTANCE_H
-#define CPLUSPLUS_DEPRECATEDGENTEMPLATEINSTANCE_H
-
-#include <cplusplus/TypeVisitor.h>
-#include <cplusplus/NameVisitor.h>
-#include <cplusplus/FullySpecifiedType.h>
-
-#include <QList>
-#include <QPair>
-#include <QSharedPointer>
-
-namespace CPlusPlus {
-
-class CPLUSPLUS_EXPORT DeprecatedGenTemplateInstance
-{
-public:
- typedef QList< QPair<const Identifier *, FullySpecifiedType> > Substitution;
-
-public:
- static FullySpecifiedType instantiate(const Name *className, Symbol *candidate, QSharedPointer<Control> control);
-
-private:
- DeprecatedGenTemplateInstance(QSharedPointer<Control> control, const Substitution &substitution);
- FullySpecifiedType gen(Symbol *symbol);
-
-private:
- QSharedPointer<Control> _control;
- const Substitution _substitution;
-};
-
-} // namespace CPlusPlus
-
-#endif // CPLUSPLUS_DEPRECATEDGENTEMPLATEINSTANCE_H
diff --git a/src/libs/cplusplus/Dumpers.cpp b/src/libs/cplusplus/Dumpers.cpp
index 230d17aaee..1ce4b9a658 100644
--- a/src/libs/cplusplus/Dumpers.cpp
+++ b/src/libs/cplusplus/Dumpers.cpp
@@ -105,8 +105,6 @@ QString CPlusPlus::toString(const ClassOrNamespace *binding, QString id)
QString result = QString::fromLatin1("%0: %1 symbols").arg(
id,
QString::number(binding->symbols().length()));
- if (binding->templateId())
- result.append(QString::fromLatin1("\n%1").arg(indent(toString(binding->templateId(), QLatin1String("Template")))));
return result;
}
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 51e59c2ac3..317c511444 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -32,7 +32,6 @@
#include "ResolveExpression.h"
#include "Overview.h"
-#include "DeprecatedGenTemplateInstance.h"
#include "CppRewriter.h"
#include <cplusplus/CoreTypes.h>
@@ -399,7 +398,7 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
for (; scope; scope = scope->enclosingScope()) {
if (name->identifier() != 0 && scope->isBlock()) {
- bindings()->lookupInScope(name, scope, &candidates, /*templateId = */ 0, /*binding=*/ 0);
+ bindings()->lookupInScope(name, scope, &candidates);
if (! candidates.isEmpty()) {
// it's a local.
@@ -435,7 +434,7 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
}
} else if (Function *fun = scope->asFunction()) {
- bindings()->lookupInScope(name, fun, &candidates, /*templateId = */ 0, /*binding=*/ 0);
+ bindings()->lookupInScope(name, fun, &candidates);
if (! candidates.isEmpty()) {
// it's an argument or a template parameter.
@@ -462,13 +461,13 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
// continue, and look at the enclosing scope.
} else if (ObjCMethod *method = scope->asObjCMethod()) {
- bindings()->lookupInScope(name, method, &candidates, /*templateId = */ 0, /*binding=*/ 0);
+ bindings()->lookupInScope(name, method, &candidates);
if (! candidates.isEmpty())
break; // it's a formal argument.
} else if (Template *templ = scope->asTemplate()) {
- bindings()->lookupInScope(name, templ, &candidates, /*templateId = */ 0, /*binding=*/ 0);
+ bindings()->lookupInScope(name, templ, &candidates);
if (! candidates.isEmpty()) {
// it's a template parameter.
@@ -555,7 +554,6 @@ ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *pa
: _factory(factory)
, _parent(parent)
, _scopeLookupCache(0)
- , _templateId(0)
, _instantiationOrigin(0)
, _rootClass(0)
, _name(0)
@@ -568,11 +566,6 @@ ClassOrNamespace::~ClassOrNamespace()
delete _scopeLookupCache;
}
-const TemplateNameId *ClassOrNamespace::templateId() const
-{
- return _templateId;
-}
-
ClassOrNamespace *ClassOrNamespace::instantiationOrigin() const
{
return _instantiationOrigin;
@@ -672,7 +665,7 @@ QList<LookupItem> ClassOrNamespace::lookup_helper(const Name *name, bool searchI
if (processedOwnParents.contains(binding))
break;
processedOwnParents.insert(binding);
- lookup_helper(name, binding, &result, &processed, /*templateId = */ 0);
+ lookup_helper(name, binding, &result, &processed);
binding = binding->_parent;
} while (searchInEnclosingScope && binding);
}
@@ -681,9 +674,8 @@ QList<LookupItem> ClassOrNamespace::lookup_helper(const Name *name, bool searchI
}
void ClassOrNamespace::lookup_helper(const Name *name, ClassOrNamespace *binding,
- QList<LookupItem> *result,
- QSet<ClassOrNamespace *> *processed,
- const TemplateNameId *templateId)
+ QList<LookupItem> *result,
+ QSet<ClassOrNamespace *> *processed)
{
if (binding && ! processed->contains(binding)) {
processed->insert(binding);
@@ -708,15 +700,15 @@ void ClassOrNamespace::lookup_helper(const Name *name, ClassOrNamespace *binding
}
}
}
- _factory->lookupInScope(name, scope, result, templateId, binding);
+ _factory->lookupInScope(name, scope, result, binding);
}
}
foreach (Enum *e, binding->unscopedEnums())
- _factory->lookupInScope(name, e, result, templateId, binding);
+ _factory->lookupInScope(name, e, result, binding);
foreach (ClassOrNamespace *u, binding->usings())
- lookup_helper(name, u, result, processed, binding->_templateId);
+ lookup_helper(name, u, result, processed);
Anonymouses::const_iterator cit = binding->_anonymouses.constBegin();
Anonymouses::const_iterator citEnd = binding->_anonymouses.constEnd();
@@ -724,14 +716,13 @@ void ClassOrNamespace::lookup_helper(const Name *name, ClassOrNamespace *binding
const AnonymousNameId *anonymousNameId = cit.key();
ClassOrNamespace *a = cit.value();
if (!binding->_declaredOrTypedefedAnonymouses.contains(anonymousNameId))
- lookup_helper(name, a, result, processed, binding->_templateId);
+ lookup_helper(name, a, result, processed);
}
}
}
void CreateBindings::lookupInScope(const Name *name, Scope *scope,
QList<LookupItem> *result,
- const TemplateNameId *templateId,
ClassOrNamespace *binding)
{
if (! name) {
@@ -782,11 +773,6 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
}
}
- if (templateId && (s->isDeclaration() || s->isFunction())) {
- FullySpecifiedType ty = DeprecatedGenTemplateInstance::instantiate(templateId, s, control());
- item.setType(ty); // override the type.
- }
-
// instantiate function template
if (name->isTemplateNameId() && s->isTemplate() && s->asTemplate()->declaration()
&& s->asTemplate()->declaration()->isFunction()) {
@@ -933,21 +919,6 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name,
if (ClassOrNamespace *e = nestedType(name, origin))
return e;
- if (_templateId) {
- if (_usings.size() == 1) {
- ClassOrNamespace *delegate = _usings.first();
-
- if (ClassOrNamespace *r = delegate->lookupType_helper(name,
- processed,
- /*searchInEnclosingScope = */ true,
- origin))
- return r;
- } else if (Q_UNLIKELY(debug)) {
- qWarning() << "expected one using declaration. Number of using declarations is:"
- << _usings.size();
- }
- }
-
foreach (ClassOrNamespace *u, usings()) {
if (ClassOrNamespace *r = u->lookupType_helper(name,
processed,
@@ -1159,7 +1130,6 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
ClassOrNamespace *instantiation = _factory->allocClassOrNamespace(baseTemplateClassReference);
if (Q_UNLIKELY(debug))
instantiation->_name = templId;
- instantiation->_templateId = templId;
while (!origin->_symbols.isEmpty() && origin->_symbols[0]->isBlock())
origin = origin->parent();
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 7eeff11614..d81dcc960b 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -71,7 +71,6 @@ class CPLUSPLUS_EXPORT ClassOrNamespace
public:
~ClassOrNamespace();
- const TemplateNameId *templateId() const;
ClassOrNamespace *instantiationOrigin() const;
ClassOrNamespace *parent() const;
@@ -118,8 +117,7 @@ private:
void lookup_helper(const Name *name, ClassOrNamespace *binding,
QList<LookupItem> *result,
- QSet<ClassOrNamespace *> *processed,
- const TemplateNameId *templateId);
+ QSet<ClassOrNamespace *> *processed);
ClassOrNamespace *lookupType_helper(const Name *name, QSet<ClassOrNamespace *> *processed,
bool searchInEnclosingScope, ClassOrNamespace *origin);
@@ -149,7 +147,6 @@ private:
QHash<Internal::FullyQualifiedName, Symbol *> *_scopeLookupCache;
// it's an instantiation.
- const TemplateNameId *_templateId;
ClassOrNamespace *_instantiationOrigin;
AlreadyConsideredClassContainer<Class> _alreadyConsideredClasses;
@@ -195,7 +192,7 @@ public:
/// Store the result in \a results.
/// \internal
void lookupInScope(const Name *name, Scope *scope, QList<LookupItem> *result,
- const TemplateNameId *templateId, ClassOrNamespace *binding);
+ ClassOrNamespace *binding = 0);
/// Create bindings for the symbols reachable from \a rootSymbol.
/// \internal
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index e38d634b8c..d80036b74d 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -32,7 +32,6 @@
#include "LookupContext.h"
#include "Overview.h"
-#include "DeprecatedGenTemplateInstance.h"
#include "CppRewriter.h"
#include "TypeOfExpression.h"
#include "TypeResolver.h"
@@ -493,14 +492,12 @@ bool ResolveExpression::visit(UnaryExpressionAST *ast)
Symbol *overload = r.declaration();
if (Function *funTy = overload->type()->asFunctionType()) {
if (maybeValidPrototype(funTy, 0)) {
- if (Function *proto = instantiate(b->templateId(), funTy)->asFunctionType()) {
- FullySpecifiedType retTy = proto->returnType().simplified();
- p.setType(retTy);
- p.setScope(proto->enclosingScope());
- it.setValue(p);
- added = true;
- break;
- }
+ FullySpecifiedType retTy = funTy->returnType().simplified();
+ p.setType(retTy);
+ p.setScope(funTy->enclosingScope());
+ it.setValue(p);
+ added = true;
+ break;
}
}
}
@@ -753,10 +750,8 @@ bool ResolveExpression::visit(CallAST *ast)
foreach (const LookupItem &r, b->find(functionCallOp)) {
Symbol *overload = r.declaration();
if (Function *funTy = overload->type()->asFunctionType()) {
- if (maybeValidPrototype(funTy, actualArgumentCount)) {
- if (Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType())
- addResult(proto->returnType().simplified(), scope);
- }
+ if (maybeValidPrototype(funTy, actualArgumentCount))
+ addResult(funTy->returnType().simplified(), scope);
}
}
}
@@ -806,9 +801,8 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
foreach (const LookupItem &r, b->find(arrayAccessOp)) {
Symbol *overload = r.declaration();
if (Function *funTy = overload->type()->asFunctionType()) {
- if (Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType())
- // ### TODO: check the actual arguments
- addResult(proto->returnType().simplified(), scope);
+ // ### TODO: check the actual arguments
+ addResult(funTy->returnType().simplified(), scope);
}
}
@@ -967,14 +961,8 @@ ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &bas
continue;
Scope *functionScope = overload->enclosingScope();
- if (overload->type()->isFunctionType()) {
- FullySpecifiedType overloadTy
- = instantiate(binding->templateId(), overload);
- Function *instantiatedFunction = overloadTy->asFunctionType();
- Q_ASSERT(instantiatedFunction != 0);
-
- FullySpecifiedType retTy
- = instantiatedFunction->returnType().simplified();
+ if (Function *funTy = overload->type()->asFunctionType()) {
+ FullySpecifiedType retTy = funTy->returnType().simplified();
typeResolver.resolve(&retTy, &functionScope, r.binding());
@@ -1052,12 +1040,6 @@ ClassOrNamespace *ResolveExpression::findClassForTemplateParameterInExpressionSc
return 0;
}
-FullySpecifiedType ResolveExpression::instantiate(const Name *className, Symbol *candidate) const
-{
- return DeprecatedGenTemplateInstance::instantiate(className, candidate,
- _context.bindings()->control());
-}
-
bool ResolveExpression::visit(PostIncrDecrAST *ast)
{
const QList<LookupItem> baseResults = resolve(ast->base_expression, _scope);
diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h
index aee53c40fa..1fa15ffded 100644
--- a/src/libs/cplusplus/ResolveExpression.h
+++ b/src/libs/cplusplus/ResolveExpression.h
@@ -66,7 +66,6 @@ protected:
QList<LookupItem> expression(ExpressionAST *ast);
QList<LookupItem> switchResults(const QList<LookupItem> &symbols);
- FullySpecifiedType instantiate(const Name *className, Symbol *candidate) const;
QList<LookupItem> getMembers(ClassOrNamespace *binding, const Name *memberName) const;
diff --git a/src/libs/cplusplus/cplusplus-lib.pri b/src/libs/cplusplus/cplusplus-lib.pri
index f58256e4d6..7a9e7318bd 100644
--- a/src/libs/cplusplus/cplusplus-lib.pri
+++ b/src/libs/cplusplus/cplusplus-lib.pri
@@ -45,7 +45,6 @@ HEADERS += \
$$PWD/ASTPath.h \
$$PWD/SnapshotSymbolVisitor.h \
$$PWD/SymbolNameVisitor.h \
- $$PWD/DeprecatedGenTemplateInstance.h \
$$PWD/FindUsages.h \
$$PWD/DependencyTable.h \
$$PWD/PreprocessorClient.h \
@@ -77,7 +76,6 @@ SOURCES += \
$$PWD/ASTPath.cpp \
$$PWD/SnapshotSymbolVisitor.cpp \
$$PWD/SymbolNameVisitor.cpp \
- $$PWD/DeprecatedGenTemplateInstance.cpp \
$$PWD/FindUsages.cpp \
$$PWD/DependencyTable.cpp \
$$PWD/PreprocessorClient.cpp \
diff --git a/src/libs/cplusplus/cplusplus.qbs b/src/libs/cplusplus/cplusplus.qbs
index 9891aeb4ab..37b1a7c980 100644
--- a/src/libs/cplusplus/cplusplus.qbs
+++ b/src/libs/cplusplus/cplusplus.qbs
@@ -97,7 +97,6 @@ QtcLibrary {
"CppRewriter.cpp", "CppRewriter.h",
"cppmodelmanagerbase.cpp", "cppmodelmanagerbase.h",
"DependencyTable.cpp", "DependencyTable.h",
- "DeprecatedGenTemplateInstance.cpp", "DeprecatedGenTemplateInstance.h",
"ExpressionUnderCursor.cpp", "ExpressionUnderCursor.h",
"FastPreprocessor.cpp", "FastPreprocessor.h",
"FindUsages.cpp", "FindUsages.h",
diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp
index 2011f03e00..5ed6ed916c 100644
--- a/tests/auto/cplusplus/semantic/tst_semantic.cpp
+++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp
@@ -38,7 +38,6 @@
#include <cplusplus/Bind.h>
#include <cplusplus/Control.h>
#include <cplusplus/CoreTypes.h>
-#include <cplusplus/DeprecatedGenTemplateInstance.h>
#include <cplusplus/DiagnosticClient.h>
#include <cplusplus/ExpressionUnderCursor.h>
#include <cplusplus/Literals.h>
@@ -48,6 +47,7 @@
#include <cplusplus/Parser.h>
#include <cplusplus/Scope.h>
#include <cplusplus/Symbols.h>
+#include <cplusplus/Templates.h>
//TESTED_COMPONENT=src/libs/cplusplus
@@ -511,14 +511,15 @@ void tst_Semantic::template_instance_1()
QVERIFY(decl);
FullySpecifiedType templArgs[] = { control->integerType(IntegerType::Int) };
- const Name *templId = control->templateNameId(control->identifier("QList"), false, templArgs, 1);
-
- FullySpecifiedType genTy = DeprecatedGenTemplateInstance::instantiate(templId, decl, control);
+ Clone cloner(control.data());
+ Class *clone = cloner.instantiate(templ, templArgs, 1)->asClass();
+ QVERIFY(clone);
Overview oo;
oo.showReturnTypes = true;
- const QString genDecl = oo.prettyType(genTy);
+ Declaration *clonedDecl = clone->memberAt(0)->asDeclaration();
+ const QString genDecl = oo.prettyType(clonedDecl->type());
QCOMPARE(genDecl, QString::fromLatin1("void (const int &)"));
}