// RUN: clang-cc -triple x86_64-apple-darwin10 -fnext-runtime -fobjc-gc -emit-llvm -o %t %s && // RUN: grep -F '@objc_assign_global' %t | count 26 && // RUN: true @class NSObject; typedef const struct __CFDictionary * CFDictionaryRef; typedef struct { id element; id elementArray[10]; __strong CFDictionaryRef cfElement; __strong CFDictionaryRef cfElementArray[10]; } struct_with_ids_t; // assignments to these should generate objc_assign_global @interface A @end typedef struct s0 { A *a[4]; } T; T g0; extern id FileExternID; static id FileStaticID; id GlobalId; id GlobalArray[20]; NSObject *GlobalObject; NSObject *GlobalObjectArray[20]; __strong CFDictionaryRef Gdict; __strong CFDictionaryRef Gdictarray[10]; struct_with_ids_t GlobalStruct; struct_with_ids_t GlobalStructArray[10]; #define ASSIGNTEST(expr, global) expr = rhs void *rhs = 0; int main() { static id staticGlobalId; static id staticGlobalArray[20]; static NSObject *staticGlobalObject; static NSObject *staticGlobalObjectArray[20]; static __strong CFDictionaryRef staticGdict; static __strong CFDictionaryRef staticGdictarray[10]; static struct_with_ids_t staticGlobalStruct; static struct_with_ids_t staticGlobalStructArray[10]; extern id ExID; id localID; ASSIGNTEST(GlobalId, GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalObject, GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalObjectArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(Gdict, GlobalAssigns); // objc_assign_global ASSIGNTEST(Gdictarray[1], GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalStruct.element, GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalStruct.cfElement, GlobalAssigns); // objc_assign_global ASSIGNTEST(GlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalId, GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalObject, GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalObjectArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGdict, GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGdictarray[1], GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalStruct.element, GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalStruct.elementArray[0], GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalStruct.cfElement, GlobalAssigns); // objc_assign_global ASSIGNTEST(staticGlobalStruct.cfElementArray[0], GlobalAssigns); // objc_assign_global ExID = 0; localID = 0; FileStaticID = 0; FileExternID=0; g0.a[0] = 0; ((T*) &g0)->a[0] = 0; }