diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-12-07 00:30:00 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-12-07 00:30:00 +0000 |
commit | b76a97e91dc4bea0b6b3da06c84e02f50cd351d3 (patch) | |
tree | 943d7f63c900ccaca5195f0e67f859ec45a087af | |
parent | 0e35b4ecee380c2b4c33d75da6bc2fb6f6bc7df3 (diff) |
objc: issue deprecated/unavailable diagnostic when
methods with these attributes are sent to receivers
of 'id' type too. // rdar://10459930
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145999 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Sema/Sema.h | 3 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 17 | ||||
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 3 | ||||
-rw-r--r-- | test/ARCMT/checking.m | 1 | ||||
-rw-r--r-- | test/SemaObjC/attr-deprecated.m | 19 |
5 files changed, 34 insertions, 9 deletions
diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 4313ec062d..89e7662f03 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -2276,6 +2276,9 @@ public: bool CanUseDecl(NamedDecl *D); bool DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc, const ObjCInterfaceDecl *UnknownObjCClass=0); + AvailabilityResult DiagnoseAvailabilityOfDecl(NamedDecl *D, + SourceLocation Loc, + const ObjCInterfaceDecl *UnknownObjCClass); std::string getDeletedOrUnavailableSuffix(const FunctionDecl *FD); bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD, ObjCMethodDecl *Getter, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index cc94050a6f..aeae6666dc 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -62,7 +62,8 @@ bool Sema::CanUseDecl(NamedDecl *D) { return true; } -static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S, +AvailabilityResult +Sema::DiagnoseAvailabilityOfDecl( NamedDecl *D, SourceLocation Loc, const ObjCInterfaceDecl *UnknownObjCClass) { // See if this declaration is unavailable or deprecated. @@ -81,22 +82,22 @@ static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S, break; case AR_Deprecated: - S.EmitDeprecationWarning(D, Message, Loc, UnknownObjCClass); + EmitDeprecationWarning(D, Message, Loc, UnknownObjCClass); break; case AR_Unavailable: - if (S.getCurContextAvailability() != AR_Unavailable) { + if (getCurContextAvailability() != AR_Unavailable) { if (Message.empty()) { if (!UnknownObjCClass) - S.Diag(Loc, diag::err_unavailable) << D->getDeclName(); + Diag(Loc, diag::err_unavailable) << D->getDeclName(); else - S.Diag(Loc, diag::warn_unavailable_fwdclass_message) + Diag(Loc, diag::warn_unavailable_fwdclass_message) << D->getDeclName(); } else - S.Diag(Loc, diag::err_unavailable_message) + Diag(Loc, diag::err_unavailable_message) << D->getDeclName() << Message; - S.Diag(D->getLocation(), diag::note_unavailable_here) + Diag(D->getLocation(), diag::note_unavailable_here) << isa<FunctionDecl>(D) << false; } break; @@ -151,7 +152,7 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc, return true; } } - DiagnoseAvailabilityOfDecl(*this, D, Loc, UnknownObjCClass); + DiagnoseAvailabilityOfDecl(D, Loc, UnknownObjCClass); // Warn if this is used but marked unused. if (D->hasAttr<UnusedAttr>()) diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index cc17e6b890..fbae96071e 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -1254,6 +1254,9 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, Method = LookupFactoryMethodInGlobalPool(Sel, SourceRange(LBracLoc, RBracLoc), receiverIsId); + if (Method) + DiagnoseAvailabilityOfDecl(Method, Loc, 0); + } else if (ReceiverType->isObjCClassType() || ReceiverType->isObjCQualifiedClassType()) { // Handle messages to Class. diff --git a/test/ARCMT/checking.m b/test/ARCMT/checking.m index 0e441cb1eb..86afdf0b23 100644 --- a/test/ARCMT/checking.m +++ b/test/ARCMT/checking.m @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -arcmt-check -verify -triple x86_64-apple-darwin10 %s +// XFAIL: * #include "Common.h" diff --git a/test/SemaObjC/attr-deprecated.m b/test/SemaObjC/attr-deprecated.m index e90bbf94ea..571bd30e12 100644 --- a/test/SemaObjC/attr-deprecated.m +++ b/test/SemaObjC/attr-deprecated.m @@ -53,7 +53,7 @@ void t1(A *a) void t2(id a) { - [a f]; + [a f]; // expected-warning {{'f' is deprecated}} } void t3(A<P>* a) @@ -121,3 +121,20 @@ void test(Test2 *foo) { __attribute__((deprecated)) @interface A(Blah) // expected-error{{attributes may not be specified on a category}} @end + +// rdar://10459930 + +@class NSString; +@interface NSDocumentController +{ + id iv; +} +- (void)fileExtensionsFromType:(NSString *)typeName __attribute__((deprecated)); +@end + +@implementation NSDocumentController +- (void) Meth { + [iv fileExtensionsFromType:@"public.text"]; // expected-warning {{'fileExtensionsFromType:' is deprecated}} +} +- (void)fileExtensionsFromType:(NSString *)typeName {} +@end |