diff options
| author | Ted Kremenek <kremenek@apple.com> | 2014-02-21 19:41:34 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2014-02-21 19:41:34 +0000 |
| commit | 348e88c36ae2408075a6f4861d82463c86904ab8 (patch) | |
| tree | 24962524b0588f9de49499b7058145040a289c57 /clang | |
| parent | 7e812951533629797fc40517c2b9cc7165ce2186 (diff) | |
| download | bcm5719-llvm-348e88c36ae2408075a6f4861d82463c86904ab8.tar.gz bcm5719-llvm-348e88c36ae2408075a6f4861d82463c86904ab8.zip | |
[ObjC] Change default property synthesis logic to not completely skip DiagnoseUnimplementedProperties.
We're going to extend DiagnoseUnimplementedProperties shortly to look for more cases
that aren't handled by default property synthesis.
llvm-svn: 201878
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/DeclObjC.h | 5 | ||||
| -rw-r--r-- | clang/include/clang/Sema/Sema.h | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 42 |
4 files changed, 37 insertions, 29 deletions
diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 3947e35cbcb..2c3c0520a6e 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -1228,10 +1228,11 @@ public: /// including in all categories except for category passed /// as argument. ObjCMethodDecl *lookupPropertyAccessor(const Selector Sel, - const ObjCCategoryDecl *Cat) const { + const ObjCCategoryDecl *Cat, + bool followsSuper = true) const { return lookupMethod(Sel, true/*isInstance*/, false/*shallowCategoryLookup*/, - true /* followsSuper */, + followsSuper /* followsSuper */, Cat); } diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 6ed43b2cc83..864142ddffa 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -2658,7 +2658,8 @@ public: /// DiagnoseUnimplementedProperties - This routine warns on those properties /// which must be implemented by this implementation. void DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl, - ObjCContainerDecl *CDecl); + ObjCContainerDecl *CDecl, + bool SynthesizeProperties); /// DefaultSynthesizeProperties - This routine default synthesizes all /// properties which must be synthesized in the class's \@implementation. diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 8337c1f7e5d..86e16212a3a 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -1927,12 +1927,13 @@ void Sema::ImplMethodsVsClassMethods(Scope *S, ObjCImplDecl* IMPDecl, // Check and see if properties declared in the interface have either 1) // an implementation or 2) there is a @synthesize/@dynamic implementation // of the property in the @implementation. - if (const ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl)) - if (!(LangOpts.ObjCDefaultSynthProperties && - LangOpts.ObjCRuntime.isNonFragile()) || - IDecl->isObjCRequiresPropertyDefs()) - DiagnoseUnimplementedProperties(S, IMPDecl, CDecl); - + if (const ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl)) { + bool SynthesizeProperties = LangOpts.ObjCDefaultSynthProperties && + LangOpts.ObjCRuntime.isNonFragile() && + !IDecl->isObjCRequiresPropertyDefs(); + DiagnoseUnimplementedProperties(S, IMPDecl, CDecl, SynthesizeProperties); + } + SelectorSet ClsMap; for (ObjCImplementationDecl::classmeth_iterator I = IMPDecl->classmeth_begin(), @@ -1978,7 +1979,8 @@ void Sema::ImplMethodsVsClassMethods(Scope *S, ObjCImplDecl* IMPDecl, E = C->protocol_end(); PI != E; ++PI) CheckProtocolMethodDefs(*this, IMPDecl->getLocation(), *PI, IncompleteImpl, InsMap, ClsMap, CDecl); - DiagnoseUnimplementedProperties(S, IMPDecl, CDecl); + DiagnoseUnimplementedProperties(S, IMPDecl, CDecl, + /* SynthesizeProperties */ false); } } else llvm_unreachable("invalid ObjCContainerDecl type."); diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 730907e5b90..67be198f8de 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -1650,26 +1650,30 @@ static void DiagnoseUnimplementedAccessor(Sema &S, } void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl, - ObjCContainerDecl *CDecl) { - ObjCContainerDecl::PropertyMap NoNeedToImplPropMap; - ObjCInterfaceDecl *IDecl; - // Gather properties which need not be implemented in this class - // or category. - if (!(IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl))) - 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 - // declared in one of those containers. - if ((IDecl = C->getClassInterface())) { - ObjCInterfaceDecl::PropertyDeclOrder PO; - IDecl->collectPropertiesToImplement(NoNeedToImplPropMap, PO); - } - } - if (IDecl) - CollectSuperClassPropertyImplementations(IDecl, NoNeedToImplPropMap); - + ObjCContainerDecl *CDecl, + bool SynthesizeProperties) { ObjCContainerDecl::PropertyMap PropMap; - CollectImmediateProperties(CDecl, PropMap, NoNeedToImplPropMap); + 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 (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 + // declared in one of those containers. + if ((IDecl = C->getClassInterface())) { + ObjCInterfaceDecl::PropertyDeclOrder PO; + IDecl->collectPropertiesToImplement(NoNeedToImplPropMap, PO); + } + } + if (IDecl) + CollectSuperClassPropertyImplementations(IDecl, NoNeedToImplPropMap); + + CollectImmediateProperties(CDecl, PropMap, NoNeedToImplPropMap); + } + if (PropMap.empty()) return; |

