Introduce ObjCMessageExpr::getReceiverRange() to get the source range of the receiver.
[clang.git] / test / CodeGenObjC / objc-assign-ivar.m
blobaefe97d0f2a7d7eb0362ed3ee0d1324ceb5a25d4
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o %t %s
2 // RUN: grep -F '@objc_assign_ivar' %t  | count 14
4 typedef struct {
5   id  element;
6   id elementArray[10];
7   __strong id cfElement;
8   __strong id cfElementArray[10];
9 } struct_with_ids_t;
12 @interface NSString @end
14 @interface Foo  {
15 @public
16 // assignments to any/all of these fields should generate objc_assign_ivar
17   __strong id dict;
18   __strong id dictArray[3];
19   id ivar;
20   id array[10];
21   id nsobject;
22   NSString *stringArray[10];
23   struct_with_ids_t inner;
25   Foo *obj[20];
26   short idx[5];
28 @end
30 // The test cases
31 int IvarAssigns;
32 void *rhs = 0;
33 #define ASSIGNTEST(expr, global) expr = rhs
35 void testIvars() {
36   Foo *foo;
37   ASSIGNTEST(foo->ivar, IvarAssigns);                                   // objc_assign_ivar
38   ASSIGNTEST(foo->dict, IvarAssigns);                                   // objc_assign_ivar
39   ASSIGNTEST(foo->dictArray[0], IvarAssigns);                           // objc_assign_ivar
40   ASSIGNTEST(foo->array[0], IvarAssigns);                               // objc_assign_ivar
41   ASSIGNTEST(foo->nsobject, IvarAssigns);                               // objc_assign_ivar
42   ASSIGNTEST(foo->stringArray[0], IvarAssigns);                         // objc_assign_ivar
43   ASSIGNTEST(foo->inner.element, IvarAssigns);                          // objc_assign_ivar
44   ASSIGNTEST(foo->inner.elementArray[0], IvarAssigns);                  // objc_assign_ivar
45   ASSIGNTEST(foo->inner.cfElement, IvarAssigns);                        // objc_assign_ivar
46   ASSIGNTEST(foo->inner.cfElementArray[0], IvarAssigns);                // objc_assign_ivar
47   int counter=1;
48   ASSIGNTEST(foo->obj[5], IvarAssigns);                 // objc_assign_ivar
49   ASSIGNTEST(foo->obj[++counter], IvarAssigns);         // objc_assign_ivar
50   foo->idx[++counter] = 15;
51   ASSIGNTEST(foo->obj[foo->idx[2]], IvarAssigns);       // objc_assign_ivar