1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck -check-prefix LP64 %s 2// RUN: %clang_cc1 -triple i386-apple-darwin9 -emit-llvm -o - %s | FileCheck -check-prefix 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 30// rdar 7470820 31static Class MyClass; 32 33Class Test(const void *inObject1) { 34 if(((id)inObject1)->isa == MyClass) 35 return ((id)inObject1)->isa; 36 return (id)0; 37} 38 39// rdar 7609722 40@interface Foo { 41@public 42 id isa; 43} 44+(id)method; 45@end 46 47id Test2() { 48 if([Foo method]->isa) 49 return (*[Foo method]).isa; 50 return [Foo method]->isa; 51} 52 53// rdar 7709015 54@interface Cat {} 55@end 56 57@interface SuperCat : Cat {} 58+(void)geneticallyAlterCat:(Cat *)cat; 59@end 60 61@implementation SuperCat 62+ (void)geneticallyAlterCat:(Cat *)cat { 63 Class dynamicSubclass; 64 ((id)cat)->isa = dynamicSubclass; 65} 66@end 67// CHECK-LP64: %{{.*}} = load i8** % 68// CHECK-NEXT: %{{.*}} = bitcast i8* %{{.*}} to i8** 69// CHECK-NEXT: store i8* %{{.*}}, i8** %{{.*}} 70 71// CHECK-LP32: %{{.*}} = load i8** % 72// CHECK-NEXT: %{{.*}} = bitcast i8* %{{.*}} to i8** 73// CHECK-NEXT: store i8* %{{.*}}, i8** %{{.*}} 74