зеркало из https://github.com/microsoft/clang-1.git
Teach Sema how to instantiate a local function declaration properly. Fixes
PR 5517. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95470 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
2d565b3068
Коммит
68b6b87b6b
|
@ -738,9 +738,14 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
|
|||
if (T.isNull())
|
||||
return 0;
|
||||
|
||||
// Build the instantiated method declaration.
|
||||
DeclContext *DC = SemaRef.FindInstantiatedContext(D->getDeclContext(),
|
||||
TemplateArgs);
|
||||
// If we're instantiating a local function declaration, put the result
|
||||
// in the owner; otherwise we need to find the instantiated context.
|
||||
DeclContext *DC;
|
||||
if (D->getDeclContext()->isFunctionOrMethod())
|
||||
DC = Owner;
|
||||
else
|
||||
DC = SemaRef.FindInstantiatedContext(D->getDeclContext(), TemplateArgs);
|
||||
|
||||
FunctionDecl *Function =
|
||||
FunctionDecl::Create(SemaRef.Context, DC, D->getLocation(),
|
||||
D->getDeclName(), T, D->getTypeSourceInfo(),
|
||||
|
|
|
@ -87,3 +87,11 @@ struct smart_ptr {
|
|||
void test_smart_ptr(smart_ptr<int> p) {
|
||||
if (p) { }
|
||||
}
|
||||
|
||||
// PR5517
|
||||
namespace test0 {
|
||||
template <int K> struct X {
|
||||
X() { extern void x(); }
|
||||
};
|
||||
void g() { X<2>(); }
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче