When lookup of an identifier preceding a '<' finds a set of overloaded

functions, only return those overloaded functions that are actually
function templates. Note that there is still a glaring problem with
treating an OverloadedFunctionDecl as a TemplateName.

llvm-svn: 77472
This commit is contained in:
Douglas Gregor 2009-07-29 16:56:42 +00:00
parent a6d0436b97
commit b142c2d0a8
1 changed files with 35 additions and 9 deletions

View File

@ -65,19 +65,45 @@ TemplateNameKind Sema::isTemplateName(const IdentifierInfo &II, Scope *S,
TNK = TNK_Type_template;
}
}
}
// FIXME: What follows is a slightly less gross hack than what used to
// follow.
if (OverloadedFunctionDecl *Ovl
} else if (OverloadedFunctionDecl *Ovl
= dyn_cast<OverloadedFunctionDecl>(IIDecl)) {
for (OverloadedFunctionDecl::function_iterator F = Ovl->function_begin(),
FEnd = Ovl->function_end();
F != FEnd; ++F) {
if (isa<FunctionTemplateDecl>(*F)) {
TemplateResult = TemplateTy::make(Ovl);
if (FunctionTemplateDecl *FuncTmpl
= dyn_cast<FunctionTemplateDecl>(*F)) {
// We've found a function template. Determine whether there are
// any other function templates we need to bundle together in an
// OverloadedFunctionDecl
for (++F; F != FEnd; ++F) {
if (isa<FunctionTemplateDecl>(*F))
break;
}
if (F != FEnd) {
// Build an overloaded function decl containing only the
// function templates in Ovl.
OverloadedFunctionDecl *OvlTemplate
= OverloadedFunctionDecl::Create(Context,
Ovl->getDeclContext(),
Ovl->getDeclName());
OvlTemplate->addOverload(FuncTmpl);
OvlTemplate->addOverload(*F);
for (++F; F != FEnd; ++F) {
if (isa<FunctionTemplateDecl>(*F))
OvlTemplate->addOverload(*F);
}
// FIXME: HACK! We need TemplateName to be able to refer to
// sets of overloaded function templates.
TemplateResult = TemplateTy::make(OvlTemplate);
return TNK_Function_template;
}
TNK = TNK_Function_template;
Template = FuncTmpl;
break;
}
}
}