зеркало из https://github.com/microsoft/clang-1.git
When instantiating a function template declaration that was expressed
via a typedef of a function, make sure to synthesize parameter declarations. Fixes PR9654 / <rdar://problem/9257497>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133628 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
7bf952e601
Коммит
1d441ee69a
|
@ -1090,9 +1090,26 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
|
|||
Function->setLexicalDeclContext(LexicalDC);
|
||||
|
||||
// Attach the parameters
|
||||
for (unsigned P = 0; P < Params.size(); ++P)
|
||||
if (Params[P])
|
||||
Params[P]->setOwningFunction(Function);
|
||||
if (isa<FunctionProtoType>(Function->getType())) {
|
||||
// Adopt the already-instantiated parameters into our own context.
|
||||
for (unsigned P = 0; P < Params.size(); ++P)
|
||||
if (Params[P])
|
||||
Params[P]->setOwningFunction(Function);
|
||||
} else {
|
||||
// Since we were instantiated via a typedef of a function type, create
|
||||
// new parameters.
|
||||
const FunctionProtoType *Proto
|
||||
= Function->getType()->getAs<FunctionProtoType>();
|
||||
assert(Proto && "No function prototype in template instantiation?");
|
||||
for (FunctionProtoType::arg_type_iterator AI = Proto->arg_type_begin(),
|
||||
AE = Proto->arg_type_end(); AI != AE; ++AI) {
|
||||
ParmVarDecl *Param
|
||||
= SemaRef.BuildParmVarDeclForTypedef(Function, Function->getLocation(),
|
||||
*AI);
|
||||
Param->setScopeInfo(0, Params.size());
|
||||
Params.push_back(Param);
|
||||
}
|
||||
}
|
||||
Function->setParams(Params.data(), Params.size());
|
||||
|
||||
SourceLocation InstantiateAtPOI;
|
||||
|
|
|
@ -31,3 +31,14 @@ namespace UsedAttr {
|
|||
foo<int>(); // expected-note{{instantiation of}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace PR9654 {
|
||||
typedef void ftype(int);
|
||||
|
||||
template<typename T>
|
||||
ftype f;
|
||||
|
||||
void g() {
|
||||
f<int>(0);
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче