aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-05-17 00:00:05 +0000
committerAnders Carlsson <andersca@mac.com>2009-05-17 00:00:05 +0000
commit8ff8c2278cf5ef26e40314dfbb363e32542da032 (patch)
treebd912a17357d95bf79fe92ed39deafeba2cc3883 /lib
parent758a422bc1af68f64f7f86ef4aad958148a89e97 (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.cpp48
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;
+ }
+
}
}