<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 2, 2014, at 9:39 AM, Fariborz Jahanian <<a href="mailto:fjahanian@apple.com" class="">fjahanian@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">Author: fjahanian<br class="">Date: Thu Oct  2 11:39:45 2014<br class="">New Revision: 218884<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=218884&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=218884&view=rev</a><br class="">Log:<br class="">Patch to accept '_' in addition to '.' as version<br class="">number separator in "availability" attribute.<br class=""><a href="rdar://18490958" class="">rdar://18490958</a><br class=""></div></blockquote><div><br class=""></div>Seems kind of weird that we allow version numbers like “10_3.4” and “10.5_3”. Otherwise, LGTM, thanks!</div><div><br class=""></div><div><span class="Apple-tab-span" style="white-space:pre">      </span>- Doug</div><div><br class=""><blockquote type="cite" class=""><div class="">Added:<br class="">    cfe/trunk/test/SemaObjC/attr-availability-1.m<br class="">Modified:<br class="">    cfe/trunk/lib/Parse/ParseDecl.cpp<br class=""><br class="">Modified: cfe/trunk/lib/Parse/ParseDecl.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=218884&r1=218883&r2=218884&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=218884&r1=218883&r2=218884&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)<br class="">+++ cfe/trunk/lib/Parse/ParseDecl.cpp Thu Oct  2 11:39:45 2014<br class="">@@ -627,6 +627,10 @@ void Parser::ParseOpenCLQualifiers(Parse<br class="">                AttributeList::AS_Keyword);<br class=""> }<br class=""><br class="">+static bool VersionNumberSeparator(const char Separator) {<br class="">+  return (Separator == '.' || Separator == '_');<br class="">+}<br class="">+<br class=""> /// \brief Parse a version number.<br class=""> ///<br class=""> /// version:<br class="">@@ -684,7 +688,8 @@ VersionTuple Parser::ParseVersionTuple(S<br class="">     return VersionTuple(Major);<br class="">   }<br class=""><br class="">-  if (ThisTokBegin[AfterMajor] != '.' || (AfterMajor + 1 == ActualLength)) {<br class="">+  if (!VersionNumberSeparator(ThisTokBegin[AfterMajor])<br class="">+      || (AfterMajor + 1 == ActualLength)) {<br class="">     Diag(Tok, diag::err_expected_version);<br class="">     SkipUntil(tok::comma, tok::r_paren,<br class="">               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);<br class="">@@ -711,8 +716,8 @@ VersionTuple Parser::ParseVersionTuple(S<br class="">     return VersionTuple(Major, Minor);<br class="">   }<br class=""><br class="">-  // If what follows is not a '.', we have a problem.<br class="">-  if (ThisTokBegin[AfterMinor] != '.') {<br class="">+  // If what follows is not a '.' or '_', we have a problem.<br class="">+  if (!VersionNumberSeparator(ThisTokBegin[AfterMinor])) {<br class="">     Diag(Tok, diag::err_expected_version);<br class="">     SkipUntil(tok::comma, tok::r_paren,<br class="">               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);<br class=""><br class="">Added: cfe/trunk/test/SemaObjC/attr-availability-1.m<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-availability-1.m?rev=218884&view=auto" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-availability-1.m?rev=218884&view=auto</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/SemaObjC/attr-availability-1.m (added)<br class="">+++ cfe/trunk/test/SemaObjC/attr-availability-1.m Thu Oct  2 11:39:45 2014<br class="">@@ -0,0 +1,92 @@<br class="">+// RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s<br class="">+// RUN: %clang_cc1 -x objective-c++ -std=c++11 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s<br class="">+// RUN: %clang_cc1 -x objective-c++ -std=c++03 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s<br class="">+// <a href="rdar://18490958" class="">rdar://18490958</a><br class="">+<br class="">+@protocol P<br class="">+- (void)proto_method __attribute__((availability(macosx,introduced=10_1,deprecated=10_2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}}<br class="">+@end<br class="">+<br class="">+@interface A <P><br class="">+- (void)method __attribute__((availability(macosx,introduced=10_1,deprecated=10_2))); // expected-note {{'method' has been explicitly marked deprecated here}}<br class="">+<br class="">+- (void)overridden __attribute__((availability(macosx,introduced=10_3))); // expected-note{{overridden method is here}}<br class="">+- (void)overridden2 __attribute__((availability(macosx,introduced=10_3)));<br class="">+- (void)overridden3 __attribute__((availability(macosx,deprecated=10_3)));<br class="">+- (void)overridden4 __attribute__((availability(macosx,deprecated=10_3))); // expected-note{{overridden method is here}}<br class="">+- (void)overridden5 __attribute__((availability(macosx,unavailable)));<br class="">+- (void)overridden6 __attribute__((availability(macosx,introduced=10_3))); // expected-note{{overridden method is here}}<br class="">+@end<br class="">+<br class="">+// <a href="rdar://11475360" class="">rdar://11475360</a><br class="">+@interface B : A<br class="">+- (void)method; // NOTE: we expect 'method' to *not* inherit availability.<br class="">+- (void)overridden __attribute__((availability(macosx,introduced=10_4))); // expected-warning{{overriding method introduced after overridden method on OS X (10.4 vs. 10.3)}}<br class="">+- (void)overridden2 __attribute__((availability(macosx,introduced=10_2)));<br class="">+- (void)overridden3 __attribute__((availability(macosx,deprecated=10_4)));<br class="">+- (void)overridden4 __attribute__((availability(macosx,deprecated=10_2))); // expected-warning{{overriding method deprecated before overridden method on OS X (10.3 vs. 10.2)}}<br class="">+- (void)overridden5 __attribute__((availability(macosx,introduced=10_3)));<br class="">+- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on OS X when its overridden method is available}}<br class="">+@end<br class="">+<br class="">+void f(A *a, B *b) {<br class="">+  [a method]; // expected-warning{{'method' is deprecated: first deprecated in OS X 10.2}}<br class="">+  [b method]; // no-warning<br class="">+  [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}}<br class="">+  [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}}<br class="">+}<br class="">+<br class="">+// Test case for <<a href="rdar://problem/11627873" class="">rdar://problem/11627873</a>>.  Warn about<br class="">+// using a deprecated method when that method is re-implemented in a<br class="">+// subclass where the redeclared method is not deprecated.<br class="">+@interface C<br class="">+- (void) method __attribute__((availability(macosx,introduced=10_1,deprecated=10_2))); // expected-note {{'method' has been explicitly marked deprecated here}}<br class="">+@end<br class="">+<br class="">+@interface D : C<br class="">+- (void) method;<br class="">+@end<br class="">+<br class="">+@interface E : D<br class="">+- (void) method;<br class="">+@end<br class="">+<br class="">+@implementation D<br class="">+- (void) method {<br class="">+  [super method]; // expected-warning {{'method' is deprecated: first deprecated in OS X 10.2}}<br class="">+}<br class="">+@end<br class="">+<br class="">+@implementation E<br class="">+- (void) method {<br class="">+  [super method]; // no-warning<br class="">+}<br class="">+@end<br class="">+<br class="">+// <a href="rdar://18059669" class="">rdar://18059669</a><br class="">+@class NSMutableArray;<br class="">+<br class="">+@interface NSDictionary<br class="">++ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... __attribute__((sentinel(0,1)));<br class="">+@end<br class="">+<br class="">+@class NSString;<br class="">+<br class="">+extern NSString *NSNibTopLevelObjects __attribute__((availability(macosx,introduced=10_0 ,deprecated=10_8,message="" )));<br class="">+id NSNibOwner, topNibObjects;<br class="">+<br class="">+@interface AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}<br class="">+<br class="">+-(void)__attribute__((ibaction))importFromSIE:(id)sender;<br class="">+<br class="">+@end<br class="">+<br class="">+@implementation AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}<br class="">+<br class="">+-(void)__attribute__((ibaction))importFromSIE:(id)sender {<br class="">+<br class="">+ NSMutableArray *topNibObjects;<br class="">+ NSDictionary *nibLoadDict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSNibOwner, topNibObjects, NSNibTopLevelObjects, ((void *)0)];<br class="">+}<br class="">+<br class="">+@end<br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@cs.uiuc.edu" class="">cfe-commits@cs.uiuc.edu</a><br class="">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br class=""></div></blockquote></div><br class=""></body></html>