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

Bug 468749 - Fix false negative no virtual destructor

The checkers simply skipped nested classes.

Change-Id: If464b229e586267d845768f9d96d3223328a8298
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
This commit is contained in:
Marco Stornelli 2019-04-27 17:49:46 +02:00
parent bf0b7a76ed
commit db0cc1f9a4
2 changed files with 15 additions and 4 deletions

View file

@ -99,7 +99,7 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker {
boolean hasVirtualDestructor = hasVirtualDestructor(classType);
checkedClassTypes.clear();
if (hasVirtualDestructor) {
return PROCESS_SKIP;
return PROCESS_CONTINUE;
}
ICPPMethod virtualMethod = null;
for (ICPPMethod method : ClassTypeHelper.getAllDeclaredMethods(classType)) {
@ -108,13 +108,13 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker {
}
}
if (virtualMethod == null) {
return PROCESS_SKIP;
return PROCESS_CONTINUE;
}
ICPPMethod destructor = getDestructor(classType);
if (destructor != null && destructor.getVisibility() != ICPPASTVisibilityLabel.v_public
&& classType.getFriends().length == 0) {
// No error if the destructor is protected or private and there are no friends.
return PROCESS_SKIP;
return PROCESS_CONTINUE;
}
IASTNode node = decl;
@ -125,7 +125,6 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker {
}
}
reportProblem(PROBLEM_ID, node, new String(className.getSimpleID()), virtualMethod.getName());
return PROCESS_SKIP;
} finally {
CPPSemantics.popLookupPoint();
}

View file

@ -221,4 +221,16 @@ public class NonVirtualDestructorCheckerTest extends CheckerTestCase {
assertTrue((start == -1 && end == -1) || // ok, not multi-line
!code.substring(start, end).contains("\n"));
}
//class A {
//public:
// class B {
// public:
// virtual void test();
// };
//}
public void testNestedClasses_Bug468749() throws Exception {
loadCodeAndRun(getAboveComment());
checkErrorLine(3, NonVirtualDestructor.PROBLEM_ID);
}
}