]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/ARCMT/atautorelease-check.m
Vendor import of clang release_30 branch r142614:
[FreeBSD/FreeBSD.git] / test / ARCMT / atautorelease-check.m
1 // RUN: %clang_cc1 -arcmt-check -verify -triple x86_64-apple-darwin10 %s
2
3 #if __has_feature(objc_arr)
4 #define NS_AUTOMATED_REFCOUNT_UNAVAILABLE __attribute__((unavailable("not available in automatic reference counting mode")))
5 #else
6 #define NS_AUTOMATED_REFCOUNT_UNAVAILABLE
7 #endif
8
9 typedef struct _NSZone NSZone;
10 typedef int BOOL;
11 typedef unsigned NSUInteger;
12
13 @protocol NSObject
14 - (BOOL)isEqual:(id)object;
15 - (id)retain NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
16 - (NSUInteger)retainCount NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
17 - (oneway void)release NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
18 - (id)autorelease NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
19
20 - (NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
21 @end
22
23 @protocol NSCopying
24 - (id)copyWithZone:(NSZone *)zone;
25 @end
26
27 @protocol NSMutableCopying
28 - (id)mutableCopyWithZone:(NSZone *)zone;
29 @end
30
31 @interface NSObject <NSObject> {}
32 - (id)init;
33
34 + (id)new;
35 + (id)allocWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
36 + (id)alloc;
37 - (void)dealloc;
38
39 - (void)finalize;
40
41 - (id)copy;
42 - (id)mutableCopy;
43
44 + (id)copyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
45 + (id)mutableCopyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
46 @end
47
48 extern void NSRecycleZone(NSZone *zone);
49
50 NS_AUTOMATED_REFCOUNT_UNAVAILABLE
51 @interface NSAutoreleasePool : NSObject { // expected-note 13 {{marked unavailable here}}
52 @private
53     void    *_token;
54     void    *_reserved3;
55     void    *_reserved2;
56     void    *_reserved;
57 }
58
59 + (void)addObject:(id)anObject;
60
61 - (void)addObject:(id)anObject;
62
63 - (void)drain;
64
65 @end
66
67
68 void NSLog(id, ...);
69
70 int main (int argc, const char * argv[]) {
71     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
72     NSAutoreleasePool *chunkPool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}}
73
74     while (argc) {
75       [chunkPool release];
76       // the following pool was not released in this scope, don't touch it. 
77       chunkPool = [[NSAutoreleasePool alloc] init]; // expected-error {{'NSAutoreleasePool' is unavailable}}
78     }
79
80     [chunkPool drain];
81     [pool drain];
82
83     return 0;
84 }
85
86 void f(void) {
87     NSAutoreleasePool * pool;  // expected-error {{'NSAutoreleasePool' is unavailable}}
88
89     for (int i=0; i != 10; ++i) {
90       id x = pool; // We won't touch a NSAutoreleasePool if we can't safely
91                    // remove all the references to it.
92     }
93
94     pool = [[NSAutoreleasePool alloc] init];  // expected-error {{'NSAutoreleasePool' is unavailable}}
95     NSLog(@"%s", "YES");
96     [pool release];
97 }
98
99 void f2(void) {
100     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
101                                             // expected-note {{scope begins here}}
102
103     // 'x' is declared inside the "pool scope" but used outside it, if we create
104     // a @autorelease scope it will be undefined outside it so don't touch the pool.
105     int x = 0; // expected-note {{declared here}}
106
107     [pool release]; // expected-note {{scope ends here}}
108     
109     ++x; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
110 }
111
112 void f3(void) {
113     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
114                                             // expected-note {{scope begins here}}
115
116     struct S { int x; }; // expected-note {{declared here}}
117
118     [pool release]; // expected-note {{scope ends here}}
119
120     struct S *var; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
121     var->x = 0;
122 }
123
124 void f4(void) {
125     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
126                                             // expected-note {{scope begins here}}
127
128     enum { Bar }; // expected-note {{declared here}}
129
130     [pool release]; // expected-note {{scope ends here}}
131
132     int x = Bar; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
133 }
134
135 void f5(void) {
136     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
137                                             // expected-note {{scope begins here}}
138
139     typedef int Bar; // expected-note {{declared here}}
140
141     [pool release]; // expected-note {{scope ends here}}
142
143     Bar x; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
144 }