diff options
author | Manman Ren <manman.ren@gmail.com> | 2016-05-18 18:12:34 +0000 |
---|---|---|
committer | Manman Ren <manman.ren@gmail.com> | 2016-05-18 18:12:34 +0000 |
commit | 08ce73470c2fb45b78e35c15423bb840cb114b46 (patch) | |
tree | cc218cd6f4401ed15a08e933e603210c21a6c6f4 /clang/lib/Sema/SemaObjCProperty.cpp | |
parent | 8beed747ce86e63f5a988359bda30a73fba6ae03 (diff) | |
download | bcm5719-llvm-08ce73470c2fb45b78e35c15423bb840cb114b46.tar.gz bcm5719-llvm-08ce73470c2fb45b78e35c15423bb840cb114b46.zip |
ObjectiveC Class Properties: warn if a class property accessor is mistakenly an
instance method.
When diagnosing unimplemented class property, make sure we emit
a warning when we only see an instance method with the right selector.
Also warn when we only see a class method for an instance property.
rdar://26141719
llvm-svn: 269968
Diffstat (limited to 'clang/lib/Sema/SemaObjCProperty.cpp')
-rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 1bf88f4e939..f9c495d6419 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -1763,19 +1763,23 @@ void Sema::DefaultSynthesizeProperties(Scope *S, Decl *D) { DefaultSynthesizeProperties(S, IC, IDecl); } -static void DiagnoseUnimplementedAccessor(Sema &S, - ObjCInterfaceDecl *PrimaryClass, - Selector Method, - ObjCImplDecl* IMPDecl, - ObjCContainerDecl *CDecl, - ObjCCategoryDecl *C, - ObjCPropertyDecl *Prop, - Sema::SelectorSet &SMap) { +static void DiagnoseUnimplementedAccessor( + Sema &S, ObjCInterfaceDecl *PrimaryClass, Selector Method, + ObjCImplDecl *IMPDecl, ObjCContainerDecl *CDecl, ObjCCategoryDecl *C, + ObjCPropertyDecl *Prop, + llvm::SmallPtrSet<const ObjCMethodDecl *, 8> &SMap) { + // Check to see if we have a corresponding selector in SMap and with the + // right method type. + auto I = std::find_if(SMap.begin(), SMap.end(), + [&](const ObjCMethodDecl *x) { + return x->getSelector() == Method && + x->isClassMethod() == Prop->isClassProperty(); + }); // When reporting on missing property setter/getter implementation in // categories, do not report when they are declared in primary class, // class's protocol, or one of it super classes. This is because, // the class is going to implement them. - if (!SMap.count(Method) && + if (I == SMap.end() && (PrimaryClass == nullptr || !PrimaryClass->lookupPropertyAccessor(Method, C, Prop->isClassProperty()))) { @@ -1867,10 +1871,10 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl, for (const auto *I : IMPDecl->property_impls()) PropImplMap.insert(I->getPropertyDecl()); - SelectorSet InsMap; + llvm::SmallPtrSet<const ObjCMethodDecl *, 8> InsMap; // Collect property accessors implemented in current implementation. for (const auto *I : IMPDecl->methods()) - InsMap.insert(I->getSelector()); + InsMap.insert(I); ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl); ObjCInterfaceDecl *PrimaryClass = nullptr; @@ -1882,7 +1886,7 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl, // setter/getter is implemented in category's primary class // implementation. for (const auto *I : IMP->methods()) - InsMap.insert(I->getSelector()); + InsMap.insert(I); } for (ObjCContainerDecl::PropertyMap::iterator |