From 7c1d5beb4f024e7a7ccb6e1efe05dc32910760a3 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 17 May 2005 18:04:08 +0000 Subject: [PATCH] fix bug 95419 --- .../core/parser/tests/ast2/AST2CPPTests.java | 14 ++++++++++++++ .../core/dom/parser/cpp/CPPSemantics.java | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) 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;