blob: 9a5416d8466f81ac103e0d830725e42c8b0803aa [file] [log] [blame]
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00001// RUN: clang-cc -triple x86_64-apple-darwin10 -fnext-runtime -fobjc-gc -emit-llvm -o %t %s
2// RUN: grep -F '@objc_assign_global' %t | count 21
3// RUN: grep -F '@objc_assign_ivar' %t | count 11
Fariborz Jahanianb9e28fa2009-09-16 23:30:59 +00004
5
6typedef const struct __CFDictionary * CFDictionaryRef;
7
8// callouts to these are generated with cc -fobjc-gc
9
10int GlobalAssigns;
11int IvarAssigns;
12int StrongCastAssigns;
13
14
15// The test case elements;
16@class NSObject;
17@class NSString;
18
19typedef struct {
20 id element;
21 id elementArray[10];
22 __strong CFDictionaryRef cfElement;
23 __strong CFDictionaryRef cfElementArray[10];
24} struct_with_ids_t;
25
26@interface Foo {
27@public
28// assignments to any/all of these fields should generate objc_assign_ivar
29 __strong CFDictionaryRef dict;
30 __strong CFDictionaryRef dictArray[3];
31 id ivar;
32 id array[10];
33 NSObject *nsobject;
34 NSString *stringArray[10];
35 struct_with_ids_t inner;
36}
37
38@end
39
40// assignments to these should generate objc_assign_global
41id GlobalId;
42id GlobalArray[20];
43NSObject *GlobalObject;
44NSObject *GlobalObjectArray[20];
45__strong CFDictionaryRef Gdict;
46__strong CFDictionaryRef Gdictarray[10];
47struct_with_ids_t GlobalStruct;
48struct_with_ids_t GlobalStructArray[10];
49
50
51// The test cases
52void *rhs = 0;
53
54#define ASSIGNTEST(expr, global) expr = rhs
55
56int testGlobals() {
57 // Everything in this function generates assign_global intercepts
58 int counter = 0;
59
60 static id staticGlobalId;
61 static id staticGlobalArray[20];
62 static NSObject *staticGlobalObject;
63 static NSObject *staticGlobalObjectArray[20];
64 static __strong CFDictionaryRef staticGdict;
65 static __strong CFDictionaryRef staticGdictarray[10];
66 static struct_with_ids_t staticGlobalStruct;
67 static struct_with_ids_t staticGlobalStructArray[10];
68
69 ASSIGNTEST(GlobalId, GlobalAssigns); // objc_assign_global
70 ASSIGNTEST(GlobalArray[0], GlobalAssigns); // objc_assign_global
71 ASSIGNTEST(GlobalObject, GlobalAssigns); // objc_assign_global
72 ASSIGNTEST(GlobalObjectArray[0], GlobalAssigns); // objc_assign_global
73 ASSIGNTEST(Gdict, GlobalAssigns); // objc_assign_global
74 ASSIGNTEST(Gdictarray[1], GlobalAssigns); // objc_assign_global
75
76 ASSIGNTEST(GlobalStruct.element, GlobalAssigns); // objc_assign_global
77 ASSIGNTEST(GlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global
78 ASSIGNTEST(GlobalStruct.cfElement, GlobalAssigns); // objc_assign_global
79 ASSIGNTEST(GlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global
80
81 ASSIGNTEST(staticGlobalId, GlobalAssigns); // objc_assign_global
82 ASSIGNTEST(staticGlobalArray[0], GlobalAssigns); // objc_assign_global
83 ASSIGNTEST(staticGlobalObject, GlobalAssigns); // objc_assign_global
84 ASSIGNTEST(staticGlobalObjectArray[0], GlobalAssigns); // objc_assign_global
85 ASSIGNTEST(staticGdict, GlobalAssigns); // objc_assign_global
86 ASSIGNTEST(staticGdictarray[1], GlobalAssigns); // objc_assign_global
87
88 ASSIGNTEST(staticGlobalStruct.element, GlobalAssigns); // objc_assign_global
89 ASSIGNTEST(staticGlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global
90 ASSIGNTEST(staticGlobalStruct.cfElement, GlobalAssigns); // objc_assign_global
91 ASSIGNTEST(staticGlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global
Daniel Dunbar501d8a62009-09-17 07:21:40 +000092
Fariborz Jahanianb9e28fa2009-09-16 23:30:59 +000093 return counter;
94}
95
96
97int testIvars() {
98 Foo *foo;
99 int counter = 0;
100
101 ASSIGNTEST(foo->ivar, IvarAssigns); // objc_assign_ivar
102 ASSIGNTEST(foo->dict, IvarAssigns); // objc_assign_ivar
103 ASSIGNTEST(foo->dictArray[0], IvarAssigns); // objc_assign_ivar
104 ASSIGNTEST(foo->array[0], IvarAssigns); // objc_assign_ivar
105 ASSIGNTEST(foo->nsobject, IvarAssigns); // objc_assign_ivar
106 ASSIGNTEST(foo->stringArray[0], IvarAssigns); // objc_assign_ivar
107 ASSIGNTEST(foo->inner.element, IvarAssigns); // objc_assign_ivar
108 ASSIGNTEST(foo->inner.elementArray[0], IvarAssigns); // objc_assign_ivar
109 ASSIGNTEST(foo->inner.cfElement, IvarAssigns); // objc_assign_ivar
110 ASSIGNTEST(foo->inner.cfElementArray[0], IvarAssigns); // objc_assign_ivar
111
112 return counter;
113}