diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java index 859fc618b52..2660d4aa87b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; 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.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; @@ -1374,12 +1375,28 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti // class A { // class B; + // void method(); // }; - // class A::B {}; - public void _testNestedClass_284665() throws Exception { - ICPPClassType b = getBindingFromASTName("B {}", 1, ICPPClassType.class); - assertFalse(b instanceof IIndexBinding); + // class A::B { + // B(int x); + // static void m(int p); + // }; + // + // void A::method() { + // new B(0); + // B::m(0); + // } + public void testNestedClass_284665() throws Exception { + ICPPClassType b0 = getBindingFromASTName("B {", 1, ICPPClassType.class); + assertFalse(b0 instanceof IIndexBinding); + ICPPConstructor b1 = getBindingFromASTName("B(int x)", 1, ICPPConstructor.class); + assertFalse(b1 instanceof IIndexBinding); + ICPPConstructor b2 = getBindingFromASTName("B(0)", 1, ICPPConstructor.class); + assertFalse(b2 instanceof IIndexBinding); + assertEquals(b1, b2); + ICPPMethod b3 = getBindingFromASTName("m(0)", 1, ICPPMethod.class); + assertFalse(b3 instanceof IIndexBinding); } // class A { @@ -1479,7 +1496,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti } /** - * @param binding + * @param type * @param cqn * @param qn may be null */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 39a71ce91a1..c6a69a41fd9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -352,7 +352,11 @@ public class CPPSemantics { if (data.considerConstructors) { if (binding instanceof ICPPClassType) { + if (binding instanceof IIndexBinding) { + binding= data.tu.mapToAST((ICPPClassType) binding); + } ICPPClassType cls= (ICPPClassType) binding; + try { if (data.astName instanceof ICPPASTTemplateId && cls instanceof ICPPClassTemplate) { if (data.tu != null) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 1aef4b0ef26..2d9524ec47a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -218,11 +218,15 @@ public class CPPVisitor extends ASTQueries { return binding; } } else { - return binding; + if (binding instanceof ICPPClassType && binding instanceof IIndexBinding && name.isDefinition()) { + parent= parent.getParent(); // need to create an ast binding. + } else { + return binding; + } } } else if (parent instanceof ICPPASTTemplateId) { final ICPPASTTemplateId id = (ICPPASTTemplateId) parent; - if (CPPTemplates.isClassTemplate(id)) + if (CPPTemplates.isClassTemplate(id)) return CPPSemantics.resolveBinding(name); // function templates/instances/specializations must be resolved via the id