]> granicus.if.org Git - clang/commitdiff
Switch 'super' from being a weird cast thing to being a predefined expr node.
authorChris Lattner <sabre@nondot.org>
Sat, 21 Jun 2008 18:04:54 +0000 (18:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Jun 2008 18:04:54 +0000 (18:04 +0000)
Patch by David Chisnall with objc rewriter and stmtdumper updates from me.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52580 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteObjC.cpp
include/clang/AST/Expr.h
lib/AST/StmtDumper.cpp
lib/AST/StmtPrinter.cpp
lib/Sema/SemaExprObjC.cpp
test/Rewriter/objc-super-test.m

index 9a4657e522b297fa13f415867e7793ee4a1867ce..c369f0fcf666dbedc9d386df452c5c413976deaa 100644 (file)
@@ -1848,31 +1848,14 @@ ObjCInterfaceDecl *RewriteObjC::isSuperReceiver(Expr *recExpr) {
   // check if we are sending a message to 'super'
   if (!CurMethodDecl || !CurMethodDecl->isInstance()) return 0;
   
-  CastExpr *CE = dyn_cast<CastExpr>(recExpr);
-  if (!CE) return 0;
-  
-  DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr());
-  if (!DRE) return 0;
-  
-  ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl());
-  if (!PVD) return 0;
-  
-  if (strcmp(PVD->getName(), "self") != 0)
-    return 0;
-          
-  // is this id<P1..> type?
-  if (CE->getType()->isObjCQualifiedIdType())
-    return 0;
-  const PointerType *PT = CE->getType()->getAsPointerType();
-  if (!PT) return 0;
-  
-  ObjCInterfaceType *IT = dyn_cast<ObjCInterfaceType>(PT->getPointeeType());
-  if (!IT) return 0;
-  
-  if (IT->getDecl() != CurMethodDecl->getClassInterface()->getSuperClass())
-    return 0;
-              
-  return IT->getDecl();
+  if (PreDefinedExpr *PDE = dyn_cast<PreDefinedExpr>(recExpr))
+    if (PDE->getIdentType() == PreDefinedExpr::ObjCSuper) {
+      const PointerType *PT = PDE->getType()->getAsPointerType();
+      assert(PT);
+      ObjCInterfaceType *IT = cast<ObjCInterfaceType>(PT->getPointeeType());
+      return IT->getDecl();
+    }
+  return 0;
 }
 
 // struct objc_super { struct objc_object *receiver; struct objc_class *super; };
index e5fd7521eee9e22f1fcdb3229d2aae7372e987f5..ccd20befede8649622ef5789c7fad0d3053f83ad 100644 (file)
@@ -222,7 +222,10 @@ public:
   enum IdentType {
     Func,
     Function,
-    PrettyFunction
+    PrettyFunction,
+    ObjCSelf, // self
+    ObjCCmd,  // _cmd
+    ObjCSuper // super
   };
   
 private:
index 6a65fbbf897825730ae9193b4d314ee1cdad8e42..c8f72602ef2b2b99a947a80ed6226bd1a6cea58c 100644 (file)
@@ -311,17 +311,13 @@ void StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
 void StmtDumper::VisitPreDefinedExpr(PreDefinedExpr *Node) {
   DumpExpr(Node);
   switch (Node->getIdentType()) {
-  default:
-    assert(0 && "unknown case");
-  case PreDefinedExpr::Func:
-    fprintf(F, " __func__");
-    break;
-  case PreDefinedExpr::Function:
-    fprintf(F, " __FUNCTION__");
-    break;
-  case PreDefinedExpr::PrettyFunction:
-    fprintf(F, " __PRETTY_FUNCTION__");
-    break;
+  default: assert(0 && "unknown case");
+  case PreDefinedExpr::Func:           fprintf(F, " __func__"); break;
+  case PreDefinedExpr::Function:       fprintf(F, " __FUNCTION__"); break;
+  case PreDefinedExpr::PrettyFunction: fprintf(F, " __PRETTY_FUNCTION__");break;
+  case PreDefinedExpr::ObjCSelf:       fprintf(F, "self"); break;
+  case PreDefinedExpr::ObjCCmd:        fprintf(F, "_cmd"); break;
+  case PreDefinedExpr::ObjCSuper:      fprintf(F, "super"); break;
   }
 }
 
index dc686f9bf59688d2b03624147ac66fc91dcf23d6..53f31028be3f32604696799c80a08dedd21d090a 100644 (file)
@@ -509,6 +509,9 @@ void StmtPrinter::VisitPreDefinedExpr(PreDefinedExpr *Node) {
     case PreDefinedExpr::PrettyFunction:
       OS << "__PRETTY_FUNCTION__";
       break;
+    case PreDefinedExpr::ObjCSuper:
+      OS << "super";
+      break;
   }
 }
 
index 1f21ee0ec57cab21c53263365f81ade2c0a483c5..920457e00c6af4fd2b507b80a52f8c327114f08f 100644 (file)
@@ -149,14 +149,10 @@ Sema::ExprResult Sema::ActOnClassMessage(
       return Diag(lbrac, diag::error_no_super_class,
                   CurMethodDecl->getClassInterface()->getName());
     if (CurMethodDecl->isInstance()) {
-      // Synthesize a cast to the super class. This hack allows us to loosely
-      // represent super without creating a special expression node.
-      IdentifierInfo &II = Context.Idents.get("self");
-      ExprResult ReceiverExpr = ActOnIdentifierExpr(S, lbrac, II, false);
       QualType superTy = Context.getObjCInterfaceType(ClassDecl);
       superTy = Context.getPointerType(superTy);
-      ReceiverExpr = ActOnCastExpr(SourceLocation(), superTy.getAsOpaquePtr(),
-                                   SourceLocation(), ReceiverExpr.Val);
+      ExprResult ReceiverExpr = new PreDefinedExpr(SourceLocation(), superTy,
+          PreDefinedExpr::ObjCSuper);
       // We are really in an instance method, redirect.
       return ActOnInstanceMessage(ReceiverExpr.Val, Sel, lbrac, rbrac,
                                   Args, NumArgs);
index 298248519d26203813998d7236bd09b48f21bff8..fc74843e8dfeb67d0bf73f33e88f239060edb85a 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -rewrite-objc %s -o=-
+// RUN: clang -rewrite-objc %s -o - | grep objc_msgSendSuper | grep MainMethod
 
 @interface SUPER
 - (int) MainMethod;