From: Fariborz Jahanian Date: Tue, 5 May 2009 23:28:21 +0000 (+0000) Subject: Fixes a bug for objc2's gc in the presense of type-casts. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06b89124a9a5971a0528cc9da6817740bac43164;p=clang Fixes a bug for objc2's gc in the presense of type-casts. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71041 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 13d2a1be3f..77a25f6fc0 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -935,6 +935,8 @@ bool Expr::isOBJCGCCandidate() const { return cast(this)->getSubExpr()->isOBJCGCCandidate(); case ImplicitCastExprClass: return cast(this)->getSubExpr()->isOBJCGCCandidate(); + case CStyleCastExprClass: + return cast(this)->getSubExpr()->isOBJCGCCandidate(); case DeclRefExprClass: case QualifiedDeclRefExprClass: { const Decl *D = cast(this)->getDecl(); @@ -944,7 +946,7 @@ bool Expr::isOBJCGCCandidate() const { } case MemberExprClass: { const MemberExpr *M = cast(this); - return !M->isArrow() && M->getBase()->isOBJCGCCandidate(); + return M->getBase()->isOBJCGCCandidate(); } case ArraySubscriptExprClass: return cast(this)->getBase()->isOBJCGCCandidate(); diff --git a/test/CodeGenObjC/objc2-strong-cast-2.m b/test/CodeGenObjC/objc2-strong-cast-2.m new file mode 100644 index 0000000000..61e9b98017 --- /dev/null +++ b/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; +} +