diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -1431,9 +1431,13 @@ } int count(Selector Sel) const { return Methods.count(Sel); } bool empty() const { return Methods.empty(); } + bool addMethod(ObjCMethodDecl *Method) { + return AddedMethods.insert(Method).second; + } private: llvm::DenseMap Methods; + llvm::DenseSet AddedMethods; }; /// Method Pool - allows efficient lookup when typechecking messages to "id". diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -3302,6 +3302,10 @@ void Sema::addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method) { + // Do not insert duplicate methods into the method pool. + if (!MethodPool.addMethod(Method)) + return; + // Record at the head of the list whether there were 0, 1, or >= 2 methods // inside categories. if (ObjCCategoryDecl *CD =