]> granicus.if.org Git - clang/commitdiff
Instantiation support for 'this'
authorAnders Carlsson <andersca@mac.com>
Fri, 15 May 2009 20:26:03 +0000 (20:26 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 15 May 2009 20:26:03 +0000 (20:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71886 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateInstantiateExpr.cpp
test/SemaTemplate/instantiate-function-1.cpp

index 3926397dc2fdbd618b9cbf3ba19f7b6ebb7ae50e..c2007c6e3b36b2c4945637658bea2bf133aa4c05 100644 (file)
@@ -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<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);
index 5ded6140a637e14581899ea0bd3373b1b1d4d3e2..51de6bca38dc7ddfe58db7f9fdb60b2860566735 100644 (file)
@@ -75,3 +75,11 @@ struct ConvertibleToInt {
 
 template struct X6<ConvertibleToInt, float, char>;
 template struct X6<bool, int, int*>; // expected-note{{instantiation}}
+
+template <typename T> struct X7 {
+  void f() {
+    void *v = this;
+  }
+};
+
+template struct X7<int>;