mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-25 18:05:33 +02:00
Bug 315528 - Non-virtual destructor diagnostics doesn't take superclass into account. Tests by Patrick Hofer.
This commit is contained in:
parent
8fc40a2884
commit
c3b5435595
3 changed files with 131 additions and 1 deletions
|
@ -33,7 +33,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
|
||||||
* @author Alena Laskavaia
|
* @author Alena Laskavaia
|
||||||
*/
|
*/
|
||||||
public class NonVirtualDestructor extends AbstractIndexAstChecker {
|
public class NonVirtualDestructor extends AbstractIndexAstChecker {
|
||||||
private static final String ER_ID = "org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem"; //$NON-NLS-1$
|
public static final String ER_ID = "org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem"; //$NON-NLS-1$
|
||||||
|
|
||||||
public void processAst(IASTTranslationUnit ast) {
|
public void processAst(IASTTranslationUnit ast) {
|
||||||
// Traverse the ast using the visitor pattern.
|
// Traverse the ast using the visitor pattern.
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Patrick Hofer and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Patrick Hofer - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.codan.core.internal.checkers;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.codan.core.test.CheckerTestCase;
|
||||||
|
import org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for {@see NonVirtualDestructor} class.
|
||||||
|
*/
|
||||||
|
public class NonVirtualDestructorCheckerTest extends CheckerTestCase {
|
||||||
|
@Override
|
||||||
|
public boolean isCpp() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
enableProblems(NonVirtualDestructor.ER_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// virtual ~A(); // ok.
|
||||||
|
// };
|
||||||
|
public void testVirtualDtorInClass() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// protected:
|
||||||
|
// ~A(); // ok.
|
||||||
|
// };
|
||||||
|
public void testNonPublicVirtualDtorInClass() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// ~A(); // warn! public non-virtual dtor.
|
||||||
|
// };
|
||||||
|
public void _testPublicVirtualDtorInClass() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLines(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// // warn! implicit public non-virtual dtor.
|
||||||
|
// };
|
||||||
|
public void _testImplicitPublicNonVirtualDtorInClass() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLines(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct F { };
|
||||||
|
//
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// private:
|
||||||
|
// friend class F;
|
||||||
|
// ~A(); // warn! can be called from class F.
|
||||||
|
// };
|
||||||
|
public void _testPublicNonVirtualDtorCanBeCalledFromFriendClass() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLines(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// virtual ~A();
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// struct B {
|
||||||
|
// ~B(); // ok.
|
||||||
|
// };
|
||||||
|
public void testVirtualDtorInBaseClass() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// virtual ~A(); // ok.
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// struct B : public A { };
|
||||||
|
//
|
||||||
|
// struct C { };
|
||||||
|
//
|
||||||
|
// struct D : public B, C { };
|
||||||
|
//
|
||||||
|
// struct E : public D { };
|
||||||
|
public void testVirtualDtorInBaseClass2() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct A {
|
||||||
|
// virtual void f() = 0;
|
||||||
|
// ~A(); // warn! public non-virtual dtor.
|
||||||
|
// // this affects B, D and E further down in the hierarchy as well
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// struct B : public A { };
|
||||||
|
//
|
||||||
|
// struct C { };
|
||||||
|
//
|
||||||
|
// struct D : public B, C { };
|
||||||
|
//
|
||||||
|
// struct E : public D {
|
||||||
|
// };
|
||||||
|
public void _testNonVirtualDtorInBaseClass2() {
|
||||||
|
checkErrorLines(3, 7, 11, 13);
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@ import org.eclipse.cdt.codan.core.internal.checkers.AssignmentToItselfCheckerTes
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.CaseBreakCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.CaseBreakCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.CatchByReferenceTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.CatchByReferenceTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.FormatStringCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.FormatStringCheckerTest;
|
||||||
|
import org.eclipse.cdt.codan.core.internal.checkers.NonVirtualDestructorCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.ProblemBindingCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.ProblemBindingCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.ReturnCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.ReturnCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.ReturnStyleCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.ReturnStyleCheckerTest;
|
||||||
|
@ -56,6 +57,7 @@ public class AutomatedIntegrationSuite extends TestSuite {
|
||||||
suite.addTestSuite(CaseBreakCheckerTest.class);
|
suite.addTestSuite(CaseBreakCheckerTest.class);
|
||||||
suite.addTestSuite(CatchByReferenceTest.class);
|
suite.addTestSuite(CatchByReferenceTest.class);
|
||||||
suite.addTestSuite(FormatStringCheckerTest.class);
|
suite.addTestSuite(FormatStringCheckerTest.class);
|
||||||
|
suite.addTestSuite(NonVirtualDestructorCheckerTest.class);
|
||||||
suite.addTestSuite(ProblemBindingCheckerTest.class);
|
suite.addTestSuite(ProblemBindingCheckerTest.class);
|
||||||
suite.addTestSuite(ReturnCheckerTest.class);
|
suite.addTestSuite(ReturnCheckerTest.class);
|
||||||
suite.addTestSuite(ReturnStyleCheckerTest.class);
|
suite.addTestSuite(ReturnStyleCheckerTest.class);
|
||||||
|
|
Loading…
Add table
Reference in a new issue