diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-05-05 23:28:21 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-05-05 23:28:21 +0000 |
| commit | a16904bc41dcda23a9af2ef26355b74958340b56 (patch) | |
| tree | df12539212883272beb12c3ee4b6285d1d876721 | |
| parent | a8106efce9555e43a58dc98a563c1b2ed44a5c42 (diff) | |
| download | bcm5719-llvm-a16904bc41dcda23a9af2ef26355b74958340b56.tar.gz bcm5719-llvm-a16904bc41dcda23a9af2ef26355b74958340b56.zip | |
Fixes a bug for objc2's gc in the presense of type-casts.
llvm-svn: 71041
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 4 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/objc2-strong-cast-2.m | 21 |
2 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 13d2a1be3f9..77a25f6fc0e 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -935,6 +935,8 @@ bool Expr::isOBJCGCCandidate() const { return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(); case ImplicitCastExprClass: return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(); + case CStyleCastExprClass: + return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(); case DeclRefExprClass: case QualifiedDeclRefExprClass: { const Decl *D = cast<DeclRefExpr>(this)->getDecl(); @@ -944,7 +946,7 @@ bool Expr::isOBJCGCCandidate() const { } case MemberExprClass: { const MemberExpr *M = cast<MemberExpr>(this); - return !M->isArrow() && M->getBase()->isOBJCGCCandidate(); + return M->getBase()->isOBJCGCCandidate(); } case ArraySubscriptExprClass: return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(); diff --git a/clang/test/CodeGenObjC/objc2-strong-cast-2.m b/clang/test/CodeGenObjC/objc2-strong-cast-2.m new file mode 100644 index 00000000000..61e9b980171 --- /dev/null +++ b/clang/test/CodeGenObjC/objc2-strong-cast-2.m @@ -0,0 +1,21 @@ +// RUN: clang-cc -triple x86_64-darwin-10 -fobjc-gc -emit-llvm -o %t %s && +// RUN: grep objc_assign_strongCast %t | count 3 && +// RUN: true + +@interface A +@end + +typedef struct s0 { + A *a[4]; +} T; + +T g0; + +void f0(id x) { + g0.a[0] = x; +} + +void f1(id x) { + ((T*) &g0)->a[0] = x; +} + |

