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:
parent
a6d0436b97
commit
b142c2d0a8
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue