do not warn about uses of deprecated decls when in an out-of-line objc method

whose declaration was declared as deprecated.

llvm-svn: 64658
This commit is contained in:
Chris Lattner
2009-02-16 19:35:30 +00:00
parent 7a855e33df
commit 46d6b13448
2 changed files with 26 additions and 7 deletions

View File

@@ -32,11 +32,31 @@ using namespace clang;
void Sema::DiagnoseUseOfDeprecatedDeclImpl(NamedDecl *D, SourceLocation Loc) {
// See if the decl is deprecated.
if (D->getAttr<DeprecatedAttr>()) {
// If this reference happens *in* a deprecated function or method, don't
// warn. Implementing deprecated stuff requires referencing depreated
// stuff.
NamedDecl *ND = getCurFunctionOrMethodDecl();
if (ND == 0 || !ND->getAttr<DeprecatedAttr>())
// Implementing deprecated stuff requires referencing depreated stuff. Don't
// warn if we are implementing a deprecated construct.
bool isSilenced = false;
if (NamedDecl *ND = getCurFunctionOrMethodDecl()) {
// If this reference happens *in* a deprecated function or method, don't
// warn.
isSilenced = ND->getAttr<DeprecatedAttr>();
// If this is an Objective-C method implementation, check to see if the
// method was deprecated on the declaration, not the definition.
if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ND)) {
// The semantic decl context of a ObjCMethodDecl is the
// ObjCImplementationDecl.
if (ObjCImplementationDecl *Impl
= dyn_cast<ObjCImplementationDecl>(MD->getParent())) {
MD = Impl->getClassInterface()->getMethod(MD->getSelector(),
MD->isInstanceMethod());
isSilenced |= MD && MD->getAttr<DeprecatedAttr>();
}
}
}
if (!isSilenced)
Diag(Loc, diag::warn_deprecated) << D->getDeclName();
}

View File

@@ -22,7 +22,7 @@
- (void)f
{
[self f]; // expected-warning{{'f' is deprecated}}
[self f]; // no warning, the caller is deprecated in its interface.
}
@end
@@ -81,4 +81,3 @@ int t5() {
return f.FooBar; // expected-warning {{warning: 'FooBar' is deprecated}}
}