]> granicus.if.org Git - clang/commitdiff
Diagnose mixed use of '_' and '.' as version
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 2 Oct 2014 17:57:26 +0000 (17:57 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 2 Oct 2014 17:57:26 +0000 (17:57 +0000)
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
lib/Parse/ParseDecl.cpp
test/SemaObjC/attr-availability-1.m

index cea0ebf5536cfcf49f016d63b80ffc8f08ff36e2..96737ae973063d26ab7627d6b0133ce0f805502e 100644 (file)
@@ -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<
index f9747d9e0b94ae67f72c439c72aa261804b15790..7e6751c05006f304a1ea2b301dcba6a08ca3fea2 100644 (file)
@@ -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;
index 317dcf4ace134a8ebf79fe4e83d0af8abf89f182..3a9a7d7ef6fa7679c65e89d13ce7d113dcf8edb2 100644 (file)
@@ -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