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