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 94c82852431..a5e8f536a17 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 @@ -1584,6 +1584,19 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti getBindingFromASTName("g(1)", 1); } + // namespace ns { + // void fun(); + // } + + // namespace alias = ns; + // void alias::fun() { + // } + public void testNamespaceAliasAsQualifier_356493() throws Exception { + IFunction ref= getBindingFromASTName("fun", 0); + assertEquals("ns", ref.getOwner().getName()); + } + + /* CPP assertion helpers */ /* ##################################################################### */ 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 ba3e49f4faf..c57d5a11a9e 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 @@ -137,6 +137,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; @@ -2316,7 +2317,7 @@ public class CPPVisitor extends ASTQueries { } if (--i < 0) break; - return qn[i].resolveBinding(); + return bindingToOwner(qn[i].resolveBinding()); } name= (IASTName) node; node= node.getParent(); @@ -2324,6 +2325,20 @@ public class CPPVisitor extends ASTQueries { return findDeclarationOwner(node, allowFunction); } + private static IBinding bindingToOwner(IBinding b) { + if (b instanceof ITypedef) { + IType t= SemanticUtil.getNestedType((IType) b, TDEF); + if (t instanceof IBinding) + return (IBinding) t; + + return b; + } + while (b instanceof ICPPNamespaceAlias) { + b= ((ICPPNamespaceAlias) b).getBinding(); + } + return b; + } + /** * Searches for the first class, namespace, or function, if allowFunction * is true, enclosing the declaration the provided node belongs to and returns