зеркало из https://github.com/microsoft/clang-1.git
When declaring a function template, create a FunctionTemplateDecl node
and associate it with the FunctionDecl. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74028 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e41590d250
Коммит
c5c903acd8
|
@ -2157,6 +2157,26 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
|
|||
// from the semantic context.
|
||||
NewFD->setLexicalDeclContext(CurContext);
|
||||
|
||||
// If there is a template parameter list, then we are dealing with a
|
||||
// template declaration or specialization.
|
||||
FunctionTemplateDecl *FunctionTemplate = 0;
|
||||
if (TemplateParamLists.size()) {
|
||||
// FIXME: member templates!
|
||||
TemplateParameterList *TemplateParams
|
||||
= static_cast<TemplateParameterList *>(*TemplateParamLists.release());
|
||||
|
||||
if (TemplateParams->size() > 0) {
|
||||
// This is a function template
|
||||
FunctionTemplate = FunctionTemplateDecl::Create(Context, CurContext,
|
||||
NewFD->getLocation(),
|
||||
Name, TemplateParams,
|
||||
NewFD);
|
||||
NewFD->setDescribedFunctionTemplate(FunctionTemplate);
|
||||
} else {
|
||||
// FIXME: Handle function template specializations
|
||||
}
|
||||
}
|
||||
|
||||
// C++ [dcl.fct.spec]p5:
|
||||
// The virtual specifier shall only be used in declarations of
|
||||
// nonstatic class member functions that appear within a
|
||||
|
|
|
@ -67,9 +67,10 @@ TemplateNameKind Sema::isTemplateName(const IdentifierInfo &II, Scope *S,
|
|||
}
|
||||
}
|
||||
|
||||
// FIXME: What follows is a gross hack.
|
||||
// FIXME: What follows is a slightly less gross hack than what used to
|
||||
// follow.
|
||||
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(IIDecl)) {
|
||||
if (FD->getType()->isDependentType()) {
|
||||
if (FD->getDescribedFunctionTemplate()) {
|
||||
TemplateResult = TemplateTy::make(FD);
|
||||
return TNK_Function_template;
|
||||
}
|
||||
|
@ -78,7 +79,7 @@ TemplateNameKind Sema::isTemplateName(const IdentifierInfo &II, Scope *S,
|
|||
for (OverloadedFunctionDecl::function_iterator F = Ovl->function_begin(),
|
||||
FEnd = Ovl->function_end();
|
||||
F != FEnd; ++F) {
|
||||
if ((*F)->getType()->isDependentType()) {
|
||||
if ((*F)->getDescribedFunctionTemplate()) {
|
||||
TemplateResult = TemplateTy::make(Ovl);
|
||||
return TNK_Function_template;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче