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) {