1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | // expected-no-diagnostics |
3 | // rdar: // 7963410 |
4 | |
5 | @protocol NSObject @end |
6 | @interface NSObject |
7 | - (id)init; |
8 | - (id) alloc; |
9 | - (id) autorelease; |
10 | @end |
11 | |
12 | template<class T> |
13 | class TNSAutoRef |
14 | { |
15 | public: |
16 | TNSAutoRef(T t) |
17 | : fRef(t) |
18 | { } |
19 | |
20 | ~TNSAutoRef() |
21 | { } |
22 | |
23 | operator T() const |
24 | { return fRef; } |
25 | |
26 | private: |
27 | T fRef; |
28 | }; |
29 | |
30 | |
31 | #pragma mark - |
32 | |
33 | |
34 | @protocol TFooProtocol <NSObject> |
35 | |
36 | - (void) foo; |
37 | @end |
38 | |
39 | |
40 | #pragma mark - |
41 | |
42 | |
43 | @interface TFoo : NSObject |
44 | |
45 | - (void) setBlah: (id<TFooProtocol>)blah; |
46 | @end |
47 | |
48 | |
49 | #pragma mark - |
50 | |
51 | |
52 | @implementation TFoo |
53 | |
54 | - (void) setBlah: (id<TFooProtocol>)blah |
55 | { } |
56 | @end |
57 | |
58 | |
59 | #pragma mark - |
60 | |
61 | |
62 | @interface TBar : NSObject |
63 | |
64 | - (void) setBlah: (id)blah; |
65 | @end |
66 | |
67 | #pragma mark - |
68 | |
69 | |
70 | @implementation TBar |
71 | |
72 | - (void) setBlah: (id)blah |
73 | { } |
74 | @end |
75 | |
76 | |
77 | #pragma mark - |
78 | |
79 | |
80 | int main (int argc, const char * argv[]) { |
81 | |
82 | NSObject* object1 = [[[NSObject alloc] init] autorelease]; |
83 | TNSAutoRef<NSObject*> object2([[NSObject alloc] init]); |
84 | TNSAutoRef<TBar*> bar([[TBar alloc] init]); |
85 | [bar setBlah: object1]; // <== Does not compile. It should. |
86 | if (object1 == object2) |
87 | [bar setBlah: object2]; // <== Does not compile. It should. |
88 | return 0; |
89 | } |
90 | |