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