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