summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2014-10-02 17:57:26 +0000
committerFariborz Jahanian <fjahanian@apple.com>2014-10-02 17:57:26 +0000
commitce72e63d1156ff0c7a2b2295900ce06846a2e6d1 (patch)
tree18665110d44df641c0b3c9adb66e004216f08b17
parent7efd054479b0df398af773c415f5f8aa5052f8cf (diff)
downloadbcm5719-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.td3
-rw-r--r--clang/lib/Parse/ParseDecl.cpp9
-rw-r--r--clang/test/SemaObjC/attr-availability-1.m5
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
OpenPOWER on IntegriCloud