summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-02-22 18:40:18 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-02-22 18:40:18 +0000
commit0773533b27d40fa9f68be97ab7c737a5dcd37930 (patch)
tree7a4d93463135d61b3af3283f1f317c5772c92160 /clang/lib/AST/Expr.cpp
parent648c5e9c9928c55a89eb4a71f20cb065686e07ed (diff)
downloadbcm5719-llvm-0773533b27d40fa9f68be97ab7c737a5dcd37930.tar.gz
bcm5719-llvm-0773533b27d40fa9f68be97ab7c737a5dcd37930.zip
More objc gc work. Match gcc's treatment of ivar access
true a local pointer to objective-c object in generating write barriers. llvm-svn: 65290
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r--clang/lib/AST/Expr.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index f27419c0a24..a621119daef 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -745,6 +745,33 @@ bool Expr::hasGlobalStorage() const {
}
}
+/// isOBJCGCCandidate - Check if an expression is objc gc'able.
+///
+bool Expr::isOBJCGCCandidate() const {
+ switch (getStmtClass()) {
+ default:
+ return false;
+ case ObjCIvarRefExprClass:
+ return true;
+ case ParenExprClass:
+ return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate();
+ case ImplicitCastExprClass:
+ return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate();
+ case DeclRefExprClass:
+ case QualifiedDeclRefExprClass: {
+ const Decl *D = cast<DeclRefExpr>(this)->getDecl();
+ if (const VarDecl *VD = dyn_cast<VarDecl>(D))
+ return VD->hasGlobalStorage();
+ return false;
+ }
+ case MemberExprClass: {
+ const MemberExpr *M = cast<MemberExpr>(this);
+ return !M->isArrow() && M->getBase()->isOBJCGCCandidate();
+ }
+ case ArraySubscriptExprClass:
+ return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate();
+ }
+}
Expr* Expr::IgnoreParens() {
Expr* E = this;
while (ParenExpr* P = dyn_cast<ParenExpr>(E))
OpenPOWER on IntegriCloud