• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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