[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-14 Thread Phabricator via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL310874: [Sema] Improve some -Wunguarded-availability 
diagnostics (authored by epilk).

Changed prior to commit:
  https://reviews.llvm.org/D36200?vs=109252=111051#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D36200

Files:
  cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
  cfe/trunk/lib/Sema/SemaDeclAttr.cpp
  cfe/trunk/test/SemaObjC/attr-availability.m
  cfe/trunk/test/SemaObjC/unguarded-availability-new.m
  cfe/trunk/test/SemaObjC/unguarded-availability.m

Index: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
===
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp
@@ -7128,7 +7128,83 @@
   if (!ShouldDiagnoseAvailabilityInContext(S, K, DeclVersion, Ctx))
 return;
 
+  // The declaration can have multiple availability attributes, we are looking
+  // at one of them.
+  const AvailabilityAttr *A = getAttrForPlatform(S.Context, OffendingDecl);
+  if (A && A->isInherited()) {
+for (const Decl *Redecl = OffendingDecl->getMostRecentDecl(); Redecl;
+ Redecl = Redecl->getPreviousDecl()) {
+  const AvailabilityAttr *AForRedecl =
+  getAttrForPlatform(S.Context, Redecl);
+  if (AForRedecl && !AForRedecl->isInherited()) {
+// If D is a declaration with inherited attributes, the note should
+// point to the declaration with actual attributes.
+NoteLocation = Redecl->getLocation();
+break;
+  }
+}
+  }
+
   switch (K) {
+  case AR_NotYetIntroduced: {
+// We would like to emit the diagnostic even if -Wunguarded-availability is
+// not specified for deployment targets >= to iOS 11 or equivalent or
+// for declarations that were introduced in iOS 11 (macOS 10.13, ...) or
+// later.
+const AvailabilityAttr *AA =
+getAttrForPlatform(S.getASTContext(), OffendingDecl);
+VersionTuple Introduced = AA->getIntroduced();
+
+bool UseNewWarning = shouldDiagnoseAvailabilityByDefault(
+S.Context, S.Context.getTargetInfo().getPlatformMinVersion(),
+Introduced);
+unsigned Warning = UseNewWarning ? diag::warn_unguarded_availability_new
+ : diag::warn_unguarded_availability;
+
+S.Diag(Loc, Warning)
+<< OffendingDecl
+<< AvailabilityAttr::getPrettyPlatformName(
+   S.getASTContext().getTargetInfo().getPlatformName())
+<< Introduced.getAsString();
+
+S.Diag(OffendingDecl->getLocation(), diag::note_availability_specified_here)
+<< OffendingDecl << /* partial */ 3;
+
+if (const auto *Enclosing = findEnclosingDeclToAnnotate(Ctx)) {
+  if (auto *TD = dyn_cast(Enclosing))
+if (TD->getDeclName().isEmpty()) {
+  S.Diag(TD->getLocation(),
+ diag::note_decl_unguarded_availability_silence)
+  << /*Anonymous*/ 1 << TD->getKindName();
+  return;
+}
+  auto FixitNoteDiag =
+  S.Diag(Enclosing->getLocation(),
+ diag::note_decl_unguarded_availability_silence)
+  << /*Named*/ 0 << Enclosing;
+  // Don't offer a fixit for declarations with availability attributes.
+  if (Enclosing->hasAttr())
+return;
+  if (!S.getPreprocessor().isMacroDefined("API_AVAILABLE"))
+return;
+  Optional Insertion = createAttributeInsertion(
+  Enclosing, S.getSourceManager(), S.getLangOpts());
+  if (!Insertion)
+return;
+  std::string PlatformName =
+  AvailabilityAttr::getPlatformNameSourceSpelling(
+  S.getASTContext().getTargetInfo().getPlatformName())
+  .lower();
+  std::string Introduced =
+  OffendingDecl->getVersionIntroduced().getAsString();
+  FixitNoteDiag << FixItHint::CreateInsertion(
+  Insertion->Loc,
+  (llvm::Twine(Insertion->Prefix) + "API_AVAILABLE(" + PlatformName +
+   "(" + Introduced + "))" + Insertion->Suffix)
+  .str());
+}
+return;
+  }
   case AR_Deprecated:
 diag = !ObjCPropertyAccess ? diag::warn_deprecated
: diag::warn_property_method_deprecated;
@@ -7193,28 +7269,6 @@
 }
 break;
 
-  case AR_NotYetIntroduced: {
-// We would like to emit the diagnostic even if -Wunguarded-availability is
-// not specified for deployment targets >= to iOS 11 or equivalent or
-// for declarations that were introduced in iOS 11 (macOS 10.13, ...) or
-// later.
-const AvailabilityAttr *AA =
-getAttrForPlatform(S.getASTContext(), OffendingDecl);
-VersionTuple Introduced = AA->getIntroduced();
-bool NewWarning = shouldDiagnoseAvailabilityByDefault(
-S.Context, S.Context.getTargetInfo().getPlatformMinVersion(),
-Introduced);
-diag = NewWarning ? diag::warn_partial_availability_new
-  : 

[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-14 Thread Alex Lorenz via Phabricator via cfe-commits
arphaman accepted this revision.
arphaman added a comment.
This revision is now accepted and ready to land.

Sorry for the delay, LGTM


https://reviews.llvm.org/D36200



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-14 Thread Erik Pilkington via Phabricator via cfe-commits
erik.pilkington added a comment.

Ping!


https://reviews.llvm.org/D36200



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-02 Thread Alex Lorenz via Phabricator via cfe-commits
arphaman added a comment.

Right, sorry, I didn't realize that code was moved.


https://reviews.llvm.org/D36200



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-02 Thread Erik Pilkington via Phabricator via cfe-commits
erik.pilkington added a comment.

In https://reviews.llvm.org/D36200#829104, @arphaman wrote:

> This needs a test for the fixits as well, see test/FixIt/fixit-availability*


Why? This patch doesn't change the behavior of the fixits, so there isn't any 
new behavior to test.


https://reviews.llvm.org/D36200



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-02 Thread Alex Lorenz via Phabricator via cfe-commits
arphaman added a comment.

This needs a test for the fixits as well, see test/FixIt/fixit-availability*


https://reviews.llvm.org/D36200



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages

2017-08-01 Thread Erik Pilkington via Phabricator via cfe-commits
erik.pilkington created this revision.

This patch improves the decl-level unguarded availability warnings to use the 
same messages as the function-level ones. This makes the diagnostic have 
different parameters than deprecated/unavailable, so I moved some things around 
in DoEmitAvailabilityWarning so that partial diagnostics are handled separately.

rdar://33543523

Thanks,
Erik


https://reviews.llvm.org/D36200

Files:
  include/clang/Basic/DiagnosticSemaKinds.td
  lib/Sema/SemaDeclAttr.cpp
  test/SemaObjC/attr-availability.m
  test/SemaObjC/unguarded-availability-new.m
  test/SemaObjC/unguarded-availability.m

Index: test/SemaObjC/unguarded-availability.m
===
--- test/SemaObjC/unguarded-availability.m
+++ test/SemaObjC/unguarded-availability.m
@@ -74,7 +74,7 @@
 __attribute__((objc_root_class))
 AVAILABLE_10_11 @interface Class_10_11 { // expected-note{{annotate 'Class_10_11' with an availability attribute to silence}}
   int_10_11 foo;
-  int_10_12 bar; // expected-warning {{'int_10_12' is partial: introduced in macOS 10.12}}
+  int_10_12 bar; // expected-warning {{'int_10_12' is only available on macOS 10.12 or newer}}
 }
 - (void)method1;
 - (void)method2;
@@ -127,7 +127,7 @@
   };
 }
 
-void test_params(int_10_12 x); // expected-warning {{'int_10_12' is partial: introduced in macOS 10.12}} expected-note{{annotate 'test_params' with an availability attribute to silence}}
+void test_params(int_10_12 x); // expected-warning {{'int_10_12' is only available on macOS 10.12 or newer}} expected-note{{annotate 'test_params' with an availability attribute to silence this warning}}
 
 void test_params2(int_10_12 x) AVAILABLE_10_12; // no warn
 
@@ -238,29 +238,29 @@
 #endif
 
 struct InStruct { // expected-note{{annotate 'InStruct' with an availability attribute to silence}}
-  new_int mem; // expected-warning{{'new_int' is partial}}
+  new_int mem; // expected-warning{{'new_int' is only available on macOS 10.12 or newer}}
 
-  struct { new_int mem; } anon; // expected-warning{{'new_int' is partial}} expected-note{{annotate anonymous struct with an availability attribute}}
+  struct { new_int mem; } anon; // expected-warning{{'new_int' is only available on macOS 10.12 or newer}} expected-note{{annotate anonymous struct with an availability attribute to silence}}
 };
 
 #ifdef OBJCPP
 static constexpr int AVAILABLE_10_12 SomeConstexprValue = 2; // expected-note{{marked partial here}}
 typedef enum { // expected-note{{annotate anonymous enum with an availability attribute}}
-  SomeValue = SomeConstexprValue // expected-warning{{'SomeConstexprValue' is partial}} 
+  SomeValue = SomeConstexprValue // expected-warning{{'SomeConstexprValue' is only available on macOS 10.12 or newer}} 
 } SomeEnum;
 #endif
 
 @interface InInterface
--(new_int)meth; // expected-warning{{'new_int' is partial}} expected-note{{annotate 'meth' with an availability attribute}}
+-(new_int)meth; // expected-warning{{'new_int' is only available on macOS 10.12 or newer}} expected-note{{annotate 'meth' with an availability attribute}}
 @end
 
 @interface Proper // expected-note{{annotate 'Proper' with an availability attribute}}
-@property (class) new_int x; // expected-warning{{'new_int' is partial}}
+@property (class) new_int x; // expected-warning{{'new_int' is only available}}
 @end
 
 void with_local_struct() {
   struct local { // expected-note{{annotate 'local' with an availability attribute}}
-new_int x; // expected-warning{{'new_int' is partial}}
+new_int x; // expected-warning{{'new_int' is only available}}
   };
 }
 
@@ -273,7 +273,7 @@
 
 @protocol ProtocolWithNewProtocolRequirement  // expected-note {{annotate 'ProtocolWithNewProtocolRequirement' with an availability attribute to silence}}
 
-@property(copy) id prop; // expected-warning {{'NewProtocol' is partial: introduced in macOS 10.12}}
+@property(copy) id prop; // expected-warning {{'NewProtocol' is only available on macOS 10.12 or newer}}
 
 @end
 
Index: test/SemaObjC/unguarded-availability-new.m
===
--- test/SemaObjC/unguarded-availability-new.m
+++ test/SemaObjC/unguarded-availability-new.m
@@ -96,16 +96,16 @@
 FUNC_AVAILABLE new_int x;
 #ifndef NO_WARNING
 #ifdef MAC
-  // expected-warning@-3 {{'new_int' is partial: introduced in macOS 10.14}} expected-note@-3 {{annotate 'x' with an availability attribute to silence}}
+  // expected-warning@-3 {{'new_int' is only available on macOS 10.14 or newer}} expected-note@-3 {{annotate 'x' with an availability attribute to silence this warning}}
 #endif
 #ifdef IOS
-  // expected-warning@-6 {{'new_int' is partial: introduced in iOS 12}} expected-note@-6 {{annotate 'x' with an availability attribute to silence}}
+  // expected-warning@-6 {{'new_int' is only available on iOS 12 or newer}} expected-note@-6 {{annotate 'x' with an availability attribute to silence this warning}}
 #endif
 #ifdef