| // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o %t %s |
| // RUN: grep -F '@objc_assign_global' %t | count 7 |
| // RUN: grep -F '@objc_assign_ivar' %t | count 5 |
| // RUN: grep -F '@objc_assign_strongCast' %t | count 8 |
| |
| extern id **somefunc(void); |
| extern id *somefunc2(void); |
| |
| |
| // Globals |
| |
| id W, *X, **Y; |
| |
| void func(id a, id *b, id **c) { |
| static id w, *x, **y; |
| W = a; |
| w = a; |
| X = b; |
| x = b; |
| Y = c; |
| y = c; |
| } |
| |
| // Instances |
| |
| @interface something { |
| id w, *x, **y; |
| } |
| @end |
| |
| @implementation something |
| - (void)amethod { |
| id badIdea = *somefunc2(); |
| w = badIdea; |
| x = &badIdea; |
| y = &x; |
| } |
| @end |
| |
| typedef struct { |
| int junk; |
| id alfred; |
| } AStruct; |
| |
| void funct2(AStruct *aptr) { |
| id **ppptr = somefunc(); |
| aptr->alfred = 0; |
| **ppptr = aptr->alfred; |
| *ppptr = somefunc2(); |
| } |
| |
| typedef const struct __CFString * CFStringRef; |
| @interface DSATextSearch { |
| __strong CFStringRef *_documentNames; |
| struct { |
| id *innerNames; |
| struct { |
| id *nestedDeeperNames; |
| struct I { |
| id *is1; |
| id is2[5]; |
| } arrI [3]; |
| } inner_most; |
| } inner; |
| |
| } |
| - filter; |
| @end |
| @implementation DSATextSearch |
| - filter { |
| int filteredPos = 0; |
| _documentNames[filteredPos] = 0; // storing into an element of array ivar. objc_assign_strongCast is needed. |
| inner.innerNames[filteredPos] = 0; |
| inner.inner_most.nestedDeeperNames[filteredPos] = 0; |
| inner.inner_most.arrI[3].is1[5] = 0; |
| inner.inner_most.arrI[3].is2[5] = 0; |
| } |
| @end |
| |