[cfe-commits] r77472 - /cfe/trunk/lib/Sema/SemaTemplate.cpp
Douglas Gregor
dgregor at apple.com
Wed Jul 29 09:56:49 PDT 2009
Author: dgregor
Date: Wed Jul 29 11:56:42 2009
New Revision: 77472
URL: http://llvm.org/viewvc/llvm-project?rev=77472&view=rev
Log:
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.
Modified:
cfe/trunk/lib/Sema/SemaTemplate.cpp
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=77472&r1=77471&r2=77472&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Jul 29 11:56:42 2009
@@ -65,18 +65,44 @@
TNK = TNK_Type_template;
}
}
- }
-
- // FIXME: What follows is a slightly less gross hack than what used to
- // follow.
- if (OverloadedFunctionDecl *Ovl
- = dyn_cast<OverloadedFunctionDecl>(IIDecl)) {
+ } 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);
- return TNK_Function_template;
+ 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;
}
}
}
More information about the cfe-commits
mailing list