From ed7f6960456b4676c6bda205cd75ea0e65cfe309 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 10 May 2005 15:37:09 +0000 Subject: [PATCH] fix lookup of names in a declaration that come after a qualified name (bug 90610) --- .../tests/ast2/AST2CPPSpecFailingTest.java | 31 ------------------- .../parser/tests/ast2/AST2CPPSpecTest.java | 26 ++++++++++++++++ .../core/parser/tests/ast2/AST2CPPTests.java | 18 +++++++++++ .../core/dom/parser/cpp/CPPVisitor.java | 13 ++++++++ 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java index 67f58cd9d3b..bf4cf1f4d1a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java @@ -74,37 +74,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } } - /** - [--Start Example(CPP 3.4.3-3): - class X { }; - class C { - class X { }; - static const int number = 50; - static X arr[number]; - }; - X C::arr[number]; // illformed: - // equivalent to: ::X C::arr[C::number]; - // not to: C::X C::arr[C::number]; - --End Example] - */ - public void test3_4_3s3() { // TODO raised bug 90610 - StringBuffer buffer = new StringBuffer(); - buffer.append("class X { };\n"); //$NON-NLS-1$ - buffer.append("class C {\n"); //$NON-NLS-1$ - buffer.append("class X { };\n"); //$NON-NLS-1$ - buffer.append("static const int number = 50;\n"); //$NON-NLS-1$ - buffer.append("static X arr[number];\n"); //$NON-NLS-1$ - buffer.append("};\n"); //$NON-NLS-1$ - buffer.append("X C::arr[number]; // illformed:\n"); //$NON-NLS-1$ - buffer.append("// equivalent to: ::X C::arr[C::number];\n"); //$NON-NLS-1$ - buffer.append("// not to: C::X C::arr[C::number];\n"); //$NON-NLS-1$ - try { - parse(buffer.toString(), ParserLanguage.CPP, true, 0); - assertTrue(false); - } catch (Exception e) { - } - } - /** [--Start Example(CPP 6.4-3): int foo() { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java index 742f60ee25a..dafcece3c1b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java @@ -491,7 +491,33 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(buffer.toString(), ParserLanguage.CPP, true, 0); } + /** + [--Start Example(CPP 3.4.3-3): + class X { }; + class C { + class X { }; + static const int number = 50; + static X arr[number]; + }; + X C::arr[number]; // illformed: + // equivalent to: ::X C::arr[C::number]; + // not to: C::X C::arr[C::number]; + --End Example] + */ + public void test3_4_3s3() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("class X { };\n"); //$NON-NLS-1$ + buffer.append("class C {\n"); //$NON-NLS-1$ + buffer.append("class X { };\n"); //$NON-NLS-1$ + buffer.append("static const int number = 50;\n"); //$NON-NLS-1$ + buffer.append("static X arr[number];\n"); //$NON-NLS-1$ + buffer.append("};\n"); //$NON-NLS-1$ + buffer.append("X C::arr[number]; // illformed:\n"); //$NON-NLS-1$ + buffer.append("// equivalent to: ::X C::arr[C::number];\n"); //$NON-NLS-1$ + buffer.append("// not to: C::X C::arr[C::number];\n"); //$NON-NLS-1$ + parse(buffer.toString(), ParserLanguage.CPP, true, 0); + } /** [--Start Example(CPP 3_4_3-5): 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 c5b5df7a350..5bbc6deb256 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 @@ -3968,4 +3968,22 @@ public class AST2CPPTests extends AST2BaseTest { assertNoProblemBindings( nameResolver ); } + public void testBug90610() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("class C { \n"); //$NON-NLS-1$ + buffer.append(" static const int n = 1; \n"); //$NON-NLS-1$ + buffer.append(" static int arr[ n ]; \n"); //$NON-NLS-1$ + buffer.append("}; \n"); //$NON-NLS-1$ + buffer.append("int C::arr[n]; \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + ICPPField n = (ICPPField) col.getName(1).resolveBinding(); + assertTrue( n.isStatic() ); + + assertInstances( col, n, 3 ); + } + } 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 a37bbc43f9b..1954164303a 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 @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTGotoStatement; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; +import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; @@ -701,6 +702,18 @@ public class CPPVisitor { IASTCompoundStatement body = (IASTCompoundStatement) ((IASTFunctionDefinition)temp).getBody(); return body.getScope(); } + } else if( parent instanceof IASTArrayModifier || parent instanceof IASTInitializer ){ + IASTNode d = parent.getParent(); + while( !(d instanceof IASTDeclarator) ) + d = d.getParent(); + IASTDeclarator dtor = (IASTDeclarator) d; + while( dtor.getNestedDeclarator() != null ) + dtor = dtor.getNestedDeclarator(); + IASTName name = dtor.getName(); + if( name instanceof ICPPASTQualifiedName ){ + IASTName [] ns = ((ICPPASTQualifiedName)name).getNames(); + return getContainingScope( ns[ ns.length - 1 ] ); + } } } else if( node instanceof ICPPASTTemplateParameter ){ return CPPTemplates.getContainingScope( node );