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 12template<class T> 13class TNSAutoRef 14{ 15public: 16 TNSAutoRef(T t) 17 : fRef(t) 18 { } 19 20 ~TNSAutoRef() 21 { } 22 23 operator T() const 24 { return fRef; } 25 26private: 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 80int 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