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 | |
4 | typedef struct objc_class *Class; |
5 | |
6 | typedef 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 |
31 | static Class MyClass; |
32 | |
33 | Class 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 | |
47 | id 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*, i8** % |
68 | // CHECK-NEXT: %{{.*}} = bitcast i8* %{{.*}} to i8** |
69 | // CHECK-NEXT: store i8* %{{.*}}, i8** %{{.*}} |
70 | |
71 | // CHECK-LP32: %{{.*}} = load i8*, i8** % |
72 | // CHECK-NEXT: %{{.*}} = bitcast i8* %{{.*}} to i8** |
73 | // CHECK-NEXT: store i8* %{{.*}}, i8** %{{.*}} |
74 | |