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 | 6bdeb14d5d347b17c9bde8ab39c9d69b16a56a13 (patch) | |
tree | fca289267a31bbd33d2d86c578ef42ef8f43278e /clang/lib/Sema | |
parent | 61e6d987bf9d1bf661ff6655536c307e2a24fd96 (diff) | |
download | bcm5719-llvm-6bdeb14d5d347b17c9bde8ab39c9d69b16a56a13.tar.gz bcm5719-llvm-6bdeb14d5d347b17c9bde8ab39c9d69b16a56a13.zip |
objc: issue deprecated/unavailable diagnostic when
methods with these attributes are sent to receivers
of 'id' type too. // rdar://10459930
llvm-svn: 145999
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 17 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 3 |
2 files changed, 12 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index cc94050a6f9..aeae6666dc9 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/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/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index cc17e6b890d..fbae96071e3 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/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. |