diff options
author | Ted Kremenek <kremenek@apple.com> | 2013-11-20 17:24:03 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2013-11-20 17:24:03 +0000 |
commit | cb42dbe7ad2cd1a9376c25cbd744f7c12f4f46a6 (patch) | |
tree | 539a1fb1214038a8428205dda7617d8ff571fe30 /clang/lib | |
parent | 3cfa97397810aa4d7d25030ff29bf9e9f15dcff3 (diff) | |
download | bcm5719-llvm-cb42dbe7ad2cd1a9376c25cbd744f7c12f4f46a6.tar.gz bcm5719-llvm-cb42dbe7ad2cd1a9376c25cbd744f7c12f4f46a6.zip |
Refine 'deprecated' checking for Objective-C classes/methods.
- If a deprecated class refers to another deprecated class, do not warn.
- @implementations of a deprecated class can refer to other deprecated things.
Fixes <rdar://problem/15407366> and <rdar://problem/15466783>.
llvm-svn: 195259
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 17 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 3 |
2 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 4fe55765d34..cd643118ee9 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -12994,5 +12994,22 @@ Decl *Sema::getObjCDeclContext() const { AvailabilityResult Sema::getCurContextAvailability() const { const Decl *D = cast<Decl>(getCurObjCLexicalContext()); + // If we are within an Objective-C method, we should consult + // both the availability of the method as well as the + // enclosing class. If the class is (say) deprecated, + // the entire method is considered deprecated from the + // purpose of checking if the current context is deprecated. + if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) { + AvailabilityResult R = MD->getAvailability(); + if (R != AR_Available) + return R; + D = MD->getClassInterface(); + } + // If we are within an Objective-c @implementation, it + // gets the same availability context as the @interface. + else if (const ObjCImplementationDecl *ID = + dyn_cast<ObjCImplementationDecl>(D)) { + D = ID->getClassInterface(); + } return D->getAvailability(); } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 22242a5acc9..26c81ef552c 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -111,7 +111,8 @@ static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S, break; case AR_Deprecated: - S.EmitDeprecationWarning(D, Message, Loc, UnknownObjCClass, ObjCPDecl); + if (S.getCurContextAvailability() != AR_Deprecated) + S.EmitDeprecationWarning(D, Message, Loc, UnknownObjCClass, ObjCPDecl); break; case AR_Unavailable: |