diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 293ceac6458..a3d7e889360 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -310,28 +310,31 @@ public class ClassTypeHelper { * @param point the point of instantiation for name lookups */ public static ICPPClassType[] getVirtualBases(ICPPClassType classType, IASTNode point) { - Set result = new HashSet<>(); - result.add(classType); - getVirtualBases(classType, result, point); - result.remove(classType); - return result.toArray(new ICPPClassType[result.size()]); + Set virtualBases = new HashSet<>(); + Set nonvirtualBases = new HashSet<>(); + nonvirtualBases.add(classType); + getVirtualBases(classType, virtualBases, nonvirtualBases, point); + return virtualBases.toArray(new ICPPClassType[virtualBases.size()]); } - - // Helper function for getVirtualBases(classType, point). - private static void getVirtualBases(ICPPClassType classType, Set result, IASTNode point) { + + /** + * Helper function for #getVirtualBases(classType, point). + */ + private static void getVirtualBases(ICPPClassType classType, Set virtualBases, + Set nonvirtualBases, IASTNode point) { ICPPBase[] bases = getBases(classType, point); for (ICPPBase base : bases) { IBinding b = base.getBaseClass(); if (b instanceof ICPPClassType) { final ICPPClassType baseClass = (ICPPClassType) b; if (base.isVirtual()) { - if (result.add(baseClass)) { - getVirtualBases(baseClass, result, point); + if (virtualBases.add(baseClass)) { + getVirtualBases(baseClass, virtualBases, nonvirtualBases, point); } } else { // A non-virtual base could have virtual bases in its hierarchy. - if (!result.contains(baseClass)) { - getVirtualBases(baseClass, result, point); + if (nonvirtualBases.add(baseClass)) { + getVirtualBases(baseClass, virtualBases, nonvirtualBases, point); } } }