[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaObjCXX / conversion-to-objc-pointer-2.mm
blob1f968449508a651db766876108b3cec0ac82a3a0
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // expected-no-diagnostics
4 @protocol NSObject @end
5 @interface NSObject
6 - (id)init;
7 - (id) alloc;
8 - (id) autorelease;
9 @end
11 template<class T>
12 class TNSAutoRef
14 public:
15         TNSAutoRef(T t)
16                 :       fRef(t)
17                 { }
19         ~TNSAutoRef()
20                 { }
22         operator T() const
23                 { return fRef; }
25 private:
26         T fRef;
30 #pragma mark -
33 @protocol TFooProtocol <NSObject>
35 - (void) foo;
36 @end
39 #pragma mark -
42 @interface TFoo : NSObject
44 - (void) setBlah: (id<TFooProtocol>)blah;
45 @end
48 #pragma mark -
51 @implementation TFoo
53 - (void) setBlah: (id<TFooProtocol>)blah
54         { }
55 @end
58 #pragma mark -
61 @interface TBar : NSObject
63 - (void) setBlah: (id)blah;
64 @end
66 #pragma mark -
69 @implementation TBar
71 - (void) setBlah: (id)blah
72         { }
73 @end
76 #pragma mark -
79 int main (int argc, const char * argv[]) {
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;