diff options
-rw-r--r-- | test/CodeGenObjC/objc2-write-barrier-2.m | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/test/CodeGenObjC/objc2-write-barrier-2.m b/test/CodeGenObjC/objc2-write-barrier-2.m new file mode 100644 index 0000000000..a3f4124e86 --- /dev/null +++ b/test/CodeGenObjC/objc2-write-barrier-2.m @@ -0,0 +1,52 @@ +// RUN: clang-cc -fnext-runtime -fobjc-gc -fobjc-newgc-api -emit-llvm -o %t %s && +// RUN: grep -F '@objc_assign_global' %t | count 7 && +// RUN: grep -F '@objc_assign_ivar' %t | count 4 && +// RUN: grep -F '@objc_assign_strongCast' %t | count 4 && +// RUN: true + +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; /* { dg-warning "global\\/static variable assignment" } */ + w = a; /* { dg-warning "global\\/static variable assignment" } */ + X = b; /* { dg-warning "global\\/static variable assignment" } */ + x = b; /* { dg-warning "global\\/static variable assignment" } */ + Y = c; /* { dg-warning "global\\/static variable assignment" } */ + y = c; /* { dg-warning "global\\/static variable assignment" } */ +} + +// Instances + +@interface something { + id w, *x, **y; +} +@end + +@implementation something +- (void)amethod { + id badIdea = *somefunc2(); + w = badIdea; /* { dg-warning "instance variable assignment" } */ + x = &badIdea; /* { dg-warning "instance variable assignment" } */ + y = &x; /* { dg-warning "instance variable assignment" } */ +} +@end + +typedef struct { + int junk; + id alfred; +} AStruct; + +void funct2(AStruct *aptr) { + id **ppptr = somefunc(); + aptr->alfred = 0; /* { dg-warning "strong\\-cast assignment" } */ + **ppptr = aptr->alfred; /* { dg-warning "strong\\-cast assignment" } */ + *ppptr = somefunc2(); /* { dg-warning "strong\\-cast assignment" } */ +} + |