[Sema][ObjC] Process category attributes before checking protocol uses

This ensures that any availability attributes are attached to the
category before the availability for the referenced protocols is checked.

rdar://37829755

llvm-svn: 325994
This commit is contained in:
Alex Lorenz 2018-02-23 23:49:43 +00:00
parent b68cef9dd0
commit a9c966d0a9
2 changed files with 25 additions and 4 deletions

View File

@ -1835,6 +1835,13 @@ ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
// FIXME: PushOnScopeChains?
CurContext->addDecl(CDecl);
// Process the attributes before looking at protocols to ensure that the
// availability attribute is attached to the category to provide availability
// checking for protocol uses.
if (AttrList)
ProcessDeclAttributeList(TUScope, CDecl, AttrList);
AddPragmaAttributes(TUScope, CDecl);
if (NumProtoRefs) {
diagnoseUseOfProtocols(*this, CDecl, (ObjCProtocolDecl*const*)ProtoRefs,
NumProtoRefs, ProtoLocs);
@ -1846,10 +1853,6 @@ ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
NumProtoRefs, Context);
}
if (AttrList)
ProcessDeclAttributeList(TUScope, CDecl, AttrList);
AddPragmaAttributes(TUScope, CDecl);
CheckObjCDeclScope(CDecl);
return ActOnObjCContainerStartDefinition(CDecl);
}

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -triple arm64-apple-ios10 -Wunguarded-availability -fblocks -fsyntax-only -verify %s
__attribute__((availability(ios,unavailable)))
@protocol Prot // expected-note {{here}}
@end
@interface A
@end
__attribute__((availability(ios,unavailable)))
@interface A (Cat) <Prot> // No error.
@end
__attribute__((availability(tvos,unavailable)))
@interface B @end
@interface B (Cat) <Prot> // expected-error {{'Prot' is unavailable: not available on iOS}}
@end