| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| // expected-no-diagnostics |
| // rdar: // 7963410 |
| |
| @protocol NSObject @end |
| @interface NSObject |
| - (id)init; |
| - (id) alloc; |
| - (id) autorelease; |
| @end |
| |
| template<class T> |
| class TNSAutoRef |
| { |
| public: |
| TNSAutoRef(T t) |
| : fRef(t) |
| { } |
| |
| ~TNSAutoRef() |
| { } |
| |
| operator T() const |
| { return fRef; } |
| |
| private: |
| T fRef; |
| }; |
| |
| |
| #pragma mark - |
| |
| |
| @protocol TFooProtocol <NSObject> |
| |
| - (void) foo; |
| @end |
| |
| |
| #pragma mark - |
| |
| |
| @interface TFoo : NSObject |
| |
| - (void) setBlah: (id<TFooProtocol>)blah; |
| @end |
| |
| |
| #pragma mark - |
| |
| |
| @implementation TFoo |
| |
| - (void) setBlah: (id<TFooProtocol>)blah |
| { } |
| @end |
| |
| |
| #pragma mark - |
| |
| |
| @interface TBar : NSObject |
| |
| - (void) setBlah: (id)blah; |
| @end |
| |
| #pragma mark - |
| |
| |
| @implementation TBar |
| |
| - (void) setBlah: (id)blah |
| { } |
| @end |
| |
| |
| #pragma mark - |
| |
| |
| int main (int argc, const char * argv[]) { |
| |
| NSObject* object1 = [[[NSObject alloc] init] autorelease]; |
| TNSAutoRef<NSObject*> object2([[NSObject alloc] init]); |
| TNSAutoRef<TBar*> bar([[TBar alloc] init]); |
| [bar setBlah: object1]; // <== Does not compile. It should. |
| if (object1 == object2) |
| [bar setBlah: object2]; // <== Does not compile. It should. |
| return 0; |
| } |