From 5ec178ff237d77e7acf5e747c19bf4f2de77a779 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 28 Aug 2009 21:09:48 +0000 Subject: [PATCH] Fix and test template instantiation for nested member templates. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80394 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplateInstantiateDecl.cpp | 7 ++++-- .../instantiate-member-template.cpp | 24 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 213855741c..732394d867 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -947,9 +947,12 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // Find the function body that we'll be substituting. const FunctionDecl *PatternDecl = 0; - if (FunctionTemplateDecl *Primary = Function->getPrimaryTemplate()) + if (FunctionTemplateDecl *Primary = Function->getPrimaryTemplate()) { + while (Primary->getInstantiatedFromMemberTemplate()) + Primary = Primary->getInstantiatedFromMemberTemplate(); + PatternDecl = Primary->getTemplatedDecl(); - else + } else PatternDecl = Function->getInstantiatedFromMemberFunction(); Stmt *Pattern = 0; if (PatternDecl) diff --git a/test/SemaTemplate/instantiate-member-template.cpp b/test/SemaTemplate/instantiate-member-template.cpp index be5665b989..d72028df8a 100644 --- a/test/SemaTemplate/instantiate-member-template.cpp +++ b/test/SemaTemplate/instantiate-member-template.cpp @@ -41,9 +41,22 @@ struct X1 { U z; // expected-error{{void}} }; }; + + template + struct Inner3 { + void f0(T t, U u) { + (void)(t + u); // expected-error{{invalid operands}} + } + + template + V f1(T t, U u, V) { + return t + u; // expected-error{{incompatible type}} + } + }; + }; -void test_X1() { +void test_X1(int *ip, int i, double *dp) { X1::Inner0 *xvip; // okay X1::Inner0 xvi; // expected-note{{instantiation}} @@ -52,4 +65,13 @@ void test_X1() { X1::Inner2::SuperInner *xisivp; // okay X1::Inner2::SuperInner xisiv; // expected-note{{instantiation}} + + X1::Inner3 id3; + id3.f0(ip, i); + id3.f0(dp, i); // expected-error{{incompatible type}} + id3.f1(ip, i, ip); + id3.f1(ip, i, dp); // expected-note{{instantiation}} + + X1::Inner3 id3b; + id3b.f0(ip, dp); // expected-note{{instantiation}} }