1// RUN: %clang_cc1 -emit-llvm-only %s
2
3void p(const char*, ...);
4
5@interface Root
6+(int) maxValue;
7-(int) conformsTo: (id) x;
8@end
9
10@protocol P0
11@end
12
13@protocol P1
14+(void) classMethodReq0;
15-(void) methodReq0;
16@optional
17+(void) classMethodOpt1;
18-(void) methodOpt1;
19@required
20+(void) classMethodReq2;
21-(void) methodReq2;
22@end
23
24@protocol P2
25//@property(readwrite) int x;
26@end
27
28@protocol P3<P1, P2>
29-(id <P1>) print0;
30-(void) print1;
31@end
32
33void foo(const id a) {
34  void *p = @protocol(P3);
35}
36
37int main() {
38  Protocol *P0 = @protocol(P0);
39  Protocol *P1 = @protocol(P1);
40  Protocol *P2 = @protocol(P2);
41  Protocol *P3 = @protocol(P3);
42
43#define Pbool(X) p(#X ": %s\n", X ? "yes" : "no");
44  Pbool([P0 conformsTo: P1]);
45  Pbool([P1 conformsTo: P0]);
46  Pbool([P1 conformsTo: P2]);
47  Pbool([P2 conformsTo: P1]);
48  Pbool([P3 conformsTo: P1]);
49  Pbool([P1 conformsTo: P3]);
50
51  return 0;
52}
53
54// rdar://problem/7992749
55typedef Root<P1> P1Object;
56int test10() {
57  return [P1Object maxValue];
58}
59