forked from OSchip/llvm-project
[ObjC] add support for properties in attribute 'objc_protocol_requires_explicit_implementation'.
llvm-svn: 201880
This commit is contained in:
parent
e76bbba045
commit
38882022af
|
@ -1653,12 +1653,13 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
|
||||||
ObjCContainerDecl *CDecl,
|
ObjCContainerDecl *CDecl,
|
||||||
bool SynthesizeProperties) {
|
bool SynthesizeProperties) {
|
||||||
ObjCContainerDecl::PropertyMap PropMap;
|
ObjCContainerDecl::PropertyMap PropMap;
|
||||||
|
ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl);
|
||||||
|
|
||||||
if (!SynthesizeProperties) {
|
if (!SynthesizeProperties) {
|
||||||
ObjCContainerDecl::PropertyMap NoNeedToImplPropMap;
|
ObjCContainerDecl::PropertyMap NoNeedToImplPropMap;
|
||||||
ObjCInterfaceDecl *IDecl;
|
|
||||||
// Gather properties which need not be implemented in this class
|
// Gather properties which need not be implemented in this class
|
||||||
// or category.
|
// or category.
|
||||||
if (!(IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl)))
|
if (!IDecl)
|
||||||
if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl)) {
|
if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl)) {
|
||||||
// For categories, no need to implement properties declared in
|
// For categories, no need to implement properties declared in
|
||||||
// its primary class (and its super classes) if property is
|
// 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);
|
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())
|
if (PropMap.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
__attribute__((objc_protocol_requires_explicit_implementation))
|
__attribute__((objc_protocol_requires_explicit_implementation))
|
||||||
@protocol Protocol
|
@protocol Protocol
|
||||||
- (void) theBestOfTimes; // expected-note {{method 'theBestOfTimes' declared here}}
|
- (void) theBestOfTimes; // expected-note {{method 'theBestOfTimes' declared here}}
|
||||||
@property (readonly) id theWorstOfTimes;
|
@property (readonly) id theWorstOfTimes; // expected-note {{property declared here}}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// In this example, ClassA adopts the protocol. We won't
|
// In this example, ClassA adopts the protocol. We won't
|
||||||
|
@ -21,7 +21,15 @@ __attribute__((objc_protocol_requires_explicit_implementation))
|
||||||
@interface ClassB : ClassA <Protocol>
|
@interface ClassB : ClassA <Protocol>
|
||||||
@end
|
@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
|
@end
|
||||||
|
|
||||||
// Test that inherited protocols do not get the explicit conformance requirement.
|
// Test that inherited protocols do not get the explicit conformance requirement.
|
||||||
|
|
Loading…
Reference in New Issue