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