From 328cf9877b2f75c273ee1e8b4a62d27496131cbd Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 2 Oct 2014 17:57:26 +0000 Subject: [PATCH] Diagnose mixed use of '_' and '.' as version separators in my previous patch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218895 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticParseKinds.td | 3 +++ lib/Parse/ParseDecl.cpp | 9 +++++++-- test/SemaObjC/attr-availability-1.m | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index cea0ebf553..96737ae973 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -775,6 +775,9 @@ def err_lambda_missing_parens : Error< // Availability attribute def err_expected_version : Error< "expected a version of the form 'major[.minor[.subminor]]'">; +def warn_expected_consistent_version_separator : Warning< + "use same version number separators '_' or '.'; as in " + "'major[.minor[.subminor]]'">, InGroup; def err_zero_version : Error< "version number must have non-zero major, minor, or sub-minor version">; def err_availability_expected_platform : Error< diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index f9747d9e0b..7e6751c050 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -688,7 +688,8 @@ VersionTuple Parser::ParseVersionTuple(SourceRange &Range) { return VersionTuple(Major); } - if (!VersionNumberSeparator(ThisTokBegin[AfterMajor]) + const char AfterMajorSeparator = ThisTokBegin[AfterMajor]; + if (!VersionNumberSeparator(AfterMajorSeparator) || (AfterMajor + 1 == ActualLength)) { Diag(Tok, diag::err_expected_version); SkipUntil(tok::comma, tok::r_paren, @@ -716,13 +717,17 @@ VersionTuple Parser::ParseVersionTuple(SourceRange &Range) { return VersionTuple(Major, Minor); } + const char AfterMinorSeparator = ThisTokBegin[AfterMinor]; // If what follows is not a '.' or '_', we have a problem. - if (!VersionNumberSeparator(ThisTokBegin[AfterMinor])) { + if (!VersionNumberSeparator(AfterMinorSeparator)) { Diag(Tok, diag::err_expected_version); SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch | StopAtCodeCompletion); return VersionTuple(); } + + if (AfterMajorSeparator != AfterMinorSeparator) + Diag(Tok, diag::warn_expected_consistent_version_separator); // Parse the subminor version. unsigned AfterSubminor = AfterMinor + 1; diff --git a/test/SemaObjC/attr-availability-1.m b/test/SemaObjC/attr-availability-1.m index 317dcf4ace..3a9a7d7ef6 100644 --- a/test/SemaObjC/attr-availability-1.m +++ b/test/SemaObjC/attr-availability-1.m @@ -90,3 +90,8 @@ id NSNibOwner, topNibObjects; } @end + +@interface Mixed +- (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 -- 2.40.0