diff options
Diffstat (limited to 'test/SemaObjC/attr-availability.m')
-rw-r--r-- | test/SemaObjC/attr-availability.m | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/test/SemaObjC/attr-availability.m b/test/SemaObjC/attr-availability.m index c455bc7acce6..ea97e0e472d3 100644 --- a/test/SemaObjC/attr-availability.m +++ b/test/SemaObjC/attr-availability.m @@ -1,11 +1,21 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s +// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s @protocol P - (void)proto_method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}} + +#if defined(WARN_PARTIAL) + // expected-note@+2 2 {{'partial_proto_method' has been explicitly marked partial here}} +#endif +- (void)partial_proto_method __attribute__((availability(macosx,introduced=10.8))); @end @interface A <P> - (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}} +#if defined(WARN_PARTIAL) + // expected-note@+2 {{'partialMethod' has been explicitly marked partial here}} +#endif +- (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); - (void)overridden __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}} - (void)overridden2 __attribute__((availability(macosx,introduced=10.3))); @@ -18,6 +28,7 @@ // rdar://11475360 @interface B : A - (void)method; // NOTE: we expect 'method' to *not* inherit availability. +- (void)partialMethod; // Likewise. - (void)overridden __attribute__((availability(macosx,introduced=10.4))); // expected-warning{{overriding method introduced after overridden method on OS X (10.4 vs. 10.3)}} - (void)overridden2 __attribute__((availability(macosx,introduced=10.2))); - (void)overridden3 __attribute__((availability(macosx,deprecated=10.4))); @@ -31,6 +42,32 @@ void f(A *a, B *b) { [b method]; // no-warning [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}} [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}} + +#if defined(WARN_PARTIAL) + // expected-warning@+2 {{'partialMethod' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partialMethod' to silence this warning}} +#endif + [a partialMethod]; + [b partialMethod]; // no warning +#if defined(WARN_PARTIAL) + // 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}} +#endif + [a partial_proto_method]; +#if defined(WARN_PARTIAL) + // 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}} +#endif + [b partial_proto_method]; +} + +@interface A (NewAPI) +- (void)partialMethod; +- (void)partial_proto_method; +@end + +void f_after_redecl(A *a, B *b) { + [a partialMethod]; // no warning + [b partialMethod]; // no warning + [a partial_proto_method]; // no warning + [b partial_proto_method]; // no warning } // Test case for <rdar://problem/11627873>. Warn about @@ -87,3 +124,85 @@ id NSNibOwner, topNibObjects; } @end + +@protocol PartialProt +- (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8))); ++ (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8))); +@end + +@interface PartialI <PartialProt> +- (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); ++ (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); +@end + +@interface PartialI () +- (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8))); +#if defined(WARN_PARTIAL) + // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}} +#endif +- (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8))); ++ (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8))); +#if defined(WARN_PARTIAL) + // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}} +#endif ++ (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8))); +@end + +@interface PartialI (Redecls) +- (void)partialMethod; +- (void)ipartialMethod1; +- (void)ppartialMethod; ++ (void)partialMethod; ++ (void)ipartialMethod1; ++ (void)ppartialMethod; +@end + +void partialfun(PartialI* a) { + [a partialMethod]; // no warning + [a ipartialMethod1]; // no warning +#if defined(WARN_PARTIAL) + // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}} +#endif + [a ipartialMethod2]; + [a ppartialMethod]; // no warning + [PartialI partialMethod]; // no warning + [PartialI ipartialMethod1]; // no warning +#if defined(WARN_PARTIAL) + // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}} +#endif + [PartialI ipartialMethod2]; + [PartialI ppartialMethod]; // no warning +} + +#if defined(WARN_PARTIAL) + // expected-note@+2 {{'PartialI2' has been explicitly marked partial here}} +#endif +__attribute__((availability(macosx, introduced = 10.8))) @interface PartialI2 +@end + +#if defined(WARN_PARTIAL) + // expected-warning@+2 {{'PartialI2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'PartialI2' to silence this warning}} +#endif +void partialinter1(PartialI2* p) { +} + +@class PartialI2; + +void partialinter2(PartialI2* p) { // no warning +} + + +// Test that both the use of the 'typedef' and the enum constant +// produces an error. rdar://problem/20903588 +#define UNAVAILABLE __attribute__((unavailable("not available"))) + +typedef enum MyEnum : int MyEnum; +enum MyEnum : int { // expected-note {{'MyEnum' has been explicitly marked unavailable here}} + MyEnum_Blah UNAVAILABLE, // expected-note {{'MyEnum_Blah' has been explicitly marked unavailable here}} +} UNAVAILABLE; + +void use_myEnum() { + // expected-error@+2 {{'MyEnum' is unavailable: not available}} + // expected-error@+1 {{MyEnum_Blah' is unavailable: not available}} + MyEnum e = MyEnum_Blah; +} |