xref: /aosp_15_r20/external/clang/test/CodeGenObjC/id-isa-codegen.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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