blob: bac4be2d1dfcc63277959fa7d4a96ca0ecdbae1c [file] [log] [blame]
Douglas Gregor710e0c42011-09-23 20:28:32 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
Fariborz Jahaniand6724362012-04-23 20:30:52 +00003
4@protocol P
Stephen Hines651f13c2014-04-23 16:59:28 -07005- (void)proto_method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}}
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006
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)));
Fariborz Jahaniand6724362012-04-23 20:30:52 +000011@end
12
13@interface A <P>
Stephen Hines651f13c2014-04-23 16:59:28 -070014- (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070015#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)));
Douglas Gregorf4d918f2013-01-15 22:43:08 +000019
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}}
Douglas Gregor72daa3f2013-01-16 00:54:48 +000024- (void)overridden5 __attribute__((availability(macosx,unavailable)));
25- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}}
Douglas Gregorc193dd82011-09-23 20:23:42 +000026@end
27
Fariborz Jahanian1ea67442012-06-05 21:14:46 +000028// rdar://11475360
Douglas Gregorc193dd82011-09-23 20:23:42 +000029@interface B : A
Ted Kremenekcb344392013-04-06 00:34:27 +000030- (void)method; // NOTE: we expect 'method' to *not* inherit availability.
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070031- (void)partialMethod; // Likewise.
Douglas Gregorf4d918f2013-01-15 22:43:08 +000032- (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)}}
Douglas Gregor72daa3f2013-01-16 00:54:48 +000036- (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}}
Douglas Gregorc193dd82011-09-23 20:23:42 +000038@end
39
40void f(A *a, B *b) {
Fariborz Jahanianfaab5612012-10-01 18:42:25 +000041 [a method]; // expected-warning{{'method' is deprecated: first deprecated in OS X 10.2}}
Ted Kremenekcb344392013-04-06 00:34:27 +000042 [b method]; // no-warning
Fariborz Jahanianfaab5612012-10-01 18:42:25 +000043 [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}}
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070045
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
Douglas Gregorc193dd82011-09-23 20:23:42 +000071}
Ted Kremenek1db6d6b2013-04-08 23:39:32 +000072
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
Stephen Hines651f13c2014-04-23 16:59:28 -070077- (void) method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}
Ted Kremenek1db6d6b2013-04-08 23:39:32 +000078@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
Stephen Hines176edba2014-12-01 14:53:08 -0800100// 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
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700127
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}