117 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -fobjc-gc -emit-llvm -o %t %s2// RUN: grep -F '@objc_assign_global' %t | count 213// RUN: grep -F '@objc_assign_ivar' %t | count 114// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -fobjc-gc -emit-llvm -o %t %s5// RUN: grep -F '@objc_assign_global' %t | count 216// RUN: grep -F '@objc_assign_ivar' %t | count 117 8 9typedef const struct __CFDictionary * CFDictionaryRef;10 11// callouts to these are generated with cc -fobjc-gc12 13int GlobalAssigns;14int IvarAssigns;15int StrongCastAssigns;16 17 18// The test case elements;19@class NSObject;20@class NSString;21 22typedef struct {23 id element;24 id elementArray[10];25 __strong CFDictionaryRef cfElement;26 __strong CFDictionaryRef cfElementArray[10];27} struct_with_ids_t;28 29@interface Foo {30@public31// assignments to any/all of these fields should generate objc_assign_ivar32 __strong CFDictionaryRef dict;33 __strong CFDictionaryRef dictArray[3];34 id ivar;35 id array[10];36 NSObject *nsobject;37 NSString *stringArray[10];38 struct_with_ids_t inner;39}40 41@end42 43// assignments to these should generate objc_assign_global44id GlobalId;45id GlobalArray[20];46NSObject *GlobalObject;47NSObject *GlobalObjectArray[20];48__strong CFDictionaryRef Gdict;49__strong CFDictionaryRef Gdictarray[10];50struct_with_ids_t GlobalStruct;51struct_with_ids_t GlobalStructArray[10];52 53 54// The test cases55void* rhs = 0;56 57#define ASSIGNTEST(expr, global) expr = (typeof(expr))rhs58 59int testGlobals(void) {60 // Everything in this function generates assign_global intercepts61 int counter = 0;62 63 static id staticGlobalId;64 static id staticGlobalArray[20];65 static NSObject *staticGlobalObject;66 static NSObject *staticGlobalObjectArray[20];67 static __strong CFDictionaryRef staticGdict;68 static __strong CFDictionaryRef staticGdictarray[10];69 static struct_with_ids_t staticGlobalStruct;70 static struct_with_ids_t staticGlobalStructArray[10];71 72 ASSIGNTEST(GlobalId, GlobalAssigns); // objc_assign_global73 ASSIGNTEST(GlobalArray[0], GlobalAssigns); // objc_assign_global74 ASSIGNTEST(GlobalObject, GlobalAssigns); // objc_assign_global75 ASSIGNTEST(GlobalObjectArray[0], GlobalAssigns); // objc_assign_global76 ASSIGNTEST(Gdict, GlobalAssigns); // objc_assign_global77 ASSIGNTEST(Gdictarray[1], GlobalAssigns); // objc_assign_global78 79 ASSIGNTEST(GlobalStruct.element, GlobalAssigns); // objc_assign_global80 ASSIGNTEST(GlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global81 ASSIGNTEST(GlobalStruct.cfElement, GlobalAssigns); // objc_assign_global82 ASSIGNTEST(GlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global83 84 ASSIGNTEST(staticGlobalId, GlobalAssigns); // objc_assign_global85 ASSIGNTEST(staticGlobalArray[0], GlobalAssigns); // objc_assign_global86 ASSIGNTEST(staticGlobalObject, GlobalAssigns); // objc_assign_global87 ASSIGNTEST(staticGlobalObjectArray[0], GlobalAssigns); // objc_assign_global88 ASSIGNTEST(staticGdict, GlobalAssigns); // objc_assign_global89 ASSIGNTEST(staticGdictarray[1], GlobalAssigns); // objc_assign_global90 91 ASSIGNTEST(staticGlobalStruct.element, GlobalAssigns); // objc_assign_global92 ASSIGNTEST(staticGlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global93 ASSIGNTEST(staticGlobalStruct.cfElement, GlobalAssigns); // objc_assign_global94 ASSIGNTEST(staticGlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global95 96 return counter;97}98 99 100int testIvars(void) {101 Foo *foo;102 int counter = 0;103 104 ASSIGNTEST(foo->ivar, IvarAssigns); // objc_assign_ivar105 ASSIGNTEST(foo->dict, IvarAssigns); // objc_assign_ivar106 ASSIGNTEST(foo->dictArray[0], IvarAssigns); // objc_assign_ivar107 ASSIGNTEST(foo->array[0], IvarAssigns); // objc_assign_ivar108 ASSIGNTEST(foo->nsobject, IvarAssigns); // objc_assign_ivar109 ASSIGNTEST(foo->stringArray[0], IvarAssigns); // objc_assign_ivar110 ASSIGNTEST(foo->inner.element, IvarAssigns); // objc_assign_ivar111 ASSIGNTEST(foo->inner.elementArray[0], IvarAssigns); // objc_assign_ivar112 ASSIGNTEST(foo->inner.cfElement, IvarAssigns); // objc_assign_ivar113 ASSIGNTEST(foo->inner.cfElementArray[0], IvarAssigns); // objc_assign_ivar114 115 return counter;116}117