From 9c4a3f017b6e87cdf36d2bcbb53743c7da64803c Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 21 Feb 2014 19:41:34 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201878 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 5 +++-- include/clang/Sema/Sema.h | 3 ++- lib/Sema/SemaDeclObjC.cpp | 16 +++++++------ lib/Sema/SemaObjCProperty.cpp | 42 +++++++++++++++++++---------------- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 3947e35cbc..2c3c0520a6 100644 --- a/include/clang/AST/DeclObjC.h +++ b/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/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 6ed43b2cc8..864142ddff 100644 --- a/include/clang/Sema/Sema.h +++ b/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/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 8337c1f7e5..86e16212a3 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/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(CDecl)) - if (!(LangOpts.ObjCDefaultSynthProperties && - LangOpts.ObjCRuntime.isNonFragile()) || - IDecl->isObjCRequiresPropertyDefs()) - DiagnoseUnimplementedProperties(S, IMPDecl, CDecl); - + if (const ObjCInterfaceDecl *IDecl = dyn_cast(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/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 730907e5b9..67be198f8d 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/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(CDecl))) - if (ObjCCategoryDecl *C = dyn_cast(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(CDecl))) + if (ObjCCategoryDecl *C = dyn_cast(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; -- 2.40.0