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:
John McCall 2010-02-06 01:50:47 +00:00
Родитель 2d565b3068
Коммит 68b6b87b6b
2 изменённых файлов: 16 добавлений и 3 удалений

Просмотреть файл

@ -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>(); }
}