Bug 517402 - Ambiguous namespace, conflicting with a different kind of symbol

Change-Id: I5a648e23f1222c1bbf75a13b367dd51dd6231f61
Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java
index a3e36fa..fa70316 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java
@@ -12323,4 +12323,42 @@
 	public void testSizeofArrayField_512932() throws Exception {
 		parseAndCheckBindings();
 	}
+
+	//void ns2 ();
+	//
+	//namespace ns1 {
+	//namespace ns2 {
+	//class TestNameSpace {
+	//public:
+	//	TestNameSpace();
+	//};
+	//}
+	//}
+	//
+	//using namespace ns1;
+	//using namespace ns2; //ns2 shouldn't be ambiguous because only namespace names should be considered.
+	//
+	//TestNameSpace::TestNameSpace() {
+	//}
+	public void testUsingDirectiveNamespaceWithPreviousFunctionName_517402() throws Exception {
+		parseAndCheckBindings();
+	}
+
+	//void ns2 ();
+	//namespace ns1 {
+	//namespace ns2 {
+	//class TestNameSpace {
+	//public:
+	//	TestNameSpace();
+	//};
+	//}
+	//}
+	//
+	//using namespace ns1;
+	//namespace ns12 = ns2;
+	//ns12::TestNameSpace::TestNameSpace() {
+	//}
+	public void testNamespaceAliasNamespaceWithPreviousFunctionName_517402() throws Exception {
+		parseAndCheckBindings();
+	}
 }
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 c53f6b4..80ad5be 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
@@ -1365,6 +1365,12 @@
 			bindings = ArrayUtil.filter(bindings, new RecursionResolvingBindingFilter());
 		}
 
+		if (data.namespacesOnly) {
+			bindings = ArrayUtil.filter(bindings, (argument) -> {
+				return argument instanceof ICPPNamespace;
+			});
+		}
+
 		return expandUsingDeclarationsAndRemoveObjects(bindings, data);
 	}
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java
index 308b5d4..8f20cd4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java
@@ -57,6 +57,7 @@
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNameSpecifier;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
@@ -97,6 +98,7 @@
 	public boolean qualified;
 
 	public boolean forUsingDeclaration;
+	public boolean namespacesOnly;
 
     /** When computing the cost of a method call, treat the first argument as the implied object. */
 	public boolean argsContainImpliedObject;
@@ -174,6 +176,9 @@
 			typesOnly= true;
 		} else if (nameParent instanceof ICPPASTUsingDeclaration) {
 			forUsingDeclaration= true;
+		} else if (nameParent instanceof ICPPASTUsingDirective || nameParent instanceof ICPPASTNamespaceAlias) {
+			// [basic.lookup.udir]: Only namespace names are considered
+			namespacesOnly= true;
 		} else if (nameParent instanceof IASTDeclarator) {
 			fDeclarator= (IASTDeclarator) nameParent;
 		} else if (nameParent instanceof IASTFieldReference) {