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@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)) > +@interface LookupAvailabilityBase > +-(void) method1; > +@end > + > +@implementation LookupAvailabilityBase > +-(void)method1 { fn_10_7(); } // expected-warning{{partial}} > expected-note{{explicitly redeclare}} > +@end > + > +__attribute__((availability(macosx, introduced=10.7))) > +@interface LookupAvailability : LookupAvailabilityBase > +- (void)method2; > +- (void)method3; > +- (void)method4 __attribute__((availability(macosx, introduced=10.8))); > +@end > + > +@implementation LookupAvailability > +-(void)method2 { fn_10_7(); } > +-(void)method3 { fn_10_8(); } // expected-warning{{partial}} > expected-note{{explicitly redeclare}} > +-(void)method4 { fn_10_8(); } > +@end > + > +#endif > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits