From ec3395e78d6f54c1167dc8adb8ace08f119a0fe2 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Tue, 20 Sep 2011 11:56:07 -0700 Subject: [PATCH] Bug 358282 - Name resolution problem with mismatched 'class' and 'struct'. --- .../tests/IndexCPPBindingResolutionTest.java | 17 +++++++++++++++++ .../core/pdom/dom/cpp/PDOMCPPClassType.java | 13 +++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) 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 ccdb5c0e076..f9d42875f1e 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 @@ -1597,6 +1597,23 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti assertEquals("ns", ref.getOwner().getName()); } + // class A {}; + // void f(A a) {} + // struct B {}; + // void g(B b) {} + + // struct A; + // class B; + // + // void test(A a, B b) { + // f(a); + // g(b); + // } + public void testStructClassMismatch_358282() throws Exception { + getBindingFromASTName("f(a)", 1, ICPPFunction.class); + getBindingFromASTName("g(b)", 1, ICPPFunction.class); + } + /* CPP assertion helpers */ /* ##################################################################### */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 513f2acf198..31464ea5f49 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -226,22 +226,22 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO return false; } } - + public boolean isSameType(IType type) { if (type instanceof ITypedef) { return type.isSameType(this); } - + if (type instanceof PDOMNode) { PDOMNode node= (PDOMNode) type; if (node.getPDOM() == getPDOM()) { return node.getRecord() == getRecord(); } } - + if (type instanceof ICPPClassType && !(type instanceof ProblemBinding)) { ICPPClassType ctype= (ICPPClassType) type; - if (ctype.getKey() != getKey()) + if (getEquivalentKind(ctype) != getEquivalentKind(this)) return false; char[] nchars = ctype.getNameCharArray(); if (nchars.length == 0) { @@ -255,6 +255,11 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO return false; } + private static int getEquivalentKind(ICPPClassType classType) { + int key = classType.getKey(); + return key == k_class ? k_struct : key; + } + public ICPPBase[] getBases() { Long key= record + PDOMCPPLinkage.CACHE_BASES; ICPPBase[] bases= (ICPPBase[]) getPDOM().getCachedResult(key);