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 60067c4c1da..48f3b858495 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 @@ -4220,4 +4220,18 @@ public class AST2CPPTests extends AST2BaseTest { ICPPField bar = (ICPPField) col.getName(1).resolveBinding(); assertSame( bar, col.getName(6).resolveBinding() ); } + public void testBug95419() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("int strcmp( const char * ); \n"); //$NON-NLS-1$ + buffer.append("void f( const char * const * argv ){ \n"); //$NON-NLS-1$ + buffer.append(" strcmp( *argv ); \n"); //$NON-NLS-1$ + buffer.append("} \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + ICPPFunction strcmp = (ICPPFunction) col.getName(0).resolveBinding(); + assertSame( strcmp, col.getName(4).resolveBinding() ); + } } 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 78b2fa4f386..7cc76d2924a 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 @@ -2531,6 +2531,25 @@ public class CPPSemantics { source = new CPPPointerType( ((IArrayType)source).getType() ); } + //4.1 if T is a non-class type, the type of the rvalue is the cv-unqualified version of T + if( source instanceof IQualifierType ){ + IType t = ((IQualifierType)source).getType(); + while( t instanceof ITypedef ) + t = ((ITypedef)t).getType(); + if( !(t instanceof ICPPClassType) ){ + source = t; + } + } else if( source instanceof IPointerType && + ( ((IPointerType)source).isConst() || ((IPointerType)source).isVolatile() ) ) + { + IType t = ((IPointerType)source).getType(); + while( t instanceof ITypedef ) + t = ((ITypedef)t).getType(); + if( !(t instanceof ICPPClassType) ){ + source = new CPPPointerType( t ); + } + } + cost.source = source; cost.target = target;