1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Bug 326269 - Checker for instantiation of an abstract class. Patch by Anton Gorenkov.

This commit is contained in:
Sergey Prigogin 2011-05-10 19:44:49 +00:00
parent af28c6569c
commit 2ba3a82120
2 changed files with 29 additions and 4 deletions

View file

@ -228,4 +228,20 @@ public class AbstractClassInstantiationCheckerTest extends CheckerTestCase {
loadCodeAndRun(getAboveComment());
checkErrorLines(4);
}
// class A {
// public:
// virtual ~A() = 0;
// };
//
// class B : public A {
// public:
// virtual ~B() {}
// };
//
// B b;
public void testPureVirtualDestructorOverride() {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
}

View file

@ -822,6 +822,15 @@ public class ClassTypeHelper {
return resultArray;
}
private static String getMethodNameForOverrideKey(ICPPMethod method) {
if (method.isDestructor()) {
// Destructor's names may differ but they will override each other.
return "~"; //$NON-NLS-1$
} else {
return method.getName();
}
}
/**
* Returns pure virtual methods of the given class grouped by their names.
*
@ -849,7 +858,7 @@ public class ClassTypeHelper {
}
// Remove overridden methods (even if they are pure virtual)
for (ICPPMethod declaredMethod : classTarget.getDeclaredMethods()) {
Set<ICPPMethod> methodsSet = pureVirtualMethods.get(declaredMethod.getName());
Set<ICPPMethod> methodsSet = pureVirtualMethods.get(getMethodNameForOverrideKey(declaredMethod));
if (methodsSet != null) {
for (Iterator<ICPPMethod> methodIt = methodsSet.iterator(); methodIt.hasNext();) {
ICPPMethod method = methodIt.next();
@ -858,17 +867,17 @@ public class ClassTypeHelper {
}
}
if (methodsSet.isEmpty()) {
pureVirtualMethods.remove(declaredMethod.getName());
pureVirtualMethods.remove(getMethodNameForOverrideKey(declaredMethod));
}
}
}
// Add pure virtual methods of current class
for (ICPPMethod method : classTarget.getDeclaredMethods()) {
if (method.isPureVirtual()) {
Set<ICPPMethod> methodsSet = pureVirtualMethods.get(method.getName());
Set<ICPPMethod> methodsSet = pureVirtualMethods.get(getMethodNameForOverrideKey(method));
if (methodsSet == null) {
methodsSet = new HashSet<ICPPMethod>();
pureVirtualMethods.put(method.getName(), methodsSet);
pureVirtualMethods.put(getMethodNameForOverrideKey(method), methodsSet);
}
methodsSet.add(method);
}