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