summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-11-04 14:56:14 +0000
committerDouglas Gregor <dgregor@apple.com>2008-11-04 14:56:14 +0000
commit8ea1f53420c063e893c055ebeb6bac7da8fb8785 (patch)
tree024973249c4bc6b5be1b940a182a895393d66ce2 /clang/lib
parentc6a5b0979f5132b6553008c98d442b14b5fdc331 (diff)
downloadbcm5719-llvm-8ea1f53420c063e893c055ebeb6bac7da8fb8785.tar.gz
bcm5719-llvm-8ea1f53420c063e893c055ebeb6bac7da8fb8785.zip
Add a new expression class, ObjCSuperExpr, to handle the Objective-C 'super'. Remove ObjCThis from PredefinedExpr
llvm-svn: 58698
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/Expr.cpp4
-rw-r--r--clang/lib/AST/StmtDumper.cpp15
-rw-r--r--clang/lib/AST/StmtPrinter.cpp7
-rw-r--r--clang/lib/AST/StmtSerialization.cpp14
-rw-r--r--clang/lib/Analysis/CheckObjCDealloc.cpp4
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp11
-rw-r--r--clang/lib/CodeGen/CGObjC.cpp4
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.h1
-rw-r--r--clang/lib/Sema/SemaExpr.cpp2
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp3
10 files changed, 48 insertions, 17 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 171f7dbde2e..ce0856033d6 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -1311,6 +1311,10 @@ Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; }
Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; }
+// ObjCSuperExpr
+Stmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); }
+Stmt::child_iterator ObjCSuperExpr::child_end() { return child_iterator(); }
+
// PredefinedExpr
Stmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); }
Stmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); }
diff --git a/clang/lib/AST/StmtDumper.cpp b/clang/lib/AST/StmtDumper.cpp
index 349b6fb6e36..ecfdbf78d27 100644
--- a/clang/lib/AST/StmtDumper.cpp
+++ b/clang/lib/AST/StmtDumper.cpp
@@ -130,8 +130,9 @@ namespace {
// C++
void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
+ void VisitCXXThisExpr(CXXThisExpr *Node);
void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
-
+
// ObjC
void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
void VisitObjCMessageExpr(ObjCMessageExpr* Node);
@@ -139,6 +140,7 @@ namespace {
void VisitObjCProtocolExpr(ObjCProtocolExpr *Node);
void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node);
void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
+ void VisitObjCSuperExpr(ObjCSuperExpr *Node);
};
}
@@ -312,7 +314,6 @@ void StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
case PredefinedExpr::Func: fprintf(F, " __func__"); break;
case PredefinedExpr::Function: fprintf(F, " __FUNCTION__"); break;
case PredefinedExpr::PrettyFunction: fprintf(F, " __PRETTY_FUNCTION__");break;
- case PredefinedExpr::ObjCSuper: fprintf(F, "super"); break;
}
}
@@ -418,6 +419,11 @@ void StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
fprintf(F, " %s", Node->getValue() ? "true" : "false");
}
+void StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
+ DumpExpr(Node);
+ fprintf(F, " this");
+}
+
void StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
DumpExpr(Node);
fprintf(F, " functional cast to %s",
@@ -471,6 +477,11 @@ void StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
}
}
+void StmtDumper::VisitObjCSuperExpr(ObjCSuperExpr *Node) {
+ DumpExpr(Node);
+ fprintf(F, " super");
+}
+
//===----------------------------------------------------------------------===//
// Stmt method implementations
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index 34aefc2c4c2..420bdbdee90 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -515,9 +515,6 @@ void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
case PredefinedExpr::PrettyFunction:
OS << "__PRETTY_FUNCTION__";
break;
- case PredefinedExpr::ObjCSuper:
- OS << "super";
- break;
}
}
@@ -917,6 +914,10 @@ void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
OS << "]";
}
+void StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) {
+ OS << "super";
+}
+
void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
BlockDecl *BD = Node->getBlockDecl();
OS << "^";
diff --git a/clang/lib/AST/StmtSerialization.cpp b/clang/lib/AST/StmtSerialization.cpp
index aefaee38a42..09aaceffda4 100644
--- a/clang/lib/AST/StmtSerialization.cpp
+++ b/clang/lib/AST/StmtSerialization.cpp
@@ -191,6 +191,9 @@ Stmt* Stmt::Create(Deserializer& D, ASTContext& C) {
case ObjCStringLiteralClass:
return ObjCStringLiteral::CreateImpl(D, C);
+ case ObjCSuperExprClass:
+ return ObjCSuperExpr::CreateImpl(D, C);
+
//==--------------------------------------==//
// C++
//==--------------------------------------==//
@@ -1232,6 +1235,17 @@ ObjCStringLiteral* ObjCStringLiteral::CreateImpl(Deserializer& D, ASTContext& C)
return new ObjCStringLiteral(String,T,L);
}
+void ObjCSuperExpr::EmitImpl(llvm::Serializer& S) const {
+ S.Emit(getType());
+ S.Emit(Loc);
+}
+
+ObjCSuperExpr* ObjCSuperExpr::CreateImpl(llvm::Deserializer& D, ASTContext&) {
+ QualType Ty = QualType::ReadVal(D);
+ SourceLocation Loc = SourceLocation::ReadVal(D);
+ return new ObjCSuperExpr(Loc, Ty);
+}
+
//===----------------------------------------------------------------------===//
// Serialization for Clang Extensions.
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/Analysis/CheckObjCDealloc.cpp b/clang/lib/Analysis/CheckObjCDealloc.cpp
index e41c8271847..8628ff122cf 100644
--- a/clang/lib/Analysis/CheckObjCDealloc.cpp
+++ b/clang/lib/Analysis/CheckObjCDealloc.cpp
@@ -30,9 +30,7 @@ static bool scan_dealloc(Stmt* S, Selector Dealloc) {
if (ME->getSelector() == Dealloc)
if(ME->getReceiver())
if (Expr* Receiver = ME->getReceiver()->IgnoreParenCasts())
- if (PredefinedExpr* E = dyn_cast<PredefinedExpr>(Receiver))
- if (E->getIdentType() == PredefinedExpr::ObjCSuper)
- return true;
+ return isa<ObjCSuperExpr>(Receiver);
// Recurse to children.
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index fa70f47da92..3d8d192a2d8 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -130,7 +130,9 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
return EmitObjCIvarRefLValue(cast<ObjCIvarRefExpr>(E));
case Expr::ObjCPropertyRefExprClass:
return EmitObjCPropertyRefLValue(cast<ObjCPropertyRefExpr>(E));
-
+ case Expr::ObjCSuperExprClass:
+ return EmitObjCSuperExpr(cast<ObjCSuperExpr>(E));
+
case Expr::UnaryOperatorClass:
return EmitUnaryOpLValue(cast<UnaryOperator>(E));
case Expr::ArraySubscriptExprClass:
@@ -571,8 +573,6 @@ LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) {
case PredefinedExpr::Function:
case PredefinedExpr::PrettyFunction:
return EmitPredefinedFunctionName(E->getIdentType());
- case PredefinedExpr::ObjCSuper:
- return EmitUnsupportedLValue(E, "use of super");
}
}
@@ -875,6 +875,11 @@ CodeGenFunction::EmitObjCPropertyRefLValue(const ObjCPropertyRefExpr *E) {
return LValue::MakePropertyRef(E, E->getType().getCVRQualifiers());
}
+LValue
+CodeGenFunction::EmitObjCSuperExpr(const ObjCSuperExpr *E) {
+ return EmitUnsupportedLValue(E, "use of super");
+}
+
RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType FnType,
CallExpr::const_arg_iterator ArgBeg,
CallExpr::const_arg_iterator ArgEnd) {
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index c0260ad06b3..cb820409d67 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -72,9 +72,7 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) {
}
isClassMessage = true;
- } else if (isa<PredefinedExpr>(E->getReceiver())) {
- assert(cast<PredefinedExpr>(E->getReceiver())->getIdentType() ==
- PredefinedExpr::ObjCSuper);
+ } else if (isa<ObjCSuperExpr>(E->getReceiver())) {
isSuperMessage = true;
Receiver = LoadObjCSelf();
} else {
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index ccc5008aee1..e6636ba27b6 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -402,6 +402,7 @@ public:
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E);
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E);
LValue EmitObjCPropertyRefLValue(const ObjCPropertyRefExpr *E);
+ LValue EmitObjCSuperExpr(const ObjCSuperExpr *E);
//===--------------------------------------------------------------------===//
// Scalar Expression Emission
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index f06a04101b8..c0abc9e51ae 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -365,7 +365,7 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc,
if (SD == 0 && &II == SuperID) {
QualType T = Context.getPointerType(Context.getObjCInterfaceType(
getCurMethodDecl()->getClassInterface()));
- return new PredefinedExpr(Loc, T, PredefinedExpr::ObjCSuper);
+ return new ObjCSuperExpr(Loc, T);
}
}
if (D == 0) {
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index a474b7eee78..bc2f7f2d6f7 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -193,8 +193,7 @@ Sema::ExprResult Sema::ActOnClassMessage(
if (getCurMethodDecl()->isInstance()) {
QualType superTy = Context.getObjCInterfaceType(ClassDecl);
superTy = Context.getPointerType(superTy);
- ExprResult ReceiverExpr = new PredefinedExpr(SourceLocation(), superTy,
- PredefinedExpr::ObjCSuper);
+ ExprResult ReceiverExpr = new ObjCSuperExpr(SourceLocation(), superTy);
// We are really in an instance method, redirect.
return ActOnInstanceMessage(ReceiverExpr.Val, Sel, lbrac, rbrac,
Args, NumArgs);
OpenPOWER on IntegriCloud