diff options
Diffstat (limited to 'clang/Sema')
| -rw-r--r-- | clang/Sema/Sema.h | 9 | ||||
| -rw-r--r-- | clang/Sema/SemaDecl.cpp | 24 |
2 files changed, 17 insertions, 16 deletions
diff --git a/clang/Sema/Sema.h b/clang/Sema/Sema.h index b1906d3a249..e9dc4d0cb2c 100644 --- a/clang/Sema/Sema.h +++ b/clang/Sema/Sema.h @@ -51,6 +51,7 @@ namespace clang { class ObjcImplementationDecl; class ObjcCategoryImplDecl; class ObjcCategoryDecl; + class ObjcIvarDecl; /// Sema - This implements semantic analysis and AST building for C. class Sema : public Action { @@ -216,6 +217,11 @@ private: const llvm::DenseMap<void *, char>& InsMap, const llvm::DenseMap<void *, char>& ClsMap); + /// CheckImplementationIvars - This routine checks if the instance variables + /// listed in the implelementation match those listed in the interface. + void CheckImplementationIvars(ObjcImplementationDecl *ImpDecl, + ObjcIvarDecl **Fields, unsigned nIvars); + /// ImplMethodsVsClassMethods - This is main routine to warn if any method /// remains unimplemented in the @implementation class. void ImplMethodsVsClassMethods(ObjcImplementationDecl* IMPDecl, @@ -421,9 +427,6 @@ public: virtual void ObjcAddMethodsToClass(Scope* S, DeclTy *ClassDecl, DeclTy **allMethods, unsigned allNum); - virtual void ActOnImpleIvarVsClassIvars(DeclTy *ClassDecl, - DeclTy **Fields, unsigned NumFields); - virtual DeclTy *ObjcBuildMethodDeclaration(SourceLocation MethodLoc, tok::TokenKind MethodType, TypeTy *ReturnType, Selector Sel, // optional arguments. The number of types/arguments is obtained diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp index 64789bc3f50..1e0198aa853 100644 --- a/clang/Sema/SemaDecl.cpp +++ b/clang/Sema/SemaDecl.cpp @@ -1168,17 +1168,18 @@ Sema::DeclTy *Sema::ObjcStartClassImplementation(Scope *S, return IMPDecl; } -void Sema::ActOnImpleIvarVsClassIvars(DeclTy *ClassDecl, - DeclTy **Fields, unsigned numIvars) { - ObjcInterfaceDecl* IDecl = - cast<ObjcInterfaceDecl>(static_cast<Decl*>(ClassDecl)); - assert(IDecl && "missing named interface class decl"); - ObjcIvarDecl** ivars = reinterpret_cast<ObjcIvarDecl**>(Fields); +void Sema::CheckImplementationIvars(ObjcImplementationDecl *ImpDecl, + ObjcIvarDecl **ivars, unsigned numIvars) { + assert(ImpDecl && "missing implementation decl"); + ObjcInterfaceDecl* IDecl = getObjCInterfaceDecl(ImpDecl->getIdentifier()); + + if (!IDecl) + return; assert(ivars && "missing @implementation ivars"); - // Check interface's Ivar list against those in the implementation. - // names and types must match. - // + // Check interface's Ivar list against those in the implementation. + // names and types must match. + // ObjcIvarDecl** IntfIvars = IDecl->getIntfDeclIvars(); int IntfNumIvars = IDecl->getIntfDeclNumIvars(); unsigned j = 0; @@ -1676,10 +1677,7 @@ void Sema::ActOnFields(Scope* S, cast<ObjcImplementationDecl>(static_cast<Decl*>(RecDecl)); assert(IMPDecl && "ActOnFields - missing ObjcImplementationDecl"); IMPDecl->ObjcAddInstanceVariablesToClassImpl(ClsFields, RecFields.size()); - ObjcInterfaceDecl* IDecl = getObjCInterfaceDecl(IMPDecl->getIdentifier()); - if (IDecl) - ActOnImpleIvarVsClassIvars(static_cast<DeclTy*>(IDecl), - reinterpret_cast<DeclTy**>(&RecFields[0]), RecFields.size()); + CheckImplementationIvars(IMPDecl, ClsFields, RecFields.size()); } } } |

