mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
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
This commit is contained in:
parent
8e99ab5565
commit
121b48c3d1
6 changed files with 76 additions and 57 deletions
|
@ -141,34 +141,7 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
[--Start Example(CPP 8.2-3):
|
|
||||||
// #include <cstddef>
|
|
||||||
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 <cstddef>\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):
|
[--Start Example(CPP 8.2-4):
|
||||||
|
@ -269,31 +242,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
[--Start Example(CPP 14.3-2):
|
|
||||||
template<class T> void f();
|
|
||||||
template<int I> void f();
|
|
||||||
void g()
|
|
||||||
{
|
|
||||||
f<int()>(); // 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<class T> void f();\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<int I> void f();\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void g()\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("{\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("f<int()>(); // 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):
|
[--Start Example(CPP 14.5.3-1):
|
||||||
template<class T> class task;
|
template<class T> class task;
|
||||||
|
|
|
@ -12532,4 +12532,50 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
||||||
buffer.append( "}");
|
buffer.append( "}");
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
[--Start Example(CPP 8.2-3):
|
||||||
|
// #include <cstddef>
|
||||||
|
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 <cstddef>\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<class T> void f();
|
||||||
|
template<int I> void f();
|
||||||
|
void g()
|
||||||
|
{
|
||||||
|
f<int()>(); // int() is a typeid:call the first f()
|
||||||
|
}
|
||||||
|
--End Example]
|
||||||
|
*/
|
||||||
|
public void test14_3s2() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append("template<class T> void f();\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<int I> void f();\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void g()\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("{\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("f<int()>(); // 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,13 @@ import org.eclipse.cdt.internal.core.parser.ParserException;
|
||||||
|
|
||||||
public class AST2CPPTests extends AST2BaseTest {
|
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 {
|
public void testBug75858() throws Exception {
|
||||||
StringBuffer buffer = new StringBuffer();
|
StringBuffer buffer = new StringBuffer();
|
||||||
buffer.append( "bool f() {\n" );
|
buffer.append( "bool f() {\n" );
|
||||||
|
@ -3990,7 +3997,6 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
CPPNameCollector col = new CPPNameCollector();
|
CPPNameCollector col = new CPPNameCollector();
|
||||||
tu.accept(col);
|
tu.accept(col);
|
||||||
assertNoProblemBindings(col);
|
assertNoProblemBindings(col);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertNoProblemBindings(CPPNameCollector col) {
|
protected void assertNoProblemBindings(CPPNameCollector col) {
|
||||||
|
|
|
@ -102,10 +102,20 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR &&
|
if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR &&
|
||||||
nestedDeclarator == null )
|
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;
|
if( nestedDeclarator != null ) if( !nestedDeclarator.accept( action ) ) return false;
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,16 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator {
|
||||||
if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR &&
|
if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR &&
|
||||||
nestedDeclarator == null )
|
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;
|
if( nestedDeclarator != null ) if( !nestedDeclarator.accept( action ) ) return false;
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
// CASE: new (typeid-not-looking-as-placement) ...
|
// CASE: new (typeid-not-looking-as-placement) ...
|
||||||
// the first expression in () is not a placement
|
// the first expression in () is not a placement
|
||||||
// - then it has to be typeId
|
// - then it has to be typeId
|
||||||
typeId = typeId(true);
|
typeId = typeId(false);
|
||||||
lastOffset = consume(IToken.tRPAREN).getEndOffset();
|
lastOffset = consume(IToken.tRPAREN).getEndOffset();
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
|
|
Loading…
Add table
Reference in a new issue