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