if (!Method)
Method = ClassDecl->lookupInstanceMethod(Sel);
+ if (Method && Method->getAttr<DeprecatedAttr>())
+ Diag(receiverLoc, diag::warn_deprecated) << Method->getDeclName();
+
if (CheckMessageArgumentTypes(ArgExprs, NumArgs, Sel, Method, true,
lbrac, rbrac, returnType))
return true;
Method = SuperDecl->lookupInstanceMethod(Sel);
}
+ if (Method && Method->getAttr<DeprecatedAttr>())
+ Diag(receiverLoc, diag::warn_deprecated) << Method->getDeclName();
+
if (CheckMessageArgumentTypes(ArgExprs, NumArgs, Sel, Method, false,
lbrac, rbrac, returnType))
return true;
if (ObjCImplementationDecl *ImpDecl =
ObjCImplementations[ClassDecl->getIdentifier()])
Method = ImpDecl->getClassMethod(Sel);
+
+ if (Method && Method->getAttr<DeprecatedAttr>())
+ Diag(receiverLoc, diag::warn_deprecated) << Method->getDeclName();
}
if (!Method)
Method = FactoryMethodPool[Sel].Method;
if (!Method && !OCIReceiver->qual_empty())
Diag(lbrac, diag::warn_method_not_found_in_protocol)
<< Sel << SourceRange(lbrac, rbrac);
+
+ if (Method && Method->getAttr<DeprecatedAttr>())
+ Diag(receiverLoc, diag::warn_deprecated) << Method->getDeclName();
} else {
Diag(lbrac, diag::error_bad_receiver_type)
<< RExpr->getType() << RExpr->getSourceRange();
--- /dev/null
+// RUN: clang %s -fsyntax-only -verify
+
+@interface A
++ (void)F __attribute__((deprecated));
+- (void)f __attribute__((deprecated));
+@end
+
+@implementation A
++ (void)F __attribute__((deprecated))
+{
+ [self F]; // expected-warning{{'F' is deprecated}}
+}
+
+- (void)g
+{
+ [self f]; // expected-warning{{'f' is deprecated}}
+}
+
+- (void)f
+{
+ [self f]; // expected-warning{{'f' is deprecated}}
+}
+@end
+
+@interface B: A
+@end
+
+@implementation B
++ (void)G
+{
+ [super F]; // expected-warning{{'F' is deprecated}}
+}
+
+- (void)g
+{
+ [super f]; // // expected-warning{{'f' is deprecated}}
+}
+@end
+
+@protocol P
+- (void)p __attribute__((deprecated));
+@end
+
+void t1(A *a)
+{
+ [A F]; // expected-warning{{'F' is deprecated}}
+ [a f]; // expected-warning{{'f' is deprecated}}
+}
+
+void t2(id a)
+{
+ [a f];
+}
+
+void t3(A<P>* a)
+{
+ [a f]; // expected-warning{{'f' is deprecated}}
+ [a p]; // expected-warning{{'p' is deprecated}}
+}
+
+void t4(Class c)
+{
+ [c F];
+}
+