From 7396f52e192cf2d7ec5b89cf68610f28e90ad5d6 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 6 Sep 2007 15:37:23 +0000 Subject: [PATCH] Fix for 202271, ClassCaseException in name resolution. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 17 +++++++++++++++++ .../core/dom/parser/cpp/CPPVisitor.java | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 91d4a97745b..9e8f9cb0231 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -86,7 +86,9 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICArrayType; import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.c.CFunction; @@ -3933,4 +3935,19 @@ public class AST2Tests extends AST2BaseTest { parse( buffer.toString(), ParserLanguage.CPP, true, true ); parse( buffer.toString(), ParserLanguage.C, true, true ); } + + // class NameClash {}; + // namespace NameClash {}; + // namespace NameClash2 {}; + // class NameClash2 {}; + public void testBug202271_nameClash() throws Exception { + StringBuffer buffer = getContents(1)[0]; + IASTTranslationUnit tu= parseAndCheckBindings( buffer.toString(), ParserLanguage.CPP, true ); + CNameCollector col = new CNameCollector(); + tu.accept(col); + assertInstance(col.getName(0).resolveBinding(), ICPPClassType.class); + assertInstance(col.getName(1).resolveBinding(), ICPPNamespace.class); + assertInstance(col.getName(2).resolveBinding(), ICPPNamespace.class); + assertInstance(col.getName(3).resolveBinding(), ICPPClassType.class); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index edc17bd0e40..410d6976dd8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -418,7 +418,8 @@ public class CPPVisitor { IBinding binding; try { binding = scope.getBinding( namespaceDef.getName(), false ); - if( !(binding instanceof ICPPInternalBinding) || binding instanceof IProblemBinding ){ + if( !(binding instanceof ICPPInternalBinding) || binding instanceof IProblemBinding + || !(binding instanceof ICPPNamespace)){ binding = new CPPNamespace( namespaceDef ); ASTInternal.addName( scope, namespaceDef.getName() ); }