• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
2// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
3
4@protocol P
5- (void)proto_method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}}
6
7#if defined(WARN_PARTIAL)
8  // expected-note@+2 2 {{'partial_proto_method' has been explicitly marked partial here}}
9#endif
10- (void)partial_proto_method __attribute__((availability(macosx,introduced=10.8)));
11@end
12
13@interface A <P>
14- (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}
15#if defined(WARN_PARTIAL)
16  // expected-note@+2 {{'partialMethod' has been explicitly marked partial here}}
17#endif
18- (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));
19
20- (void)overridden __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}}
21- (void)overridden2 __attribute__((availability(macosx,introduced=10.3)));
22- (void)overridden3 __attribute__((availability(macosx,deprecated=10.3)));
23- (void)overridden4 __attribute__((availability(macosx,deprecated=10.3))); // expected-note{{overridden method is here}}
24- (void)overridden5 __attribute__((availability(macosx,unavailable)));
25- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}}
26@end
27
28// rdar://11475360
29@interface B : A
30- (void)method; // NOTE: we expect 'method' to *not* inherit availability.
31- (void)partialMethod; // Likewise.
32- (void)overridden __attribute__((availability(macosx,introduced=10.4))); // expected-warning{{overriding method introduced after overridden method on OS X (10.4 vs. 10.3)}}
33- (void)overridden2 __attribute__((availability(macosx,introduced=10.2)));
34- (void)overridden3 __attribute__((availability(macosx,deprecated=10.4)));
35- (void)overridden4 __attribute__((availability(macosx,deprecated=10.2))); // expected-warning{{overriding method deprecated before overridden method on OS X (10.3 vs. 10.2)}}
36- (void)overridden5 __attribute__((availability(macosx,introduced=10.3)));
37- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on OS X when its overridden method is available}}
38@end
39
40void f(A *a, B *b) {
41  [a method]; // expected-warning{{'method' is deprecated: first deprecated in OS X 10.2}}
42  [b method]; // no-warning
43  [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}}
44  [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}}
45
46#if defined(WARN_PARTIAL)
47  // expected-warning@+2 {{'partialMethod' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partialMethod' to silence this warning}}
48#endif
49  [a partialMethod];
50  [b partialMethod];  // no warning
51#if defined(WARN_PARTIAL)
52  // expected-warning@+2 {{'partial_proto_method' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}}
53#endif
54  [a partial_proto_method];
55#if defined(WARN_PARTIAL)
56  // expected-warning@+2 {{'partial_proto_method' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}}
57#endif
58  [b partial_proto_method];
59}
60
61@interface A (NewAPI)
62- (void)partialMethod;
63- (void)partial_proto_method;
64@end
65
66void f_after_redecl(A *a, B *b) {
67  [a partialMethod]; // no warning
68  [b partialMethod]; // no warning
69  [a partial_proto_method]; // no warning
70  [b partial_proto_method]; // no warning
71}
72
73// Test case for <rdar://problem/11627873>.  Warn about
74// using a deprecated method when that method is re-implemented in a
75// subclass where the redeclared method is not deprecated.
76@interface C
77- (void) method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}
78@end
79
80@interface D : C
81- (void) method;
82@end
83
84@interface E : D
85- (void) method;
86@end
87
88@implementation D
89- (void) method {
90  [super method]; // expected-warning {{'method' is deprecated: first deprecated in OS X 10.2}}
91}
92@end
93
94@implementation E
95- (void) method {
96  [super method]; // no-warning
97}
98@end
99
100// rdar://18059669
101@class NSMutableArray;
102
103@interface NSDictionary
104+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... __attribute__((sentinel(0,1)));
105@end
106
107@class NSString;
108
109extern NSString *NSNibTopLevelObjects __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.8,message="" )));
110id NSNibOwner, topNibObjects;
111
112@interface AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}
113
114-(void)__attribute__((ibaction))importFromSIE:(id)sender;
115
116@end
117
118@implementation AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}
119
120-(void)__attribute__((ibaction))importFromSIE:(id)sender {
121
122 NSMutableArray *topNibObjects;
123 NSDictionary *nibLoadDict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSNibOwner, topNibObjects, NSNibTopLevelObjects, ((void *)0)];
124}
125
126@end
127
128@protocol PartialProt
129- (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8)));
130+ (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8)));
131@end
132
133@interface PartialI <PartialProt>
134- (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));
135+ (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));
136@end
137
138@interface PartialI ()
139- (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8)));
140#if defined(WARN_PARTIAL)
141  // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}}
142#endif
143- (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8)));
144+ (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8)));
145#if defined(WARN_PARTIAL)
146  // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}}
147#endif
148+ (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8)));
149@end
150
151@interface PartialI (Redecls)
152- (void)partialMethod;
153- (void)ipartialMethod1;
154- (void)ppartialMethod;
155+ (void)partialMethod;
156+ (void)ipartialMethod1;
157+ (void)ppartialMethod;
158@end
159
160void partialfun(PartialI* a) {
161  [a partialMethod]; // no warning
162  [a ipartialMethod1]; // no warning
163#if defined(WARN_PARTIAL)
164  // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}}
165#endif
166  [a ipartialMethod2];
167  [a ppartialMethod]; // no warning
168  [PartialI partialMethod]; // no warning
169  [PartialI ipartialMethod1]; // no warning
170#if defined(WARN_PARTIAL)
171  // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}}
172#endif
173  [PartialI ipartialMethod2];
174  [PartialI ppartialMethod]; // no warning
175}
176
177#if defined(WARN_PARTIAL)
178  // expected-note@+2 {{'PartialI2' has been explicitly marked partial here}}
179#endif
180__attribute__((availability(macosx, introduced = 10.8))) @interface PartialI2
181@end
182
183#if defined(WARN_PARTIAL)
184  // expected-warning@+2 {{'PartialI2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'PartialI2' to silence this warning}}
185#endif
186void partialinter1(PartialI2* p) {
187}
188
189@class PartialI2;
190
191void partialinter2(PartialI2* p) { // no warning
192}
193