1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-30 20:35:38 +02:00

Fix and testcase for 180979, name resolution failure.

This commit is contained in:
Markus Schorn 2007-04-04 15:55:56 +00:00
parent 30b7b74871
commit b106c45f80
2 changed files with 47 additions and 27 deletions

View file

@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Ed Swartz (Nokia)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Nov 29, 2004
@ -220,7 +221,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append( "int (*zzz2) (char); \n" ); //$NON-NLS-1$
buffer.append( "int ((*zzz3)) (char); \n" ); //$NON-NLS-1$
buffer.append( "int (*(zzz4)) (char); \n" ); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
@ -228,7 +229,7 @@ public class AST2CPPTests extends AST2BaseTest {
protected IASTTranslationUnit parseAndCheckBindings( String code ) throws Exception
{
IASTTranslationUnit tu = parse( code, ParserLanguage.CPP ); //$NON-NLS-1$
IASTTranslationUnit tu = parse( code, ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
@ -1624,7 +1625,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" f( parm ); \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3327,7 +3328,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" B::i; \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3357,7 +3358,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" B () : A() {} \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3368,7 +3369,7 @@ public class AST2CPPTests extends AST2BaseTest {
ICPPConstructor A3 = (ICPPConstructor) col.getName(4).resolveBinding();
assertSame(A3.getScope(), A1.getCompositeScope());
tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
tu = parse(buffer.toString(), ParserLanguage.CPP);
col = new CPPNameCollector();
tu.accept(col);
@ -3383,7 +3384,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("class A; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3458,7 +3459,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("char& operator[](unsigned int);\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3486,7 +3487,7 @@ public class AST2CPPTests extends AST2BaseTest {
.append("template <class A,B> class X<A,C> { operator int(); }; \n"); //$NON-NLS-1$
buffer.append("template <class A,B> X<A,C>::operator int() { } \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3625,7 +3626,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" f( ( 1, 2 ) ); \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3661,7 +3662,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("X x; \n"); //$NON-NLS-1$
buffer.append("class X { }; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3781,7 +3782,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" typedef I I; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3816,7 +3817,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("void f11( I i ); \n"); //$NON-NLS-1$
buffer.append("void main(){ f a; } \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3835,7 +3836,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("Y y; \n"); //$NON-NLS-1$
buffer.append("X x = new X( y ); \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3855,7 +3856,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("int f( float ); \n"); //$NON-NLS-1$
buffer.append("int x = f(a); \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3875,7 +3876,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" return *this; \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3898,7 +3899,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" f( \"test\" ); \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3914,7 +3915,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" f( g ) ; \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3958,7 +3959,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" a = 1; \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -3974,7 +3975,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" a; \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -4001,7 +4002,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" e->d(); \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -4030,7 +4031,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" int xCoord; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -4067,7 +4068,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append("class Dummy { int v(); int d; }; \n"); //$NON-NLS-1$
buffer.append("void Dummy::v( int ){ d++; } \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -4087,7 +4088,7 @@ public class AST2CPPTests extends AST2BaseTest {
buffer.append(" f( ); \n"); //$NON-NLS-1$
buffer.append("} \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
@ -5192,4 +5193,21 @@ public class AST2CPPTests extends AST2BaseTest {
field = (IField) name.resolveBinding();
assertTrue(field.isStatic());
}
public void testBug180979() throws Exception {
StringBuffer buffer = new StringBuffer( );
buffer.append( "namespace nsSplit {}\r\n"); //$NON-NLS-1$
buffer.append( "namespace nsSplit {void a();}\r\n"); //$NON-NLS-1$
buffer.append( "void nsSplit::a() {}\r\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP, true, true );
// check class
IASTFunctionDefinition fd = (IASTFunctionDefinition) tu.getDeclarations()[2];
IASTDeclarator fdecl= fd.getDeclarator();
IASTName name= fdecl.getName();
IBinding binding= name.resolveBinding();
assertTrue(binding instanceof IFunction);
assertFalse(binding instanceof IProblemBinding);
}
}

View file

@ -1477,9 +1477,11 @@ public class CPPSemantics {
//need binding because namespaces can be split
CPPNamespace namespace = (CPPNamespace) ((ICPPASTNamespaceDefinition)parent).getName().resolveBinding();
namespaceDefs = namespace.getNamespaceDefinitions();
nodes = ((ICPPASTNamespaceDefinition)namespaceDefs[0].getParent()).getDeclarations();
namespaceIdx = 0;
namespaceIdx= 0;
nodes = ((ICPPASTNamespaceDefinition)namespaceDefs[namespaceIdx].getParent()).getDeclarations();
while (nodes.length == 0 && ++namespaceIdx < namespaceDefs.length) {
nodes= ((ICPPASTNamespaceDefinition)namespaceDefs[namespaceIdx].getParent()).getDeclarations();
}
} else if( parent instanceof ICPPASTFunctionDeclarator ){
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) parent;
nodes = dtor.getParameters();