From: Fariborz Jahanian Date: Wed, 5 Nov 2014 23:58:55 +0000 (+0000) Subject: Patch for small addition to availability attribute. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=366198b99a6f8811bb5b091e89d126690a9370d6;p=clang Patch for small addition to availability attribute. This is to accept "NA" in place of vesion number for availability attribute. Used on introduced=NA to mean unavailable and deprecated=NA to mean nothing (not deprecated). rdar://18804883 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221417 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 2288cb1c33..6934752048 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -870,6 +870,19 @@ void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability, break; } + // Special handling of 'NA' only when applied to introduced or + // deprecated. + if ((Keyword == Ident_introduced || Keyword == Ident_deprecated) && + Tok.is(tok::identifier)) { + IdentifierInfo *NA = Tok.getIdentifierInfo(); + if (NA->getName() == "NA") { + ConsumeToken(); + if (Keyword == Ident_introduced) + UnavailableLoc = KeywordLoc; + continue; + } + } + SourceRange VersionRange; VersionTuple Version = ParseVersionTuple(VersionRange); diff --git a/test/SemaObjC/attr-availability-1.m b/test/SemaObjC/attr-availability-1.m index af0fcfe353..063407adae 100644 --- a/test/SemaObjC/attr-availability-1.m +++ b/test/SemaObjC/attr-availability-1.m @@ -95,3 +95,22 @@ id NSNibOwner, topNibObjects; - (void)Meth1 __attribute__((availability(macosx,introduced=10.3_0))); // expected-warning {{use same version number separators '_' or '.'}} - (void)Meth2 __attribute__((availability(macosx,introduced=10_3.1))); // expected-warning {{use same version number separators '_' or '.'}} @end + +// rdar://18804883 +@protocol P18804883 +- (void)proto_method __attribute__((availability(macosx,introduced=10_1,deprecated=NA))); // means nothing (not deprecated) +@end + +@interface A18804883 +- (void)interface_method __attribute__((availability(macosx,introduced=NA))); // expected-note {{'interface_method' has been explicitly marked unavailable here}} +- (void)strange_method __attribute__((availability(macosx,introduced=NA,deprecated=NA))); // expected-note {{'strange_method' has been explicitly marked unavailable here}} +- (void) always_available __attribute__((availability(macosx,deprecated=NA))); +@end + +void foo (A18804883* pa) { + [pa interface_method]; // expected-error {{'interface_method' is unavailable: not available on OS X}} + [pa proto_method]; + [pa strange_method]; // expected-error {{'strange_method' is unavailable: not available on OS X}} + [pa always_available]; +} +