// RUN: %clang_cc1 -fsyntax-only -verify %s // rdar: // 7963410 @protocol NSObject @end @interface NSObject - (id)init; - (id) alloc; - (id) autorelease; @end template class TNSAutoRef { public: TNSAutoRef(T t) : fRef(t) { } ~TNSAutoRef() { } operator T() const { return fRef; } private: T fRef; }; #pragma mark - @protocol TFooProtocol - (void) foo; @end #pragma mark - @interface TFoo : NSObject - (void) setBlah: (id)blah; @end #pragma mark - @implementation TFoo - (void) setBlah: (id)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 object2([[NSObject alloc] init]); TNSAutoRef 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; }