1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -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 4 // RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -fobjc-gc -emit-llvm -o %t %s 5 // RUN: grep -F '@objc_assign_global' %t | count 21 6 // RUN: grep -F '@objc_assign_ivar' %t | count 11 7 8 9 typedef const struct __CFDictionary * CFDictionaryRef; 10 11 // callouts to these are generated with cc -fobjc-gc 12 13 int GlobalAssigns; 14 int IvarAssigns; 15 int StrongCastAssigns; 16 17 18 // The test case elements; 19 @class NSObject; 20 @class NSString; 21 22 typedef 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 @public 31 // assignments to any/all of these fields should generate objc_assign_ivar 32 __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 @end 42 43 // assignments to these should generate objc_assign_global 44 id GlobalId; 45 id GlobalArray[20]; 46 NSObject *GlobalObject; 47 NSObject *GlobalObjectArray[20]; 48 __strong CFDictionaryRef Gdict; 49 __strong CFDictionaryRef Gdictarray[10]; 50 struct_with_ids_t GlobalStruct; 51 struct_with_ids_t GlobalStructArray[10]; 52 53 54 // The test cases 55 void* rhs = 0; 56 57 #define ASSIGNTEST(expr, global) expr = (typeof(expr))rhs 58 59 int testGlobals() { 60 // Everything in this function generates assign_global intercepts 61 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_global 73 ASSIGNTEST(GlobalArray[0], GlobalAssigns); // objc_assign_global 74 ASSIGNTEST(GlobalObject, GlobalAssigns); // objc_assign_global 75 ASSIGNTEST(GlobalObjectArray[0], GlobalAssigns); // objc_assign_global 76 ASSIGNTEST(Gdict, GlobalAssigns); // objc_assign_global 77 ASSIGNTEST(Gdictarray[1], GlobalAssigns); // objc_assign_global 78 79 ASSIGNTEST(GlobalStruct.element, GlobalAssigns); // objc_assign_global 80 ASSIGNTEST(GlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global 81 ASSIGNTEST(GlobalStruct.cfElement, GlobalAssigns); // objc_assign_global 82 ASSIGNTEST(GlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global 83 84 ASSIGNTEST(staticGlobalId, GlobalAssigns); // objc_assign_global 85 ASSIGNTEST(staticGlobalArray[0], GlobalAssigns); // objc_assign_global 86 ASSIGNTEST(staticGlobalObject, GlobalAssigns); // objc_assign_global 87 ASSIGNTEST(staticGlobalObjectArray[0], GlobalAssigns); // objc_assign_global 88 ASSIGNTEST(staticGdict, GlobalAssigns); // objc_assign_global 89 ASSIGNTEST(staticGdictarray[1], GlobalAssigns); // objc_assign_global 90 91 ASSIGNTEST(staticGlobalStruct.element, GlobalAssigns); // objc_assign_global 92 ASSIGNTEST(staticGlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global 93 ASSIGNTEST(staticGlobalStruct.cfElement, GlobalAssigns); // objc_assign_global 94 ASSIGNTEST(staticGlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global 95 96 return counter; 97 } 98 99 100 int testIvars() { 101 Foo *foo; 102 int counter = 0; 103 104 ASSIGNTEST(foo->ivar, IvarAssigns); // objc_assign_ivar 105 ASSIGNTEST(foo->dict, IvarAssigns); // objc_assign_ivar 106 ASSIGNTEST(foo->dictArray[0], IvarAssigns); // objc_assign_ivar 107 ASSIGNTEST(foo->array[0], IvarAssigns); // objc_assign_ivar 108 ASSIGNTEST(foo->nsobject, IvarAssigns); // objc_assign_ivar 109 ASSIGNTEST(foo->stringArray[0], IvarAssigns); // objc_assign_ivar 110 ASSIGNTEST(foo->inner.element, IvarAssigns); // objc_assign_ivar 111 ASSIGNTEST(foo->inner.elementArray[0], IvarAssigns); // objc_assign_ivar 112 ASSIGNTEST(foo->inner.cfElement, IvarAssigns); // objc_assign_ivar 113 ASSIGNTEST(foo->inner.cfElementArray[0], IvarAssigns); // objc_assign_ivar 114 115 return counter; 116 } 117