1 | // RUN: %clang_cc1 -verify -o - %s |
2 | |
3 | __attribute__((objc_root_class)) |
4 | @interface Root @end |
5 | |
6 | // Test reference binding. |
7 | |
8 | typedef struct { |
9 | int f0; |
10 | int f1; |
11 | } T; |
12 | |
13 | @interface A : Root |
14 | @property (assign) T p0; |
15 | @property (assign) T& p1; |
16 | @end |
17 | |
18 | int f0(const T& t) { |
19 | return t.f0; |
20 | } |
21 | |
22 | int f1(A *a) { |
23 | return f0(a.p0); |
24 | } |
25 | |
26 | int f2(A *a) { |
27 | return f0(a.p1); |
28 | } |
29 | |
30 | // PR7740 |
31 | @class NSString; |
32 | |
33 | void f3(id); |
34 | void f4(NSString &tmpstr) { |
35 | f3(&tmpstr); |
36 | } |
37 | |
38 | // PR7741 |
39 | @protocol P1 @end |
40 | @protocol P2 @end |
41 | @protocol P3 @end |
42 | @interface foo<P1> {} @end |
43 | @interface bar : foo <P1, P2, P3> {} @end |
44 | typedef bar baz; |
45 | |
46 | struct ToBar { |
47 | operator bar&() const; |
48 | }; |
49 | |
50 | void f5(foo&); |
51 | void f5b(foo<P1>&); |
52 | void f5c(foo<P2>&); |
53 | void f5d(foo<P3>&); |
54 | void f6(baz* x) { |
55 | f5(*x); |
56 | f5b(*x); |
57 | f5c(*x); |
58 | f5d(*x); |
59 | (void)((foo&)*x); |
60 | f5(ToBar()); |
61 | f5b(ToBar()); |
62 | f5c(ToBar()); |
63 | f5d(ToBar()); |
64 | (void)((foo&)ToBar()); |
65 | } |
66 | |
67 | // rdar://13794269 |
68 | @interface B : Root @end |
69 | @implementation B { |
70 | unsigned bf : 4; // expected-note {{declared here}} |
71 | } |
72 | |
73 | - (void) foo { |
74 | unsigned &i = bf; // expected-error {{non-const reference cannot bind to bit-field 'bf'}} |
75 | } |
76 | @end |
77 | |