From b6a384b943d12fbf7fccdb6142fcfed7de8d8a01 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 26 Apr 2012 20:23:14 -0700 Subject: [PATCH] Bug 377838 - Name resolution gets confused by a class and a namespace with the same name --- .../parser/tests/ast2/AST2TemplateTests.java | 19 ++++++++++++++++++- .../core/dom/parser/cpp/CPPScope.java | 3 +++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 53a03726d83..7e5f834f080 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -4954,7 +4954,24 @@ public class AST2TemplateTests extends AST2BaseTest { tu = validateCopy(tu); assertEquals(1, tu.getDeclarations().length); } - + + // namespace A { + // + // template + // struct A { + // A(); + // }; + // + // template + // A::A() {} + // + // A a; + // + // } + public void testBug377838() throws Exception { + parseAndCheckBindings(); + } + // namespace N { // inline namespace M { // template void f(T&) { } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java index 4410baffb25..df54026c78b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java @@ -11,6 +11,7 @@ * Bryan Wilkinson (QNX) * Andrew Ferguson (Symbian) * Jens Elmenthaler - http://bugs.eclipse.org/173458 (camel case completion) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -136,6 +137,8 @@ abstract public class CPPScope implements ICPPASTInternalScope { return false; IASTName segmentName = segments[i]; + if ((scopeName instanceof ICPPASTTemplateId) != (segmentName instanceof ICPPASTTemplateId)) + return false; if (!CharArrayUtils.equals(scopeName.getSimpleID(), segmentName.getSimpleID())) return false; scope= scope.getParent();