From 1723662de3662d11c783336bf873e59808172dd5 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 24 Mar 2016 20:06:08 -0400 Subject: [PATCH] Bug 489477 - Compare AST types to PDOM types correctly during final overrider analysis Change-Id: Ie34dad36cfb9f459b997a859c2c193745131f5c8 --- .../tests/IndexCPPBindingResolutionTest.java | 21 +++++++++++++++++++ .../parser/cpp/semantics/CPPInheritance.java | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) 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 6de527505ed..7d2994faef9 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 @@ -45,6 +45,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; +import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.IProblem; @@ -2278,4 +2279,24 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti ICPPVariable v= getBindingFromFirstIdentifier("test"); assertTrue(v.getType() instanceof IProblemType); } + + // struct A { + // virtual bool foo() = 0; + // }; + // + // struct B : A { + // bool foo(); + // }; + + // class B; + // int main() { + // B waldo; + // } + public void testFinalOverriderAnalysis_489477() throws Exception { + ICPPVariable waldo = getBindingFromFirstIdentifier("waldo"); + IType type = waldo.getType(); + assertInstance(type, ICPPClassType.class); + ICPPMethod[] pureVirtuals = SemanticQueries.getPureVirtualMethods((ICPPClassType) type, null); + assertEquals(0, pureVirtuals.length); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java index e1e73738d81..a2e63ebecf4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java @@ -252,7 +252,8 @@ public class CPPInheritance { for (ICPPMethod method : ClassTypeHelper.getOwnMethods(classType, point)) { // Skip methods that don't actually belong to us, such as methods brought // into scope via a using-declaration. - if (!method.getOwner().equals(classType)) { + if (!(method.getOwner() instanceof ICPPClassType && + ((ICPPClassType) method.getOwner()).isSameType(classType))) { continue; }