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 3926397..c2007c6 100644
--- a/lib/Sema/SemaTemplateInstantiateExpr.cpp
+++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp
@@ -47,6 +47,7 @@
     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 @@
   return SemaRef.Owned(ICE);
 }
 
+Sema::OwningExprResult
+TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
+  QualType ThisType = 
+    cast<CXXMethodDecl>(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);