diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java index 06b679f4c7b..6c9a28cc727 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java @@ -31,7 +31,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; * The result of instantiating a class template. */ public class CPPClassInstance extends CPPClassSpecialization implements ICPPTemplateInstance { - private ICPPTemplateArgument[] arguments; + private final ICPPTemplateArgument[] arguments; public CPPClassInstance(ICPPClassType orig, IBinding owner, CPPTemplateParameterMap argMap, ICPPTemplateArgument[] args) { super(orig, owner, argMap); @@ -52,6 +52,8 @@ public class CPPClassInstance extends CPPClassSpecialization implements ICPPTemp protected ICPPClassSpecializationScope getSpecializationScope() { // An instance with a declaration has no specialization scope. checkForDefinition(); + if (getDefinition() != null) + return null; final IASTNode[] decls = getDeclarations(); if (decls != null && decls.length > 0 && decls[0] != null) return null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java index 66a3f4e395b..9691f3e476a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java @@ -250,7 +250,7 @@ class BaseClassLookup { continue; final IName nbaseName = nbase.getBaseClassSpecifierName(); - int cmp= baseName == null ? -1 : CPPSemantics.compareByRelevance(data, baseName, nbaseName); + int cmp= baseName == null ? 0 : CPPSemantics.compareByRelevance(data, baseName, nbaseName); if (cmp <= 0) { if (cmp < 0) { selectedBases.clear(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java index 4a572add8e3..652b940d467 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java @@ -30,11 +30,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexName; @@ -140,10 +138,6 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope { } private IBinding getClassNameBinding() { - if (fBinding instanceof ICPPClassTemplatePartialSpecialization) - return ((ICPPClassTemplatePartialSpecialization) fBinding).getPrimaryClassTemplate(); - if (fBinding instanceof ICPPSpecialization) - return ((ICPPSpecialization) fBinding).getSpecializedBinding(); return fBinding; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclarationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclarationSpecialization.java index 953057620fc..b7cafb643c9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclarationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUsingDeclarationSpecialization.java @@ -61,7 +61,7 @@ class PDOMCPPUsingDeclarationSpecialization extends PDOMCPPSpecialization implem @Override public int getNodeType() { - return IIndexCPPBindingConstants.CPP_USING_DECLARATION; + return IIndexCPPBindingConstants.CPP_USING_DECLARATION_SPECIALIZATION; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java index eeb07ceb5fb..92bcf23cf77 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java @@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.core.runtime.CoreException; @@ -30,7 +31,7 @@ import org.eclipse.core.runtime.CoreException; */ class PDOMClassUtil { static class FieldCollector implements IPDOMVisitor { - private List fields = new ArrayList(); + private final List fields = new ArrayList(); @Override public boolean visit(IPDOMNode node) throws CoreException { if (node instanceof ICPPField) { @@ -50,7 +51,7 @@ class PDOMClassUtil { } static class ConstructorCollector implements IPDOMVisitor { - private List fConstructors = new ArrayList(); + private final List fConstructors = new ArrayList(); @Override public boolean visit(IPDOMNode node) throws CoreException { if (node instanceof ICPPConstructor) { @@ -108,10 +109,10 @@ class PDOMClassUtil { } static class NestedClassCollector implements IPDOMVisitor { - private List nestedClasses = new ArrayList(); + private final List nestedClasses = new ArrayList(); @Override public boolean visit(IPDOMNode node) throws CoreException { - if (node instanceof ICPPClassType) + if (node instanceof ICPPClassType && !(node instanceof ICPPDeferredClassInstance)) nestedClasses.add(node); return false; }