Fariborz Jahanian | dd69aae | 2009-12-16 18:03:30 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -verify -emit-llvm -o - %s |
Andy Gibbs | 8e8fb3b | 2012-10-19 12:44:48 +0000 | [diff] [blame^] | 2 | // expected-no-diagnostics |
Daniel Dunbar | fcf3de3 | 2009-06-05 06:03:19 +0000 | [diff] [blame] | 3 | |
| 4 | // Test reference binding. |
| 5 | |
| 6 | typedef struct { |
| 7 | int f0; |
| 8 | int f1; |
| 9 | } T; |
| 10 | |
| 11 | @interface A |
| 12 | @property (assign) T p0; |
Fariborz Jahanian | 1408676 | 2011-03-28 23:47:18 +0000 | [diff] [blame] | 13 | @property (assign) T& p1; |
Daniel Dunbar | fcf3de3 | 2009-06-05 06:03:19 +0000 | [diff] [blame] | 14 | @end |
| 15 | |
| 16 | int f0(const T& t) { |
| 17 | return t.f0; |
| 18 | } |
| 19 | |
| 20 | int f1(A *a) { |
| 21 | return f0(a.p0); |
| 22 | } |
| 23 | |
| 24 | int f2(A *a) { |
Fariborz Jahanian | 1408676 | 2011-03-28 23:47:18 +0000 | [diff] [blame] | 25 | return f0(a.p1); |
Daniel Dunbar | fcf3de3 | 2009-06-05 06:03:19 +0000 | [diff] [blame] | 26 | } |
| 27 | |
Douglas Gregor | 8f70ddb | 2010-07-29 16:05:45 +0000 | [diff] [blame] | 28 | // PR7740 |
| 29 | @class NSString; |
| 30 | |
| 31 | void f3(id); |
| 32 | void f4(NSString &tmpstr) { |
| 33 | f3(&tmpstr); |
| 34 | } |
Douglas Gregor | 569c316 | 2010-08-07 11:51:51 +0000 | [diff] [blame] | 35 | |
| 36 | // PR7741 |
| 37 | @protocol P1 @end |
| 38 | @protocol P2 @end |
| 39 | @protocol P3 @end |
| 40 | @interface foo<P1> {} @end |
Fariborz Jahanian | b7bc34a | 2011-04-08 18:25:29 +0000 | [diff] [blame] | 41 | @interface bar : foo <P1, P2, P3> {} @end |
Douglas Gregor | 569c316 | 2010-08-07 11:51:51 +0000 | [diff] [blame] | 42 | typedef bar baz; |
Douglas Gregor | aaa3713 | 2010-08-07 11:56:45 +0000 | [diff] [blame] | 43 | |
| 44 | struct ToBar { |
| 45 | operator bar&() const; |
| 46 | }; |
| 47 | |
Douglas Gregor | 569c316 | 2010-08-07 11:51:51 +0000 | [diff] [blame] | 48 | void f5(foo&); |
| 49 | void f5b(foo<P1>&); |
| 50 | void f5c(foo<P2>&); |
| 51 | void f5d(foo<P3>&); |
| 52 | void f6(baz* x) { |
| 53 | f5(*x); |
| 54 | f5b(*x); |
| 55 | f5c(*x); |
| 56 | f5d(*x); |
Douglas Gregor | aaa3713 | 2010-08-07 11:56:45 +0000 | [diff] [blame] | 57 | (void)((foo&)*x); |
| 58 | f5(ToBar()); |
| 59 | f5b(ToBar()); |
| 60 | f5c(ToBar()); |
| 61 | f5d(ToBar()); |
| 62 | (void)((foo&)ToBar()); |
Douglas Gregor | 569c316 | 2010-08-07 11:51:51 +0000 | [diff] [blame] | 63 | } |