diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -8181,8 +8181,18 @@ /// Add the given set of methods to the method list. static void addMethodsToPool(Sema &S, ArrayRef Methods, ObjCMethodList &List) { - for (unsigned I = 0, N = Methods.size(); I != N; ++I) { - S.addMethodToGlobalList(&List, Methods[I]); + // Methods from visited modules can contain a lot of duplicates + // when redeclaring methods from system frameworks, for example + // when marking -(instancetype)init as NS_UNAVAILABLE. + llvm::DenseSet seen; + for (auto *L = &List; L; L = L->getNext()) { + seen.insert(L->getMethod()); + } + + for (auto *M : Methods) { + if (seen.insert(M).second) { + S.addMethodToGlobalList(&List, M); + } } }