diff options
author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2013-05-16 10:20:36 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-05-24 11:43:52 +0200 |
commit | 783ec18424289301bdf598e9a19dfb55f0847be9 (patch) | |
tree | 52bd3d0bf351404f974bcfd8677739083ec1fb0e /src/libs/cplusplus/LookupContext.cpp | |
parent | bddaab248bce70b8aac2e91fc67c3d70a94eab2f (diff) | |
download | qt-creator-783ec18424289301bdf598e9a19dfb55f0847be9.tar.gz |
C++: instantiate template functions
Task-number: QTCREATORBUG-9170
Change-Id: I4cac9124558c1d4f0722192246f3fbeea61d3d7d
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r-- | src/libs/cplusplus/LookupContext.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 086c4dc7c8..fdcd0e286f 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -692,6 +692,16 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope, item.setType(ty); // override the type. } + // instantiate function template + if (name->isTemplateNameId() && s->isTemplate() && s->asTemplate()->declaration() + && s->asTemplate()->declaration()->isFunction()) { + const TemplateNameId *instantiation = name->asTemplateNameId(); + Template *specialization = s->asTemplate(); + Symbol *instantiatedFunctionTemplate = instantiateTemplateFunction(instantiation, + specialization); + item.setType(instantiatedFunctionTemplate->type()); // override the type. + } + result->append(item); } } @@ -1603,3 +1613,29 @@ bool CreateBindings::visit(ObjCMethod *) return false; } +Symbol *CreateBindings::instantiateTemplateFunction(const TemplateNameId *instantiation, + Template *specialization) const +{ + const unsigned argumentCountOfInitialization = instantiation->templateArgumentCount(); + const unsigned argumentCountOfSpecialization = specialization->templateParameterCount(); + + Clone cloner(_control.data()); + Subst subst(_control.data()); + for (unsigned i = 0; i < argumentCountOfSpecialization; ++i) { + const TypenameArgument *tParam + = specialization->templateParameterAt(i)->asTypenameArgument(); + if (!tParam) + continue; + const Name *name = tParam->name(); + if (!name) + continue; + + FullySpecifiedType ty = (i < argumentCountOfInitialization) ? + instantiation->templateArgumentAt(i): + cloner.type(tParam->type(), &subst); + + subst.bind(cloner.name(name, &subst), ty); + } + return cloner.symbol(specialization, &subst); +} + |