| // RUN: clang-cc -fnext-runtime -fobjc-gc -fobjc-newgc-api -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; |
| } |
| |