diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java index 64bde4b66dc..843a6fa8b44 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; @@ -222,4 +223,25 @@ public class IndexBindingResolutionBugs extends IndexBindingResolutionTestBase { IBinding b0 = getBindingFromASTName("func1;", 5); assertTrue(b0 instanceof IFunction); } + + // class B { + // public: + // class BB { + // public: + // int field; + // }; + // }; + // + // class A : public B::BB {}; + + // #include "header.h" + // + // void foo() { + // A c; + // c.field;//comment + // } + public void testBug183843() throws DOMException { + IBinding b0 = getBindingFromASTName("field;//", 5); + assertTrue(b0 instanceof ICPPField); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 3953ffffd31..39d2b44b082 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -75,7 +75,7 @@ import org.eclipse.core.runtime.Status; public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { protected Database db; - public static final int VERSION = 33; + public static final int VERSION = 34; // 0 - the beginning of it all // 1 - first change to kick off upgrades // 2 - added file inclusions @@ -110,6 +110,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { // 31 - macros: added file locations // 32 - support standalone function types (181936) // 33 - templates: constructor instances + // 34 - fix for base classes represented by qualified names (183843) public static final int LINKAGES = Database.DATA_AREA; public static final int FILE_INDEX = Database.DATA_AREA + 4; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 3a24ac9339b..d824f7fb177 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -117,7 +117,7 @@ class PDOMCPPLinkage extends PDOMLinkage { public static final int CPP_CONSTRUCTOR_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 23; public static final int CPP_DEFERRED_FUNCTION_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 24; public static final int CPP_CLASS_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 25; - public static final int CPP_DEFERRED_CLASS_INSTANCE= PDOMCPPLinkage.LAST_NODE_TYPE + 26; + public static final int CPP_DEFERRED_CLASS_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 26; public static final int CPP_PARAMETER_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 27; public static final int CPP_FIELD_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 28; public static final int CPP_FUNCTION_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 29; @@ -713,6 +713,14 @@ class PDOMCPPLinkage extends PDOMLinkage { super.onCreateName(pdomName, name); IASTNode parentNode= name.getParent(); + if (parentNode instanceof ICPPASTQualifiedName) { + IASTName [] ns = ((ICPPASTQualifiedName)parentNode).getNames(); + if ( name != ns[ ns.length -1 ] ) { + return; + } else { + parentNode = parentNode.getParent(); + } + } if (parentNode instanceof ICPPASTBaseSpecifier) { PDOMName derivedClassName= (PDOMName) pdomName.getEnclosingDefinition(); if (derivedClassName != null) {