From: John McCall Date: Sat, 6 Feb 2010 01:50:47 +0000 (+0000) Subject: Teach Sema how to instantiate a local function declaration properly. Fixes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=68b6b87b6beb7922fc2c8ab923ba2ce125490363;p=clang 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 --- diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 66a8b1f1e6..244b5f511b 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -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(), diff --git a/test/SemaTemplate/instantiate-declref.cpp b/test/SemaTemplate/instantiate-declref.cpp index da8b263ab3..f883b9361b 100644 --- a/test/SemaTemplate/instantiate-declref.cpp +++ b/test/SemaTemplate/instantiate-declref.cpp @@ -87,3 +87,11 @@ struct smart_ptr { void test_smart_ptr(smart_ptr p) { if (p) { } } + +// PR5517 +namespace test0 { + template struct X { + X() { extern void x(); } + }; + void g() { X<2>(); } +}