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 33908a65c2c..a84b77f863f 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 @@ -3138,5 +3138,22 @@ public class AST2CPPTests extends AST2BaseTest { assertTrue( col.getName(2).resolveBinding() instanceof ICPPClassType ); assertTrue( col.getName(3).resolveBinding() instanceof ICPPClassType ); } + + public void testBug89828() throws Exception { + IASTTranslationUnit tu = parse( "class B * b; void f(); void f( int );", ParserLanguage.CPP ); //$NON-NLS-1$ + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + assertTrue( col.getName(0).resolveBinding() instanceof ICPPClassType ); + assertTrue( col.getName(1).resolveBinding() instanceof ICPPVariable ); + IFunction f1 = (IFunction) col.getName(2).resolveBinding(); + IFunction f2 = (IFunction) col.getName(3).resolveBinding(); + + IScope scope = tu.getScope(); + IBinding [] bs = scope.find("f"); //$NON-NLS-1$ + assertEquals( bs.length, 2 ); + assertSame( bs[0], f1 ); + assertSame( bs[1], f2 ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java index e65f34c395c..34d1b0154d2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java @@ -1301,13 +1301,24 @@ public class CPPSemantics { return (IBinding) bindings[0]; } - LookupData data = createLookupData( name, false ); - data.foundItems = bindings; - try { - return resolveAmbiguities( data, name ); - } catch ( DOMException e ) { - return e.getProblem(); + if( name.getPropertyInParent() != STRING_LOOKUP_PROPERTY ) { + LookupData data = createLookupData( name, false ); + data.foundItems = bindings; + try { + return resolveAmbiguities( data, name ); + } catch ( DOMException e ) { + return e.getProblem(); + } + } + + IBinding [] result = null; + for ( int i = 0; i < bindings.length; i++ ) { + if( bindings[i] instanceof IASTName ) + result = (IBinding[]) ArrayUtil.append( IBinding.class, result, ((IASTName)bindings[i]).resolveBinding() ); + else if( bindings[i] instanceof IBinding ) + result = (IBinding[]) ArrayUtil.append( IBinding.class, result, bindings[i] ); } + return new CPPCompositeBinding( result ); } static public boolean declaredBefore( Object obj, IASTNode node ){