xref: /aosp_15_r20/external/clang/test/CodeGenObjC/objc-assign-ivar.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -fobjc-gc -emit-llvm -o %t %s
2*67e74705SXin Li// RUN: grep -F '@objc_assign_ivar' %t  | count 14
3*67e74705SXin Li
4*67e74705SXin Litypedef struct {
5*67e74705SXin Li  id  element;
6*67e74705SXin Li  id elementArray[10];
7*67e74705SXin Li  __strong id cfElement;
8*67e74705SXin Li  __strong id cfElementArray[10];
9*67e74705SXin Li} struct_with_ids_t;
10*67e74705SXin Li
11*67e74705SXin Li
12*67e74705SXin Li@interface NSString @end
13*67e74705SXin Li
14*67e74705SXin Li@interface Foo  {
15*67e74705SXin Li@public
16*67e74705SXin Li// assignments to any/all of these fields should generate objc_assign_ivar
17*67e74705SXin Li  __strong id dict;
18*67e74705SXin Li  __strong id dictArray[3];
19*67e74705SXin Li  id ivar;
20*67e74705SXin Li  id array[10];
21*67e74705SXin Li  id nsobject;
22*67e74705SXin Li  NSString *stringArray[10];
23*67e74705SXin Li  struct_with_ids_t inner;
24*67e74705SXin Li
25*67e74705SXin Li  Foo *obj[20];
26*67e74705SXin Li  short idx[5];
27*67e74705SXin Li}
28*67e74705SXin Li@end
29*67e74705SXin Li
30*67e74705SXin Li// The test cases
31*67e74705SXin Liint IvarAssigns;
32*67e74705SXin Livoid *rhs = 0;
33*67e74705SXin Li#define ASSIGNTEST(expr, global) expr = rhs
34*67e74705SXin Li
35*67e74705SXin Livoid testIvars() {
36*67e74705SXin Li  Foo *foo;
37*67e74705SXin Li  ASSIGNTEST(foo->ivar, IvarAssigns);                                   // objc_assign_ivar
38*67e74705SXin Li  ASSIGNTEST(foo->dict, IvarAssigns);                                   // objc_assign_ivar
39*67e74705SXin Li  ASSIGNTEST(foo->dictArray[0], IvarAssigns);                           // objc_assign_ivar
40*67e74705SXin Li  ASSIGNTEST(foo->array[0], IvarAssigns);                               // objc_assign_ivar
41*67e74705SXin Li  ASSIGNTEST(foo->nsobject, IvarAssigns);                               // objc_assign_ivar
42*67e74705SXin Li  ASSIGNTEST(foo->stringArray[0], IvarAssigns);                         // objc_assign_ivar
43*67e74705SXin Li  ASSIGNTEST(foo->inner.element, IvarAssigns);                          // objc_assign_ivar
44*67e74705SXin Li  ASSIGNTEST(foo->inner.elementArray[0], IvarAssigns);                  // objc_assign_ivar
45*67e74705SXin Li  ASSIGNTEST(foo->inner.cfElement, IvarAssigns);                        // objc_assign_ivar
46*67e74705SXin Li  ASSIGNTEST(foo->inner.cfElementArray[0], IvarAssigns);                // objc_assign_ivar
47*67e74705SXin Li  int counter=1;
48*67e74705SXin Li  ASSIGNTEST(foo->obj[5], IvarAssigns);                 // objc_assign_ivar
49*67e74705SXin Li  ASSIGNTEST(foo->obj[++counter], IvarAssigns);         // objc_assign_ivar
50*67e74705SXin Li  foo->idx[++counter] = 15;
51*67e74705SXin Li  ASSIGNTEST(foo->obj[foo->idx[2]], IvarAssigns);       // objc_assign_ivar
52*67e74705SXin Li}
53