1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s |
2 | |
3 | // HECK: @[[PROTO_P1:"_OBJC_PROTOCOL_$_P1"]] = weak hidden |
4 | // CHECK: @[[PROTO_P1:"_OBJC_PROTOCOL_\$_P1"]] = weak hidden |
5 | // CHECK: @[[LABEL_PROTO_P1:"_OBJC_LABEL_PROTOCOL_\$_P1"]] = weak hidden global %{{.*}}* @[[PROTO_P1]] |
6 | // CHECK: @[[PROTO_P2:"_OBJC_PROTOCOL_\$_P2"]] = weak hidden |
7 | // CHECK: @[[LABEL_PROTO_P2:"_OBJC_LABEL_PROTOCOL_\$_P2"]] = weak hidden global %{{.*}}* @[[PROTO_P2]] |
8 | // CHECK: @"\01l_OBJC_$_PROTOCOL_REFS_P3" = private global { i64, [3 x %{{.*}}] } { i64 2, [3 x %{{.*}}*] [%{{.*}}* @[[PROTO_P1]], %{{.*}}* @[[PROTO_P2]], %{{.*}}* null] } |
9 | // CHECK: @[[PROTO_P3:"_OBJC_PROTOCOL_\$_P3"]] = weak hidden |
10 | // CHECK: @[[LABEL_PROTO_P3:"_OBJC_LABEL_PROTOCOL_\$_P3"]] = weak hidden global %{{.*}}* @[[PROTO_P3]] |
11 | // CHECK: "\01l_OBJC_PROTOCOL_REFERENCE_$_P3" = weak hidden global %{{.*}}* bitcast (%{{.*}}* @[[PROTO_P3]] to %{{.*}}*) |
12 | // CHECK: @[[PROTO_P0:"_OBJC_PROTOCOL_\$_P0"]] = weak hidden |
13 | // CHECK: @[[LABEL_PROTO_P0:"_OBJC_LABEL_PROTOCOL_\$_P0"]] = weak hidden global %{{.*}}* @[[PROTO_P0]] |
14 | // CHECK: "\01l_OBJC_PROTOCOL_REFERENCE_$_P0" = weak hidden global %0* bitcast (%{{.*}}* @[[PROTO_P0]] to %{{.*}}*) |
15 | // CHECK: "\01l_OBJC_PROTOCOL_REFERENCE_$_P1" = weak hidden global %0* bitcast (%{{.*}}* @[[PROTO_P1]] to %{{.*}}*) |
16 | // CHECK: "\01l_OBJC_PROTOCOL_REFERENCE_$_P2" = weak hidden global %0* bitcast (%{{.*}}* @[[PROTO_P2]] to %{{.*}}*) |
17 | |
18 | void p(const char*, ...); |
19 | |
20 | @interface Root |
21 | +(int) maxValue; |
22 | -(int) conformsTo: (id) x; |
23 | @end |
24 | |
25 | @protocol P0 |
26 | @end |
27 | |
28 | @protocol P1 |
29 | +(void) classMethodReq0; |
30 | -(void) methodReq0; |
31 | @optional |
32 | +(void) classMethodOpt1; |
33 | -(void) methodOpt1; |
34 | @required |
35 | +(void) classMethodReq2; |
36 | -(void) methodReq2; |
37 | @end |
38 | |
39 | @protocol P2 |
40 | //@property(readwrite) int x; |
41 | @end |
42 | |
43 | @protocol P3<P1, P2> |
44 | -(id <P1>) print0; |
45 | -(void) print1; |
46 | @end |
47 | |
48 | void foo(const id a) { |
49 | void *p = @protocol(P3); |
50 | } |
51 | |
52 | int main() { |
53 | Protocol *P0 = @protocol(P0); |
54 | Protocol *P1 = @protocol(P1); |
55 | Protocol *P2 = @protocol(P2); |
56 | Protocol *P3 = @protocol(P3); |
57 | |
58 | #define Pbool(X) p(#X ": %s\n", X ? "yes" : "no"); |
59 | Pbool([P0 conformsTo: P1]); |
60 | Pbool([P1 conformsTo: P0]); |
61 | Pbool([P1 conformsTo: P2]); |
62 | Pbool([P2 conformsTo: P1]); |
63 | Pbool([P3 conformsTo: P1]); |
64 | Pbool([P1 conformsTo: P3]); |
65 | |
66 | return 0; |
67 | } |
68 | |
69 | // rdar://problem/7992749 |
70 | typedef Root<P1> P1Object; |
71 | int test10() { |
72 | return [P1Object maxValue]; |
73 | } |
74 | |