forked from OSchip/llvm-project
[ObjC] Avoid the -Wunguarded-availability warnings for protocol
requirements in protocol/class/category declarations The unguarded availability warnings in the protocol requirements of a protocol /class/category declaration can be avoided. This matches the behaviour of Swift's diagnostics. The warnings for deprecated/unavailable protocols are preserved. rdar://33156429 Differential Revision: https://reviews.llvm.org/D35061 llvm-svn: 307368
This commit is contained in:
parent
906e9a1898
commit
cdd596fcde
|
@ -3900,8 +3900,9 @@ public:
|
|||
|
||||
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
|
||||
bool DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
|
||||
const ObjCInterfaceDecl *UnknownObjCClass=nullptr,
|
||||
bool ObjCPropertyAccess=false);
|
||||
const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
|
||||
bool ObjCPropertyAccess = false,
|
||||
bool AvoidPartialAvailabilityChecks = false);
|
||||
void NoteDeletedFunction(FunctionDecl *FD);
|
||||
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD);
|
||||
std::string getDeletedOrUnavailableSuffix(const FunctionDecl *FD);
|
||||
|
|
|
@ -458,7 +458,10 @@ static void diagnoseUseOfProtocols(Sema &TheSema,
|
|||
// Diagnose availability in the context of the ObjC container.
|
||||
Sema::ContextRAII SavedContext(TheSema, CD);
|
||||
for (unsigned i = 0; i < NumProtoRefs; ++i) {
|
||||
(void)TheSema.DiagnoseUseOfDecl(ProtoRefs[i], ProtoLocs[i]);
|
||||
(void)TheSema.DiagnoseUseOfDecl(ProtoRefs[i], ProtoLocs[i],
|
||||
/*UnknownObjCClass=*/nullptr,
|
||||
/*ObjCPropertyAccess=*/false,
|
||||
/*AvoidPartialAvailabilityChecks=*/true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -128,7 +128,8 @@ Sema::ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D,
|
|||
static void
|
||||
DiagnoseAvailabilityOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc,
|
||||
const ObjCInterfaceDecl *UnknownObjCClass,
|
||||
bool ObjCPropertyAccess) {
|
||||
bool ObjCPropertyAccess,
|
||||
bool AvoidPartialAvailabilityChecks = false) {
|
||||
std::string Message;
|
||||
AvailabilityResult Result;
|
||||
const NamedDecl* OffendingDecl;
|
||||
|
@ -138,6 +139,8 @@ DiagnoseAvailabilityOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc,
|
|||
return;
|
||||
|
||||
if (Result == AR_NotYetIntroduced) {
|
||||
if (AvoidPartialAvailabilityChecks)
|
||||
return;
|
||||
if (S.getCurFunctionOrMethodDecl()) {
|
||||
S.getEnclosingFunction()->HasPotentialAvailabilityViolations = true;
|
||||
return;
|
||||
|
@ -275,7 +278,8 @@ void Sema::MaybeSuggestAddingStaticToDecl(const FunctionDecl *Cur) {
|
|||
///
|
||||
bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
|
||||
const ObjCInterfaceDecl *UnknownObjCClass,
|
||||
bool ObjCPropertyAccess) {
|
||||
bool ObjCPropertyAccess,
|
||||
bool AvoidPartialAvailabilityChecks) {
|
||||
if (getLangOpts().CPlusPlus && isa<FunctionDecl>(D)) {
|
||||
// If there were any diagnostics suppressed by template argument deduction,
|
||||
// emit them now.
|
||||
|
@ -360,7 +364,8 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
|
|||
}
|
||||
|
||||
DiagnoseAvailabilityOfDecl(*this, D, Loc, UnknownObjCClass,
|
||||
ObjCPropertyAccess);
|
||||
ObjCPropertyAccess,
|
||||
AvoidPartialAvailabilityChecks);
|
||||
|
||||
DiagnoseUnusedOfDecl(*this, D, Loc);
|
||||
|
||||
|
|
|
@ -263,3 +263,27 @@ void with_local_struct() {
|
|||
new_int x; // expected-warning{{'new_int' is partial}}
|
||||
};
|
||||
}
|
||||
|
||||
// rdar://33156429:
|
||||
// Avoid the warning on protocol requirements.
|
||||
|
||||
AVAILABLE_10_12
|
||||
@protocol NewProtocol // expected-note {{'NewProtocol' has been explicitly marked partial here}}
|
||||
@end
|
||||
|
||||
@protocol ProtocolWithNewProtocolRequirement <NewProtocol> // expected-note {{annotate 'ProtocolWithNewProtocolRequirement' with an availability attribute to silence}}
|
||||
|
||||
@property(copy) id<NewProtocol> prop; // expected-warning {{'NewProtocol' is partial: introduced in macOS 10.12}}
|
||||
|
||||
@end
|
||||
|
||||
@interface BaseClass
|
||||
@end
|
||||
|
||||
@interface ClassWithNewProtocolRequirement : BaseClass <NewProtocol>
|
||||
|
||||
@end
|
||||
|
||||
@interface BaseClass (CategoryWithNewProtocolRequirement) <NewProtocol>
|
||||
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue