[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / ARCMT / releases.m
blob8636a8a5acea837d58b11ef72e8ee3d96c2bf246
1 // RUN: %clang_cc1 -fobjc-exceptions -fblocks -fsyntax-only -fobjc-arc -x objective-c %s.result
2 // RUN: arcmt-test --args -triple x86_64-apple-darwin10 -fobjc-exceptions -fblocks -fsyntax-only -x objective-c %s > %t
3 // RUN: diff %t %s.result
5 #define nil 0
7 typedef int BOOL;
9 id IhaveSideEffect(void);
11 @protocol NSObject
12 - (BOOL)isEqual:(id)object;
13 - (id)retain;
14 - (oneway void)release;
15 @end
17 @interface NSObject <NSObject> {}
18 @end
20 @interface Foo : NSObject {
21   id bar;
23 @property (retain) id bar;
24 -(void)test:(id)obj;
25 @end
27 @implementation Foo
29 @synthesize bar;
31 -(void)test:(id)obj {
32   id x = self.bar;
33   [x retain];
34   self.bar = obj;
35   // do stuff with x;
36   [x release];
38   [IhaveSideEffect() release];
40   [x release], x = 0;
42   @try {
43   } @finally {
44     [x release];
45   }
47   
48 @end
50 void func(Foo *p) {
51   [p release];
52   (([p release]));
55 @interface Baz {
56         id <NSObject> _foo;
58 @end
60 @implementation Baz
61 - (void) dealloc {
62   [_foo release];
64 @end
66 void block_test(Foo *p) {
67   id (^B)(void) = ^(void) {
68     if (p) {
69       id (^IB)(void) = ^(void) {
70         id bar = [p retain];
71               [p release];
72         return bar;
73       };
74       IB();
75     }
76     return [p retain];
77   };
80 #define RELEASE_MACRO(x) [x release]
81 #define RELEASE_MACRO2(x) RELEASE_MACRO(x)
83 void test2(id p) {
84   RELEASE_MACRO(p);
85   RELEASE_MACRO2(p);
88 @implementation Foo2
90 static id internal_var = 0;
92 + (void)setIt:(id)newone {
93     if (internal_var != newone) {
94         [internal_var release];
95         internal_var = [newone retain];
96     }
98 @end