diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-02-22 18:40:18 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-02-22 18:40:18 +0000 |
commit | 0773533b27d40fa9f68be97ab7c737a5dcd37930 (patch) | |
tree | 7a4d93463135d61b3af3283f1f317c5772c92160 /clang/lib/AST/Expr.cpp | |
parent | 648c5e9c9928c55a89eb4a71f20cb065686e07ed (diff) | |
download | bcm5719-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.cpp | 27 |
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)) |