// 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
// RUN: %clang_cc1 -x objective-c++ -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

