diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-12-03 21:11:54 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-12-03 21:11:54 +0000 |
commit | db5ce0f71ec99f0e60b99b6353b2e925af6c881b (patch) | |
tree | 345eb6ea6d7e265092b9a07285a53a3aa5fa744a /clang/lib/Sema/SemaObjCProperty.cpp | |
parent | b66d3cf5cf8400d9c99d5dd237ab6908377bbbfa (diff) | |
download | bcm5719-llvm-db5ce0f71ec99f0e60b99b6353b2e925af6c881b.tar.gz bcm5719-llvm-db5ce0f71ec99f0e60b99b6353b2e925af6c881b.zip |
[objc] Add a warning when a class that provides a designated initializer, does not
override all of the designated initializers of its superclass.
llvm-svn: 196319
Diffstat (limited to 'clang/lib/Sema/SemaObjCProperty.cpp')
-rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index d9d9cec1b70..f70e84d7a06 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -1830,6 +1830,34 @@ void Sema::DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D } } +void Sema::DiagnoseMissingDesignatedInitOverrides( + const ObjCImplementationDecl *ImplD, + const ObjCInterfaceDecl *IFD) { + assert(IFD->hasDesignatedInitializers()); + const ObjCInterfaceDecl *SuperD = IFD->getSuperClass(); + if (!SuperD) + return; + + SelectorSet InitSelSet; + for (ObjCImplementationDecl::instmeth_iterator + I = ImplD->instmeth_begin(), E = ImplD->instmeth_end(); I!=E; ++I) + if ((*I)->getMethodFamily() == OMF_init) + InitSelSet.insert((*I)->getSelector()); + + SmallVector<const ObjCMethodDecl *, 8> DesignatedInits; + SuperD->getDesignatedInitializers(DesignatedInits); + for (SmallVector<const ObjCMethodDecl *, 8>::iterator + I = DesignatedInits.begin(), E = DesignatedInits.end(); I != E; ++I) { + const ObjCMethodDecl *MD = *I; + if (!InitSelSet.count(MD->getSelector())) { + Diag(ImplD->getLocation(), + diag::warn_objc_implementation_missing_designated_init_override) + << MD->getSelector(); + Diag(MD->getLocation(), diag::note_objc_designated_init_marked_here); + } + } +} + /// AddPropertyAttrs - Propagates attributes from a property to the /// implicitly-declared getter or setter for that property. static void AddPropertyAttrs(Sema &S, ObjCMethodDecl *PropertyMethod, |