diff options
| -rw-r--r-- | clang/include/clang/AST/Type.h | 3 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/objc2-strong-cast-4.m | 23 |
2 files changed, 26 insertions, 0 deletions
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index f46227d85fa..4cebdcdf212 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -2235,6 +2235,9 @@ inline QualType::GCAttrTypes QualType::getObjCGCAttr() const { return EXTQT->getObjCGCAttr(); if (const ObjCObjectPointerType *PT = CT->getAsObjCObjectPointerType()) return PT->getPointeeType().getObjCGCAttr(); + // We most look at all pointer types, not just pointer to interface types. + if (const PointerType *PT = CT->getAs<PointerType>()) + return PT->getPointeeType().getObjCGCAttr(); return GCNone; } diff --git a/clang/test/CodeGenObjC/objc2-strong-cast-4.m b/clang/test/CodeGenObjC/objc2-strong-cast-4.m new file mode 100644 index 00000000000..e351f484770 --- /dev/null +++ b/clang/test/CodeGenObjC/objc2-strong-cast-4.m @@ -0,0 +1,23 @@ +// RUN: clang-cc -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o %t %s && +// RUN: grep objc_assign_strongCast %t | count 3 && +// RUN: true + +struct Slice { + void *__strong * items; +}; + +typedef struct Slice Slice; + +@interface ISlice { +@public + void *__strong * items; +} +@end + +void foo () { + Slice *slice; + slice->items = 0; + + ISlice *islice; + islice->items = 0; +} |

