From 42eaf65363a629f592bb8fafad43c544f251ed91 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 8 Sep 2011 15:22:45 +0200 Subject: [PATCH] Bug 356955: Lookup for overloaded operator. --- .../tests/IndexCPPBindingResolutionBugs.java | 28 +++++++++++++++++++ .../index/tests/IndexCompositeTests.java | 6 ++-- .../core/testplugin/util/BaseTestCase.java | 4 +-- .../parser/cpp/semantics/CPPSemantics.java | 2 +- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java index 9562839b7ad..bcb559c0bf8 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java @@ -18,6 +18,7 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTImplicitName; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -1308,4 +1309,31 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas IFunction f= getBindingFromASTName("fun", 0); ITypedef t= getBindingFromASTName("Type", 0); } + + // struct base { + // virtual void operator+(base const &) { } + // virtual void operator-(base const &) { } + // }; + + // #include "header.h" + // struct inter : public base { + // virtual void operator+(base const &){} + // }; + // struct sub : public inter { + // void doSomething() { + // base *left, *right; + // + // *left + *right; + // *left - *right; + // } + // }; + public void test_Bug356982() throws Exception { + IASTName name= findName("+ ", 1); + assertTrue(name instanceof IASTImplicitName); + assertEquals("base", name.resolveBinding().getOwner().getName()); + + name= findName("- ", 1); + assertTrue(name instanceof IASTImplicitName); + assertEquals("base", name.resolveBinding().getOwner().getName()); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCompositeTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCompositeTests.java index 2e61622b70f..18dded3ab59 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCompositeTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCompositeTests.java @@ -53,6 +53,7 @@ public class IndexCompositeTests extends BaseTestCase { private static final int NONE = 0, REFS = IIndexManager.ADD_DEPENDENCIES; private static final int REFD = IIndexManager.ADD_DEPENDENT, BOTH = REFS | REFD; private static final IndexFilter FILTER= new IndexFilter() { + @Override public boolean acceptBinding(IBinding binding) throws CoreException { if (binding instanceof ICPPMethod) { return !((ICPPMethod) binding).isImplicit(); @@ -419,6 +420,7 @@ public class IndexCompositeTests extends BaseTestCase { index.acquireReadLock(); } + @Override protected void tearDown() throws Exception { if (index != null) { index.releaseReadLock(); @@ -451,7 +453,7 @@ class ProjectBuilder { return this; } - ICProject create() throws CoreException { + ICProject create() throws Exception { ICProject result = cpp ? CProjectHelper.createCCProject(name, "bin", IPDOMManager.ID_NO_INDEXER) : CProjectHelper.createCCProject(name, "bin", IPDOMManager.ID_NO_INDEXER); @@ -466,7 +468,7 @@ class ProjectBuilder { result.getProject().setDescription(desc, new NullProgressMonitor()); CCorePlugin.getIndexManager().setIndexerId(result, IPDOMManager.ID_FAST_INDEXER); - CCorePlugin.getIndexManager().joinIndexer(4000, new NullProgressMonitor()); + BaseTestCase.waitForIndexer(result); return result; } } diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java index 5908ea076d7..86f8412761a 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java @@ -57,7 +57,7 @@ public class BaseTestCase extends TestCase { super(name); } - public NullProgressMonitor npm() { + public static NullProgressMonitor npm() { return new NullProgressMonitor(); } @@ -284,7 +284,7 @@ public class BaseTestCase extends TestCase { } } - protected void waitForIndexer(ICProject project) throws InterruptedException { + public static void waitForIndexer(ICProject project) throws InterruptedException { final PDOMManager indexManager = CCoreInternals.getPDOMManager(); assertTrue(indexManager.joinIndexer(10000, npm())); long waitms= 1; 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 da6d550d5f7..6af7c70a0a8 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 @@ -955,7 +955,7 @@ public class CPPSemantics { return; // Lookup in base classes - if (!data.usingDirectivesOnly && scope instanceof ICPPClassScope) { + if (!data.usingDirectivesOnly && scope instanceof ICPPClassScope && !data.ignoreMembers) { BaseClassLookup.lookupInBaseClasses(data, (ICPPClassScope) scope, fileSet); if (!data.contentAssist && data.hasResultOrProblem()) return;