diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java index b966aef4d38..1172873d851 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java @@ -455,8 +455,10 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { if (name == null) return false; - if (!isPrefixLookup) - return CPPVisitor.isConstructorDeclaration(name); + if (!isPrefixLookup) { + return CPPVisitor.isConstructorDeclaration(name) + || CPPVisitor.isLastNameInUsingDeclaration(name); + } IASTNode node = name.getParent(); if (node instanceof ICPPASTTemplateId) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index f2100dbd89f..d3bf8a813bb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1030,6 +1030,13 @@ public class CPPVisitor extends ASTQueries { return false; } + + public static boolean isLastNameInUsingDeclaration(IASTName name) { + IASTNode parent = name.getParent(); + return parent instanceof ICPPASTQualifiedName + && ((ICPPASTQualifiedName) parent).getLastName() == name + && parent.getParent() instanceof ICPPASTUsingDeclaration; + } public static IScope getContainingNonTemplateScope(final IASTNode inputNode) { IScope scope= getContainingScope(inputNode); diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java index a3578b08f3e..cdde5157ee6 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java @@ -37,6 +37,8 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.FileManager; @@ -1255,8 +1257,26 @@ public class CPPSelectionTestsNoIndexer extends BaseSelectionTests { public void testUserDefinedLiteralSuffix_484618() throws Exception { String code = getAboveComment(); IFile file = importFile("testBug484618.cpp", code); - + int offset = code.indexOf("42_d") + 3; assertTrue(testF3(file, offset) instanceof IASTName); } + + // struct Base { + // Base(int, int); + // }; + // + // struct Derived : Base { + // using Base::Base; + // }; + public void testInheritedConstructor_484899() throws Exception { + String code = getAboveComment(); + IFile file = importFile("testBug484899.cpp", code); + + int offset = code.indexOf("Base::Base") + 7; + IASTNode target = testF3(file, offset); + assertInstance(target, IASTName.class); + IBinding targetBinding = ((IASTName) target).resolveBinding(); + assertInstance(targetBinding, ICPPConstructor.class); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java index 53353a6bd4f..741fd571a91 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java @@ -215,6 +215,12 @@ class OpenDeclarationsJob extends Job implements ASTRunnable { continue; } } + if (binding instanceof ICPPUsingDeclaration) { + // For using-declarations, apply the logic below to each delegate + // individually. + bindings = ArrayUtil.addAll(bindings, ((ICPPUsingDeclaration) binding).getDelegates()); + continue; + } if (binding != null && !(binding instanceof IProblemBinding)) { IName[] names = findDeclNames(ast, kind, binding); for (final IName name : names) {