r277175 - Reapply r277058: "[ObjC] Consider availability of context when emitting availability warnings"

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 1 10:50:40 PDT 2016


Hi Erik,

with this change clangs warns on this program:

$ cat test.mm
#import <Cocoa/Cocoa.h>
@interface AXPlatformNodeCocoa : NSObject
@end
@implementation AXPlatformNodeCocoa
- (NSArray*)accessibilityAttributeNames {
  NSArray* const kTextfieldAttributes = @[
    NSAccessibilityPlaceholderValueAttribute,
  ];
  return kTextfieldAttributes;
}
@end

$ bin/clang -c test.mm -isysroot $(xcrun -show-sdk-path)
-Wpartial-availability -mmacosx-version-min=10.7
test.mm:9:5: warning: 'NSAccessibilityPlaceholderValueAttribute' is
partial: introduced in macOS 10.6 [-Wpartial-availability]
    NSAccessibilityPlaceholderValueAttribute,
    ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSAccessibilityConstants.h:85:31:
note:
      'NSAccessibilityPlaceholderValueAttribute' has been explicitly marked
partial here

Given that I'm building with -mmacosx-version-min=10.7 it seems strange to
warn about something introduced in 10.6. This is probably not doing what it
should?

Thanks,
Nico


On Fri, Jul 29, 2016 at 1:37 PM, Erik Pilkington via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: epilk
> Date: Fri Jul 29 12:37:38 2016
> New Revision: 277175
>
> URL: http://llvm.org/viewvc/llvm-project?rev=277175&view=rev
> Log:
> Reapply r277058: "[ObjC] Consider availability of context when emitting
> availability warnings"
>
> Modified:
>     cfe/trunk/include/clang/AST/DeclBase.h
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/lib/AST/DeclBase.cpp
>     cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>     cfe/trunk/lib/Sema/SemaExpr.cpp
>     cfe/trunk/test/SemaObjC/attr-availability.m
>
> Modified: cfe/trunk/include/clang/AST/DeclBase.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=277175&r1=277174&r2=277175&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclBase.h (original)
> +++ cfe/trunk/include/clang/AST/DeclBase.h Fri Jul 29 12:37:38 2016
> @@ -17,6 +17,7 @@
>  #include "clang/AST/AttrIterator.h"
>  #include "clang/AST/DeclarationName.h"
>  #include "clang/Basic/Specifiers.h"
> +#include "clang/Basic/VersionTuple.h"
>  #include "llvm/ADT/PointerUnion.h"
>  #include "llvm/ADT/iterator.h"
>  #include "llvm/ADT/iterator_range.h"
> @@ -603,7 +604,12 @@ public:
>    /// AR_Available, will be set to a (possibly empty) message
>    /// describing why the declaration has not been introduced, is
>    /// deprecated, or is unavailable.
> -  AvailabilityResult getAvailability(std::string *Message = nullptr)
> const;
> +  ///
> +  /// \param EnclosingVersion The version to compare with. If empty,
> assume the
> +  /// deployment target version.
> +  AvailabilityResult
> +  getAvailability(std::string *Message = nullptr,
> +                  VersionTuple EnclosingVersion = VersionTuple()) const;
>
>    /// \brief Determine whether this declaration is marked 'deprecated'.
>    ///
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=277175&r1=277174&r2=277175&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jul 29 12:37:38 2016
> @@ -9596,7 +9596,12 @@ public:
>    }
>
>    AvailabilityResult getCurContextAvailability() const;
> -
> +
> +  /// \brief Get the verison that this context implies.
> +  /// For instance, a method in an interface that is annotated with an
> +  /// availability attribuite effectively has the availability of the
> interface.
> +  VersionTuple getVersionForDecl(const Decl *Ctx) const;
> +
>    const DeclContext *getCurObjCLexicalContext() const {
>      const DeclContext *DC = getCurLexicalContext();
>      // A category implicitly has the attribute of the interface.
>
> Modified: cfe/trunk/lib/AST/DeclBase.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=277175&r1=277174&r2=277175&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
> +++ cfe/trunk/lib/AST/DeclBase.cpp Fri Jul 29 12:37:38 2016
> @@ -400,11 +400,12 @@ const Attr *Decl::getDefiningAttr() cons
>  /// diagnostics.
>  static AvailabilityResult CheckAvailability(ASTContext &Context,
>                                              const AvailabilityAttr *A,
> -                                            std::string *Message) {
> -  VersionTuple TargetMinVersion =
> -    Context.getTargetInfo().getPlatformMinVersion();
> +                                            std::string *Message,
> +                                            VersionTuple
> EnclosingVersion) {
> +  if (EnclosingVersion.empty())
> +    EnclosingVersion = Context.getTargetInfo().getPlatformMinVersion();
>
> -  if (TargetMinVersion.empty())
> +  if (EnclosingVersion.empty())
>      return AR_Available;
>
>    // Check if this is an App Extension "platform", and if so chop off
> @@ -449,7 +450,7 @@ static AvailabilityResult CheckAvailabil
>
>    // Make sure that this declaration has already been introduced.
>    if (!A->getIntroduced().empty() &&
> -      TargetMinVersion < A->getIntroduced()) {
> +      EnclosingVersion < A->getIntroduced()) {
>      if (Message) {
>        Message->clear();
>        llvm::raw_string_ostream Out(*Message);
> @@ -463,7 +464,7 @@ static AvailabilityResult CheckAvailabil
>    }
>
>    // Make sure that this declaration hasn't been obsoleted.
> -  if (!A->getObsoleted().empty() && TargetMinVersion >=
> A->getObsoleted()) {
> +  if (!A->getObsoleted().empty() && EnclosingVersion >=
> A->getObsoleted()) {
>      if (Message) {
>        Message->clear();
>        llvm::raw_string_ostream Out(*Message);
> @@ -477,7 +478,7 @@ static AvailabilityResult CheckAvailabil
>    }
>
>    // Make sure that this declaration hasn't been deprecated.
> -  if (!A->getDeprecated().empty() && TargetMinVersion >=
> A->getDeprecated()) {
> +  if (!A->getDeprecated().empty() && EnclosingVersion >=
> A->getDeprecated()) {
>      if (Message) {
>        Message->clear();
>        llvm::raw_string_ostream Out(*Message);
> @@ -493,9 +494,10 @@ static AvailabilityResult CheckAvailabil
>    return AR_Available;
>  }
>
> -AvailabilityResult Decl::getAvailability(std::string *Message) const {
> +AvailabilityResult Decl::getAvailability(std::string *Message,
> +                                         VersionTuple EnclosingVersion)
> const {
>    if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
> -    return FTD->getTemplatedDecl()->getAvailability(Message);
> +    return FTD->getTemplatedDecl()->getAvailability(Message,
> EnclosingVersion);
>
>    AvailabilityResult Result = AR_Available;
>    std::string ResultMessage;
> @@ -520,7 +522,7 @@ AvailabilityResult Decl::getAvailability
>
>      if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
>        AvailabilityResult AR = CheckAvailability(getASTContext(),
> Availability,
> -                                                Message);
> +                                                Message,
> EnclosingVersion);
>
>        if (AR == AR_Unavailable)
>          return AR_Unavailable;
> @@ -579,8 +581,8 @@ bool Decl::isWeakImported() const {
>        return true;
>
>      if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
> -      if (CheckAvailability(getASTContext(), Availability,
> -                            nullptr) == AR_NotYetIntroduced)
> +      if (CheckAvailability(getASTContext(), Availability, nullptr,
> +                            VersionTuple()) == AR_NotYetIntroduced)
>          return true;
>      }
>    }
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=277175&r1=277174&r2=277175&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Jul 29 12:37:38 2016
> @@ -6484,3 +6484,26 @@ void Sema::EmitAvailabilityWarning(Avail
>    DoEmitAvailabilityWarning(*this, AD, Ctx, D, Message, Loc,
> UnknownObjCClass,
>                              ObjCProperty, ObjCPropertyAccess);
>  }
> +
> +VersionTuple Sema::getVersionForDecl(const Decl *D) const {
> +  assert(D && "Expected a declaration here!");
> +
> +  VersionTuple DeclVersion;
> +  if (const auto *AA = getAttrForPlatform(getASTContext(), D))
> +    DeclVersion = AA->getIntroduced();
> +
> +  const ObjCInterfaceDecl *Interface = nullptr;
> +
> +  if (const auto *MD = dyn_cast<ObjCMethodDecl>(D))
> +    Interface = MD->getClassInterface();
> +  else if (const auto *ID = dyn_cast<ObjCImplementationDecl>(D))
> +    Interface = ID->getClassInterface();
> +
> +  if (Interface) {
> +    if (const auto *AA = getAttrForPlatform(getASTContext(), Interface))
> +      if (AA->getIntroduced() > DeclVersion)
> +        DeclVersion = AA->getIntroduced();
> +  }
> +
> +  return DeclVersion;
> +}
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=277175&r1=277174&r2=277175&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jul 29 12:37:38 2016
> @@ -107,9 +107,14 @@ static AvailabilityResult
>  DiagnoseAvailabilityOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc,
>                             const ObjCInterfaceDecl *UnknownObjCClass,
>                             bool ObjCPropertyAccess) {
> -  // See if this declaration is unavailable or deprecated.
> +  VersionTuple ContextVersion;
> +  if (const DeclContext *DC = S.getCurObjCLexicalContext())
> +    ContextVersion = S.getVersionForDecl(cast<Decl>(DC));
> +
> +  // See if this declaration is unavailable, deprecated, or partial in the
> +  // current context.
>    std::string Message;
> -  AvailabilityResult Result = D->getAvailability(&Message);
> +  AvailabilityResult Result = D->getAvailability(&Message,
> ContextVersion);
>
>    // For typedefs, if the typedef declaration appears available look
>    // to the underlying type to see if it is more restrictive.
> @@ -117,7 +122,7 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name
>      if (Result == AR_Available) {
>        if (const TagType *TT = TD->getUnderlyingType()->getAs<TagType>()) {
>          D = TT->getDecl();
> -        Result = D->getAvailability(&Message);
> +        Result = D->getAvailability(&Message, ContextVersion);
>          continue;
>        }
>      }
> @@ -128,7 +133,7 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name
>    if (ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(D)) {
>      if (IDecl->getDefinition()) {
>        D = IDecl->getDefinition();
> -      Result = D->getAvailability(&Message);
> +      Result = D->getAvailability(&Message, ContextVersion);
>      }
>    }
>
> @@ -136,7 +141,7 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name
>      if (Result == AR_Available) {
>        const DeclContext *DC = ECD->getDeclContext();
>        if (const EnumDecl *TheEnumDecl = dyn_cast<EnumDecl>(DC))
> -        Result = TheEnumDecl->getAvailability(&Message);
> +        Result = TheEnumDecl->getAvailability(&Message, ContextVersion);
>      }
>
>    const ObjCPropertyDecl *ObjCPDecl = nullptr;
> @@ -144,7 +149,8 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name
>        Result == AR_NotYetIntroduced) {
>      if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
>        if (const ObjCPropertyDecl *PD = MD->findPropertyDecl()) {
> -        AvailabilityResult PDeclResult = PD->getAvailability(nullptr);
> +        AvailabilityResult PDeclResult =
> +            PD->getAvailability(nullptr, ContextVersion);
>          if (PDeclResult == Result)
>            ObjCPDecl = PD;
>        }
> @@ -198,7 +204,7 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name
>        break;
>
>      }
> -    return Result;
> +  return Result;
>  }
>
>  /// \brief Emit a note explaining that this function is deleted.
>
> Modified: cfe/trunk/test/SemaObjC/attr-availability.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-availability.m?rev=277175&r1=277174&r2=277175&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaObjC/attr-availability.m (original)
> +++ cfe/trunk/test/SemaObjC/attr-availability.m Fri Jul 29 12:37:38 2016
> @@ -294,3 +294,34 @@ __attribute__((objc_root_class))
>    [obj method]; // expected-error{{'method' is unavailable}}
>  }
>  @end
> +
> +#if defined(WARN_PARTIAL)
> +
> +int fn_10_7() __attribute__((availability(macosx, introduced=10.7))); //
> expected-note{{marked partial here}}
> +int fn_10_8() __attribute__((availability(macosx, introduced=10.8))) { //
> expected-note{{marked partial here}}
> +  return fn_10_7();
> +}
> +
> +__attribute__((objc_root_class))
> + at interface LookupAvailabilityBase
> +-(void) method1;
> + at end
> +
> + at implementation LookupAvailabilityBase
> +-(void)method1 { fn_10_7(); } // expected-warning{{partial}}
> expected-note{{explicitly redeclare}}
> + at end
> +
> +__attribute__((availability(macosx, introduced=10.7)))
> + at interface LookupAvailability : LookupAvailabilityBase
> +- (void)method2;
> +- (void)method3;
> +- (void)method4 __attribute__((availability(macosx, introduced=10.8)));
> + at end
> +
> + at implementation LookupAvailability
> +-(void)method2 { fn_10_7(); }
> +-(void)method3 { fn_10_8(); } // expected-warning{{partial}}
> expected-note{{explicitly redeclare}}
> +-(void)method4 { fn_10_8(); }
> + at end
> +
> +#endif
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160801/f7d253cd/attachment-0001.html>


More information about the cfe-commits mailing list