diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2014-10-02 17:57:26 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-10-02 17:57:26 +0000 |
| commit | ce72e63d1156ff0c7a2b2295900ce06846a2e6d1 (patch) | |
| tree | 18665110d44df641c0b3c9adb66e004216f08b17 | |
| parent | 7efd054479b0df398af773c415f5f8aa5052f8cf (diff) | |
| download | bcm5719-llvm-ce72e63d1156ff0c7a2b2295900ce06846a2e6d1.tar.gz bcm5719-llvm-ce72e63d1156ff0c7a2b2295900ce06846a2e6d1.zip | |
Diagnose mixed use of '_' and '.' as version
separators in my previous patch.
llvm-svn: 218895
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticParseKinds.td | 3 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 9 | ||||
| -rw-r--r-- | clang/test/SemaObjC/attr-availability-1.m | 5 |
3 files changed, 15 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index cea0ebf5536..96737ae9730 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/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<Availability>; 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/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index f9747d9e0b9..7e6751c0500 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/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/clang/test/SemaObjC/attr-availability-1.m b/clang/test/SemaObjC/attr-availability-1.m index 317dcf4ace1..3a9a7d7ef6f 100644 --- a/clang/test/SemaObjC/attr-availability-1.m +++ b/clang/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 |

