From: Anders Carlsson Date: Fri, 15 May 2009 20:26:03 +0000 (+0000) Subject: Instantiation support for 'this' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0712d29123215e00b9e5b3c89746c90d9624830f;p=clang Instantiation support for 'this' git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71886 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 3926397dc2..c2007c6e3b 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -47,6 +47,7 @@ namespace { OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E); OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E); + OwningExprResult VisitCXXThisExpr(CXXThisExpr *E); // Base case. I'm supposed to ignore this. Sema::OwningExprResult VisitStmt(Stmt *S) { @@ -418,6 +419,17 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr( return SemaRef.Owned(ICE); } +Sema::OwningExprResult +TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) { + QualType ThisType = + cast(SemaRef.CurContext)->getThisType(SemaRef.Context); + + CXXThisExpr *TE = + new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType); + + return SemaRef.Owned(TE); +} + Sema::OwningExprResult Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) { TemplateExprInstantiator Instantiator(*this, TemplateArgs); diff --git a/test/SemaTemplate/instantiate-function-1.cpp b/test/SemaTemplate/instantiate-function-1.cpp index 5ded6140a6..51de6bca38 100644 --- a/test/SemaTemplate/instantiate-function-1.cpp +++ b/test/SemaTemplate/instantiate-function-1.cpp @@ -75,3 +75,11 @@ struct ConvertibleToInt { template struct X6; template struct X6; // expected-note{{instantiation}} + +template struct X7 { + void f() { + void *v = this; + } +}; + +template struct X7;