diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index 79681a1d741..9391ce22172 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -2125,4 +2125,47 @@ public class IndexBugsTests extends BaseTestCase { index.releaseReadLock(); } } + + // // a.h + // class P {}; + + // // b.h + // namespace P {class C {};} + + // // source1.cpp + // #include "a.h" + // P p; + + // // source2.cpp + // #include "b.h" + // P::C c; + public void testDisambiguateClassVsNamespace_297686() throws Exception { + waitForIndexer(); + String[] testData = getContentsForTest(4); + TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]); + TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[1]); + IFile s1= TestSourceReader.createFile(fCProject.getProject(), "s1.cpp", testData[2]); + IFile s2= TestSourceReader.createFile(fCProject.getProject(), "s2.cpp", testData[3]); + final IIndexManager indexManager = CCorePlugin.getIndexManager(); + indexManager.reindex(fCProject); + waitForIndexer(); + IIndex index= indexManager.getIndex(fCProject); + index.acquireReadLock(); + try { + IASTTranslationUnit tu = TestSourceReader.createIndexBasedAST(index, fCProject, s1); + IASTSimpleDeclaration sdecl= (IASTSimpleDeclaration) tu.getDeclarations()[0]; + IVariable var= (IVariable) sdecl.getDeclarators()[0].getName().resolveBinding(); + assertFalse(var.getType() instanceof IProblemBinding); + assertTrue(var.getType() instanceof ICPPClassType); + + tu = TestSourceReader.createIndexBasedAST(index, fCProject, s2); + sdecl= (IASTSimpleDeclaration) tu.getDeclarations()[0]; + var= (IVariable) sdecl.getDeclarators()[0].getName().resolveBinding(); + assertFalse(var.getType() instanceof IProblemBinding); + assertTrue(var.getType() instanceof ICPPClassType); + } finally { + index.releaseReadLock(); + } + } + } \ No newline at end of file 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 f6231e4ee3e..1338fdd8b56 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 @@ -1758,10 +1758,15 @@ public class CPPSemantics { } if (data.typesOnly) { - if (type != null) + if (type != null) { + if (obj instanceof ICPPNamespace && compareByRelevance(data, type, obj) < 0) { + return obj; + } return type; + } if (obj instanceof ICPPNamespace) return obj; + return null; } @@ -1780,6 +1785,11 @@ public class CPPSemantics { } if (obj != null) { + if (type != null && obj instanceof ICPPNamespace) { + if (compareByRelevance(data, type, obj) >= 0) { + return type; + } + } return obj; } return type;