diff options
author | John McCall <rjmccall@apple.com> | 2010-02-06 01:50:47 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-02-06 01:50:47 +0000 |
commit | ce410662ce75f2b7dc6feb38300720b3d065e875 (patch) | |
tree | 50ccc076bd3be96d4ab0492a8f3b555d14ba11f1 /clang | |
parent | 827de51a4a5e0c3e5b9a97df45dd57239f737c9d (diff) | |
download | bcm5719-llvm-ce410662ce75f2b7dc6feb38300720b3d065e875.tar.gz bcm5719-llvm-ce410662ce75f2b7dc6feb38300720b3d065e875.zip |
Teach Sema how to instantiate a local function declaration properly. Fixes
PR 5517.
llvm-svn: 95470
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 11 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-declref.cpp | 8 |
2 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 66a8b1f1e61..244b5f511b8 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/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/clang/test/SemaTemplate/instantiate-declref.cpp b/clang/test/SemaTemplate/instantiate-declref.cpp index da8b263ab3a..f883b9361b6 100644 --- a/clang/test/SemaTemplate/instantiate-declref.cpp +++ b/clang/test/SemaTemplate/instantiate-declref.cpp @@ -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>(); } +} |