diff options
author | Anders Carlsson <andersca@mac.com> | 2009-05-17 00:00:05 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-05-17 00:00:05 +0000 |
commit | 8ff8c2278cf5ef26e40314dfbb363e32542da032 (patch) | |
tree | bd912a17357d95bf79fe92ed39deafeba2cc3883 /lib | |
parent | 758a422bc1af68f64f7f86ef4aad958148a89e97 (diff) |
Rewrite PureVirtualMethodCollector to use the overridden methods. Fixes <rdar://problem/6854087>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71970 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 30975bc1a4..9a74b53da9 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -786,34 +786,38 @@ namespace { } // Next, zero out any pure virtual methods that this class overrides. - for (size_t i = 0, e = Methods.size(); i != e; ++i) { - const CXXMethodDecl *VMD = dyn_cast_or_null<CXXMethodDecl>(Methods[i]); - if (!VMD) - continue; - - DeclContext::lookup_const_iterator I, E; - for (llvm::tie(I, E) = RD->lookup(Context, VMD->getDeclName()); - I != E; ++I) { - if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(*I)) { - if (Context.getCanonicalType(MD->getType()) == - Context.getCanonicalType(VMD->getType())) { - // We did find a matching method, which means that this is not a - // pure virtual method in the current class. Zero it out. - Methods[i] = 0; - } - } - } - } - - // Finally, add pure virtual methods from this class. + typedef llvm::SmallPtrSet<const CXXMethodDecl*, 4> MethodSetTy; + + MethodSetTy OverriddenMethods; + size_t MethodsSize = Methods.size(); + for (RecordDecl::decl_iterator i = RD->decls_begin(Context), - e = RD->decls_end(Context); + e = RD->decls_end(Context); i != e; ++i) { + // Traverse the record, looking for methods. if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(*i)) { - if (MD->isPure()) + // If the method is pre virtual, add it to the methods vector. + if (MD->isPure()) { Methods.push_back(MD); + continue; + } + + // Otherwise, record all the overridden methods in our set. + for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(), + E = MD->end_overridden_methods(); I != E; ++I) { + // Keep track of the overridden methods. + OverriddenMethods.insert(*I); + } } } + + // Now go through the methods and zero out all the ones we know are + // overridden. + for (size_t i = 0, e = MethodsSize; i != e; ++i) { + if (OverriddenMethods.count(Methods[i])) + Methods[i] = 0; + } + } } |