1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck -check-prefix CHECK-LP64 %s 2// RUN: %clang_cc1 -triple i386-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck -check-prefix CHECK-LP32 %s 3 4typedef struct objc_class *Class; 5 6typedef struct objc_object { 7 Class isa; 8} *id; 9 10@interface I 11+ (Class) class; 12- (void)meth : (id)object : (id)src_object; 13+ (unsigned char) isSubclassOfClass:(Class)aClass ; 14@end 15 16@implementation I 17+ (Class) class {return 0;} 18+ (unsigned char) isSubclassOfClass:(Class)aClass {return 0;} 19- (void)meth : (id)object : (id)src_object { 20 [object->isa isSubclassOfClass:[I class]]; 21 22 [(*object).isa isSubclassOfClass:[I class]]; 23 24 object->isa = src_object->isa; 25 (*src_object).isa = (*object).isa; 26} 27@end 28 29 30static Class MyClass; 31 32Class Test(const void *inObject1) { 33 if(((id)inObject1)->isa == MyClass) 34 return ((id)inObject1)->isa; 35 return (id)0; 36} 37 38@interface Foo { 39@public 40 id isa; 41} 42+(id)method; 43@end 44 45id Test2(void) { 46 if([Foo method]->isa) 47 return (*[Foo method]).isa; 48 return [Foo method]->isa; 49} 50 51@interface Cat {} 52@end 53 54@interface SuperCat : Cat {} 55+(void)geneticallyAlterCat:(Cat *)cat; 56@end 57 58@implementation SuperCat 59+ (void)geneticallyAlterCat:(Cat *)cat { 60 Class dynamicSubclass; 61 ((id)cat)->isa = dynamicSubclass; 62} 63@end 64// CHECK-LP64: %{{.*}} = load ptr, ptr % 65// CHECK-NEXT: store ptr %{{.*}}, ptr %{{.*}} 66 67// CHECK-LP32: %{{.*}} = load ptr, ptr % 68// CHECK-NEXT: store ptr %{{.*}}, ptr %{{.*}} 69