From 121b48c3d1ca8847a887a4ab9cd227523dce8ea7 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 1 Jun 2005 20:30:59 +0000 Subject: [PATCH] Fixed 86282 [Parser] New expression for array of 10 pointers to funct... Fixed 90640 [Parser] invalid syntax error with cpp 8.2-3 Fixed 90671 [Parser] [Ambiguity]invalid syntax error on cpp 14.3-2 --- .../tests/ast2/AST2CPPSpecFailingTest.java | 54 +------------------ .../parser/tests/ast2/AST2CPPSpecTest.java | 46 ++++++++++++++++ .../core/parser/tests/ast2/AST2CPPTests.java | 8 ++- .../core/dom/parser/c/CASTDeclarator.java | 12 ++++- .../core/dom/parser/cpp/CPPASTDeclarator.java | 11 +++- .../dom/parser/cpp/GNUCPPSourceParser.java | 2 +- 6 files changed, 76 insertions(+), 57 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 a45fff06e6f..0a0ab3fc811 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 @@ -141,34 +141,7 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } } - /** - [--Start Example(CPP 8.2-3): - // #include - char *p; - void *operator new(size_t, int); - void foo() { - const int x = 63; - new (int(*p)) int; // newplacement expression - new (int(*[x])); // new typeid - } - --End Example] - */ - public void test8_2s3() { // TODO raised bug 90640 - StringBuffer buffer = new StringBuffer(); - buffer.append("// #include \n"); //$NON-NLS-1$ - buffer.append("char *p;\n"); //$NON-NLS-1$ - buffer.append("void *operator new(size_t, int);\n"); //$NON-NLS-1$ - buffer.append("void foo() {\n"); //$NON-NLS-1$ - buffer.append("const int x = 63;\n"); //$NON-NLS-1$ - buffer.append("new (int(*p)) int; // newplacement expression\n"); //$NON-NLS-1$ - buffer.append("new (int(*[x])); // new typeid\n"); //$NON-NLS-1$ - buffer.append("}\n"); //$NON-NLS-1$ - try { - parse(buffer.toString(), ParserLanguage.CPP, false, 0); - assertTrue(false); - } catch (Exception e) { - } - } + /** [--Start Example(CPP 8.2-4): @@ -268,31 +241,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } catch (Exception e) { } } - - /** - [--Start Example(CPP 14.3-2): - template void f(); - template void f(); - void g() - { - f(); // int() is a typeid:call the first f() - } - --End Example] - */ - public void test14_3s2() { // TODO raised bug 90671 - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f();\n"); //$NON-NLS-1$ - buffer.append("template void f();\n"); //$NON-NLS-1$ - buffer.append("void g()\n"); //$NON-NLS-1$ - buffer.append("{\n"); //$NON-NLS-1$ - buffer.append("f(); // int() is a typeid:call the first f()\n"); //$NON-NLS-1$ - buffer.append("}\n"); //$NON-NLS-1$ - try { - parse(buffer.toString(), ParserLanguage.CPP, true, 0); - assertTrue(false); - } catch (Exception e) { - } - } /** [--Start Example(CPP 14.5.3-1): 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 6008dbfe1fc..d026201587f 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 @@ -12532,4 +12532,50 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { buffer.append( "}"); parse(buffer.toString(), ParserLanguage.CPP, true, 0); } + + /** + [--Start Example(CPP 8.2-3): + // #include + char *p; + void *operator new(size_t, int); + void foo() { + const int x = 63; + new (int(*p)) int; // newplacement expression + new (int(*[x])); // new typeid + } + --End Example] + */ + public void test8_2s3() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("// #include \n"); //$NON-NLS-1$ + buffer.append("char *p;\n"); //$NON-NLS-1$ + buffer.append("void *operator new(size_t, int);\n"); //$NON-NLS-1$ + buffer.append("void foo() {\n"); //$NON-NLS-1$ + buffer.append("const int x = 63;\n"); //$NON-NLS-1$ + buffer.append("new (int(*p)) int; // newplacement expression\n"); //$NON-NLS-1$ + buffer.append("new (int(*[x])); // new typeid\n"); //$NON-NLS-1$ + buffer.append("}\n"); //$NON-NLS-1$ + parse(buffer.toString(), ParserLanguage.CPP, false, 0); + } + + /** + [--Start Example(CPP 14.3-2): + template void f(); + template void f(); + void g() + { + f(); // int() is a typeid:call the first f() + } + --End Example] + */ + public void test14_3s2() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template void f();\n"); //$NON-NLS-1$ + buffer.append("template void f();\n"); //$NON-NLS-1$ + buffer.append("void g()\n"); //$NON-NLS-1$ + buffer.append("{\n"); //$NON-NLS-1$ + buffer.append("f(); // int() is a typeid:call the first f()\n"); //$NON-NLS-1$ + buffer.append("}\n"); //$NON-NLS-1$ + parse(buffer.toString(), ParserLanguage.CPP, true, 0); + } } 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 7c053699bba..ee6a3b0e459 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 @@ -102,6 +102,13 @@ import org.eclipse.cdt.internal.core.parser.ParserException; public class AST2CPPTests extends AST2BaseTest { + public void testBug86282() throws Exception { + IASTTranslationUnit tu = parse( "void foo() { int (* f[])() = new (int (*[10])()); }", ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + assertNoProblemBindings( col ); + } + public void testBug75858() throws Exception { StringBuffer buffer = new StringBuffer(); buffer.append( "bool f() {\n" ); @@ -3990,7 +3997,6 @@ public class AST2CPPTests extends AST2BaseTest { CPPNameCollector col = new CPPNameCollector(); tu.accept(col); assertNoProblemBindings(col); - } protected void assertNoProblemBindings(CPPNameCollector col) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java index ec69e8541ff..48cd6a4c1ca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java @@ -102,10 +102,20 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator { } } + if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR && nestedDeclarator == null ) { - if( name != null ) if( !name.accept( action ) ) return false; + if( getParent() instanceof IASTDeclarator ) + { + IASTDeclarator outermostDeclarator = (IASTDeclarator) getParent(); + while( outermostDeclarator.getParent() instanceof IASTDeclarator ) + outermostDeclarator = (IASTDeclarator) outermostDeclarator.getParent(); + if( outermostDeclarator.getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR ) + if( name != null ) if( !name.accept( action ) ) return false; + } + else + if( name != null ) if( !name.accept( action ) ) return false; } if( nestedDeclarator != null ) if( !nestedDeclarator.accept( action ) ) return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java index 400b58060fc..c0ce5409b57 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java @@ -110,7 +110,16 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator { if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR && nestedDeclarator == null ) { - if( name != null ) if( !name.accept( action ) ) return false; + if( getParent() instanceof IASTDeclarator ) + { + IASTDeclarator outermostDeclarator = (IASTDeclarator) getParent(); + while( outermostDeclarator.getParent() instanceof IASTDeclarator ) + outermostDeclarator = (IASTDeclarator) outermostDeclarator.getParent(); + if( outermostDeclarator.getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR ) + if( name != null ) if( !name.accept( action ) ) return false; + } + else + if( name != null ) if( !name.accept( action ) ) return false; } if( nestedDeclarator != null ) if( !nestedDeclarator.accept( action ) ) return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index ef54e7aaac7..514268158d2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -1126,7 +1126,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // CASE: new (typeid-not-looking-as-placement) ... // the first expression in () is not a placement // - then it has to be typeId - typeId = typeId(true); + typeId = typeId(false); lastOffset = consume(IToken.tRPAREN).getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.pop();