diff options
author | Sergey Prigogin | 2012-08-09 00:38:17 +0000 |
---|---|---|
committer | Sergey Prigogin | 2012-08-14 22:32:56 +0000 |
commit | f122365484945698d312a4b14e8b0b4b562f77d4 (patch) | |
tree | 0a7f87ccedfb66e0a79a8cdf379af6853f4a1915 /codan/org.eclipse.cdt.codan.checkers | |
parent | dd039973aeb54aaa5a2269286950dc362d332b55 (diff) | |
download | org.eclipse.cdt-f122365484945698d312a4b14e8b0b4b562f77d4.tar.gz org.eclipse.cdt-f122365484945698d312a4b14e8b0b4b562f77d4.tar.xz org.eclipse.cdt-f122365484945698d312a4b14e8b0b4b562f77d4.zip |
Bug 299911. Added logging of methods that loose template instantiation
context.
Diffstat (limited to 'codan/org.eclipse.cdt.codan.checkers')
2 files changed, 12 insertions, 11 deletions
diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java index 0461da5b940..4e68e5b7360 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java @@ -188,7 +188,7 @@ public class AbstractClassInstantiationChecker extends AbstractIndexAstChecker { * Checks whether specified type (class or typedef to the class) is an abstract class. * If it is, reports violations on each pure virtual method */ - private void reportProblemsIfAbstract(IType typeToCheck, IASTNode problemNode ) { + private void reportProblemsIfAbstract(IType typeToCheck, IASTNode problemNode) { IType unwindedType = CxxAstUtils.unwindTypedef(typeToCheck); if (!(unwindedType instanceof ICPPClassType) || unwindedType instanceof IProblemBinding) { return; @@ -196,7 +196,7 @@ public class AbstractClassInstantiationChecker extends AbstractIndexAstChecker { ICPPClassType classType = (ICPPClassType) unwindedType; ICPPMethod[] pureVirtualMethods = pureVirtualMethodsCache.get(classType); if (pureVirtualMethods == null) { - pureVirtualMethods = ClassTypeHelper.getPureVirtualMethods(classType); + pureVirtualMethods = ClassTypeHelper.getPureVirtualMethods(classType, problemNode); pureVirtualMethodsCache.put(classType, pureVirtualMethods); } diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java index db7235a7307..bb780c1912f 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java @@ -27,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; /** @@ -46,8 +47,8 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { ast.accept(new OnEachClass()); } - private static ICPPMethod getDestructor(ICPPClassType classType) { - for (ICPPMethod method : classType.getDeclaredMethods()) { + private static ICPPMethod getDestructor(ICPPClassType classType, IASTNode point) { + for (ICPPMethod method : ClassTypeHelper.getDeclaredMethods(classType, point)) { if (method.isDestructor()) { return method; } @@ -55,18 +56,18 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { return null; } - private static boolean hasVirtualDestructor(ICPPClassType classType) { + private static boolean hasVirtualDestructor(ICPPClassType classType, IASTNode point) { checkedClassTypes.add(classType); - ICPPMethod destructor = getDestructor(classType); + ICPPMethod destructor = getDestructor(classType, point); if (destructor != null && destructor.isVirtual()) { return true; } - ICPPBase[] bases = classType.getBases(); + ICPPBase[] bases = ClassTypeHelper.getBases(classType, point); for (ICPPBase base : bases) { IBinding baseClass = base.getBaseClass(); if (baseClass instanceof ICPPClassType) { ICPPClassType cppClassType = (ICPPClassType) baseClass; - if (!checkedClassTypes.contains(cppClassType) && hasVirtualDestructor(cppClassType)) { + if (!checkedClassTypes.contains(cppClassType) && hasVirtualDestructor(cppClassType, point)) { return true; } } @@ -89,13 +90,13 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { return PROCESS_SKIP; } ICPPClassType classType = (ICPPClassType) binding; - boolean hasVirtualDestructor = hasVirtualDestructor(classType); + boolean hasVirtualDestructor = hasVirtualDestructor(classType, className); checkedClassTypes.clear(); if (hasVirtualDestructor) { return PROCESS_SKIP; } ICPPMethod virtualMethod = null; - for (ICPPMethod method : classType.getAllDeclaredMethods()) { + for (ICPPMethod method : ClassTypeHelper.getAllDeclaredMethods(classType, className)) { if (!method.isDestructor() && method.isVirtual()) { virtualMethod = method; } @@ -103,7 +104,7 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { if (virtualMethod == null) { return PROCESS_SKIP; } - ICPPMethod destructor = getDestructor(classType); + ICPPMethod destructor = getDestructor(classType, className); if (destructor != null && destructor.getVisibility() != ICPPASTVisibilityLabel.v_public && classType.getFriends().length == 0) { |