diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-08 23:38:54 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-08 23:38:54 +0000 |
commit | 7f4f86a2167abc116275e49c81350fc3225485e5 (patch) | |
tree | a238134fc0c9ef5f9b61a8431c9578917dd88bc6 | |
parent | 7ef7f133dee7c2d5cfc97a9f6aa6dbc45435cb7b (diff) |
More objc GC's API work for array of pointers declared
as __strong.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81283 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/Expr.cpp | 9 | ||||
-rw-r--r-- | test/CodeGenObjC/objc2-strong-cast-4.m | 20 |
2 files changed, 19 insertions, 10 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 7171c79c44..013a9418f1 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1092,7 +1092,7 @@ Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const { } /// isOBJCGCCandidate - Check if an expression is objc gc'able. -/// +/// returns true, if it is; false otherwise. bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { switch (getStmtClass()) { default: @@ -1114,11 +1114,8 @@ bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { if (VD->hasGlobalStorage()) return true; QualType T = VD->getType(); - // dereferencing to an object pointer is always a gc'able candidate - if (T->isPointerType() && - T->getAs<PointerType>()->getPointeeType()->isObjCObjectPointerType()) - return true; - + // dereferencing to a pointer is always a gc'able candidate + return T->isPointerType(); } return false; } diff --git a/test/CodeGenObjC/objc2-strong-cast-4.m b/test/CodeGenObjC/objc2-strong-cast-4.m index e351f48477..350b2b0bed 100644 --- a/test/CodeGenObjC/objc2-strong-cast-4.m +++ b/test/CodeGenObjC/objc2-strong-cast-4.m @@ -1,5 +1,5 @@ // RUN: clang-cc -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o %t %s && -// RUN: grep objc_assign_strongCast %t | count 3 && +// RUN: grep objc_assign_strongCast %t | count 7 && // RUN: true struct Slice { @@ -10,14 +10,26 @@ typedef struct Slice Slice; @interface ISlice { @public - void *__strong * items; + void *__strong * IvarItem; } @end -void foo () { +void foo (int i) { + // storing into an array of strong pointer types. + void *__strong* items; + items[i] = 0; + + // storing indirectly into an array of strong pointer types. + void *__strong* *vitems; + *vitems[i] = 0; + Slice *slice; slice->items = 0; + // storing into a struct element of an array of strong pointer types. + slice->items[i] = 0; ISlice *islice; - islice->items = 0; + islice->IvarItem = 0; + // Storing into an ivar of an array of strong pointer types. + islice->IvarItem[i] = (void*)0; } |