[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages
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&id=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 - : diag::warn_partial_
[PATCH] D36200: [Sema] Improve some -Wunguarded-availability diagnostic messages
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
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
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
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
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
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 TVOS