Switch 'super' from being a weird cast thing to being a predefined expr node.
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
diff --git a/lib/AST/StmtDumper.cpp b/lib/AST/StmtDumper.cpp
index 6a65fbb..c8f7260 100644
--- a/lib/AST/StmtDumper.cpp
+++ b/lib/AST/StmtDumper.cpp
@@ -311,17 +311,13 @@
 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;
   }
 }
 
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index dc686f9..53f3102 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -509,6 +509,9 @@
     case PreDefinedExpr::PrettyFunction:
       OS << "__PRETTY_FUNCTION__";
       break;
+    case PreDefinedExpr::ObjCSuper:
+      OS << "super";
+      break;
   }
 }
 
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp
index 1f21ee0..920457e 100644
--- a/lib/Sema/SemaExprObjC.cpp
+++ b/lib/Sema/SemaExprObjC.cpp
@@ -149,14 +149,10 @@
       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);