[ObjC] add support for properties in attribute 'objc_protocol_requires_explicit_implementation'.

llvm-svn: 201880
This commit is contained in:
Ted Kremenek 2014-02-21 19:41:39 +00:00
parent e76bbba045
commit 38882022af
2 changed files with 34 additions and 4 deletions

View File

@ -1653,12 +1653,13 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
ObjCContainerDecl *CDecl,
bool SynthesizeProperties) {
ObjCContainerDecl::PropertyMap PropMap;
ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl);
if (!SynthesizeProperties) {
ObjCContainerDecl::PropertyMap NoNeedToImplPropMap;
ObjCInterfaceDecl *IDecl;
// Gather properties which need not be implemented in this class
// or category.
if (!(IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl)))
if (!IDecl)
if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl)) {
// For categories, no need to implement properties declared in
// its primary class (and its super classes) if property is
@ -1674,6 +1675,27 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
CollectImmediateProperties(CDecl, PropMap, NoNeedToImplPropMap);
}
// Scan the @interface to see if any of the protocols it adopts
// require an explicit implementation, via attribute
// 'objc_protocol_requires_explicit_implementation'.
if (IDecl)
for (ObjCInterfaceDecl::all_protocol_iterator
PI = IDecl->all_referenced_protocol_begin(),
PE = IDecl->all_referenced_protocol_end();
PI != PE; ++PI) {
ObjCProtocolDecl *PDecl = *PI;
if (!PDecl->hasAttr<ObjCExplicitProtocolImplAttr>())
continue;
// Add the properties of 'PDecl' to the list of properties that
// need to be implemented.
for (ObjCProtocolDecl::prop_iterator
PRI = PDecl->prop_begin(), PRE = PDecl->prop_end();
PRI != PRE; ++PRI) {
ObjCPropertyDecl *PropDecl = *PRI;
PropMap[PRI->getIdentifier()] = PropDecl;
}
}
if (PropMap.empty())
return;

View File

@ -5,7 +5,7 @@
__attribute__((objc_protocol_requires_explicit_implementation))
@protocol Protocol
- (void) theBestOfTimes; // expected-note {{method 'theBestOfTimes' declared here}}
@property (readonly) id theWorstOfTimes;
@property (readonly) id theWorstOfTimes; // expected-note {{property declared here}}
@end
// In this example, ClassA adopts the protocol. We won't
@ -21,7 +21,15 @@ __attribute__((objc_protocol_requires_explicit_implementation))
@interface ClassB : ClassA <Protocol>
@end
@implementation ClassB // expected-warning {{method 'theBestOfTimes' in protocol 'Protocol' not implemented}}
@implementation ClassB // expected-warning {{method 'theBestOfTimes' in protocol 'Protocol' not implemented}} expected-warning {{property 'theWorstOfTimes' requires method 'theWorstOfTimes' to be defined - use @synthesize, @dynamic or provide a method implementation in this class implementation}}
@end
@interface ClassB_Good : ClassA <Protocol>
@end
@implementation ClassB_Good // no-warning
- (void) theBestOfTimes {}
@dynamic theWorstOfTimes;
@end
// Test that inherited protocols do not get the explicit conformance requirement.