xref: /aosp_15_r20/external/clang/test/SemaObjCXX/conversion-to-objc-pointer-2.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
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