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);