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 7e7e8759e37..dd2c9dfc555 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 @@ -4718,4 +4718,25 @@ public class AST2CPPTests extends AST2BaseTest { ICPPMethod f = (ICPPMethod) col.getName(9).resolveBinding(); assertSame( f, col.getName(11).resolveBinding() ); } + + public void testAnonymousStructures() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("struct A { \n"); + buffer.append(" struct { int i; } B; \n"); + buffer.append(" struct { int j; } C; \n"); + buffer.append("}; \n"); + buffer.append("void f(){ \n"); + buffer.append(" A a; \n"); + buffer.append(" a.B.i; a.C.j; \n"); + buffer.append("} \n"); + + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + ICPPField i = (ICPPField) col.getName(12).resolveBinding(); + ICPPField j = (ICPPField) col.getName(15).resolveBinding(); + assertSame( i, col.getName(2).resolveBinding() ); + assertSame( j, col.getName(5).resolveBinding() ); + } } 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 611dd709994..cd01d2b7b94 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 @@ -374,12 +374,13 @@ public class CPPVisitor { } scope = parentScope; } - IBinding binding; + IBinding binding = null; if( name instanceof ICPPASTTemplateId ){ return CPPTemplates.createClassSpecialization( compType ); } try { - binding = (scope != null ) ? scope.getBinding( name, false ) : null; + if( name.toCharArray().length > 0 && scope != null ) //can't lookup anonymous things + binding = scope.getBinding( name, false ); if( binding == null || !(binding instanceof ICPPClassType) ){ if( template ) binding = new CPPClassTemplate( name );