1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Patch for Victor Mozgin.

This patch should improve parsing of new-expressions, including placements, array allocations and multiple parameters in initializers. Fixes PR36932.
This commit is contained in:
John Camelon 2003-06-09 22:02:31 +00:00
parent da0c569bff
commit 1aae7b2fa4
5 changed files with 335 additions and 31 deletions

View file

@ -1,10 +1,15 @@
2003-06-07 Victor Mozgin 2003-06-09 Victor Mozgin
Fixes for templated constructor/destructor/operator declarations. Fixed Bug 36932 - RTS: Parser fails on "new" in ctor initializer
This fixed PR 36766, 36767, 36769 (STL parsing problems). Improved handling of new-expressions: placements, arrays and
multiple parameters in initializers are now parsed.
2003-06-09 Victor Mozgin 2003-06-09 Victor Mozgin
Fixed Bug 36701 - Scanner looses non-token chars while macro stringizing Fixed Bug 36701 - Scanner looses non-token chars while macro stringizing
2003-06-07 Victor Mozgin
Fixes for templated constructor/destructor/operator declarations.
This fixed PR 36766, 36767, 36769 (STL parsing problems).
2003-06-06 Victor Mozgin 2003-06-06 Victor Mozgin
Fixed Bug 38065 - Scanner skipped backslashes inside the code Fixed Bug 38065 - Scanner skipped backslashes inside the code

View file

@ -2584,34 +2584,110 @@ c, quickParse);
consume (Token.t_new); consume (Token.t_new);
// TODO: We are still not handling placement new right boolean typeIdInParen = false;
// there are some ambiguities here that make it difficult to look ahead on boolean placementParseFailure = true;
// we will need a better strategy in order to not do 3 or 4 backtracks Token beforeSecondParen = null;
// every new expression Token backtrackMarker = null;
boolean typeIdInBrackets = false;
if( LT(1) == Token.tLPAREN ) if( LT(1) == Token.tLPAREN )
{ {
consume( Token.tLPAREN ); consume( Token.tLPAREN );
typeIdInBrackets = true;
try {
// Try to consume placement list
// Note: since expressionList and expression are the same...
backtrackMarker = mark();
expression(expression);
consume( Token.tRPAREN );
placementParseFailure = false;
if( LT(1) == Token.tLPAREN ) {
beforeSecondParen = mark();
consume( Token.tLPAREN );
typeIdInParen = true;
}
} catch (Backtrack e) {
backup(backtrackMarker);
}
if (placementParseFailure) {
// CASE: new (typeid-not-looking-as-placement) ...
// the first expression in () is not a placement
// - then it has to be typeId
typeId();
consume(Token.tRPAREN);
} else {
if (!typeIdInParen) {
if (LT(1) == Token.tLBRACKET) {
// CASE: new (typeid-looking-as-placement) [expr]...
// the first expression in () has been parsed as a placement;
// however, we assume that it was in fact typeId, and this
// new statement creates an array.
// Do nothing, fallback to array/initializer processing
} else {
// CASE: new (placement) typeid ...
// the first expression in () is parsed as a placement,
// and the next expression doesn't start with '(' or '['
// - then it has to be typeId
try { backtrackMarker = mark(); typeId(); } catch (Backtrack e) {
// Hmmm, so it wasn't typeId after all... Then it is
// CASE: new (typeid-looking-as-placement)
backup(backtrackMarker);
return;
}
}
} else {
// Tricky cases: first expression in () is parsed as a placement,
// and the next expression starts with '('.
// The problem is, the first expression might as well be a typeid
try {
typeId();
consume(Token.tRPAREN);
if (LT(1) == Token.tLPAREN || LT(1) == Token.tLBRACKET) {
// CASE: new (placement)(typeid)(initializer)
// CASE: new (placement)(typeid)[] ...
// Great, so far all our assumptions have been correct
// Do nothing, fallback to array/initializer processing
} else {
// CASE: new (placement)(typeid)
// CASE: new (typeid-looking-as-placement)(initializer-looking-as-typeid)
// Worst-case scenario - this cannot be resolved w/o more semantic information.
// Luckily, we don't need to know what was that - we only know that
// new-expression ends here.
return;
}
} catch (Backtrack e) {
// CASE: new (typeid-looking-as-placement)(initializer-not-looking-as-typeid)
// Fallback to initializer processing
backup(beforeSecondParen);
}
}
}
} else {
// CASE: new typeid ...
// new parameters do not start with '('
// i.e it has to be a plain typeId
typeId();
} }
typeId(); while (LT(1) == Token.tLBRACKET) {
// array new
if( typeIdInBrackets ) consume();
{ assignmentExpression(expression);
consume( Token.tRPAREN ); consume(Token.tRBRACKET);
} }
// newinitializer // newinitializer
if( LT(1) == Token.tLPAREN ) if( LT(1) == Token.tLPAREN )
{ {
consume( Token.tLPAREN ); consume( Token.tLPAREN );
if( LT(1) != Token.tRPAREN ) if( LT(1) != Token.tRPAREN )
assignmentExpression( expression ); expression( expression );
consume( Token.tRPAREN ); consume( Token.tRPAREN );
}
}
} }
/** /**

View file

@ -1,13 +1,17 @@
2003-06-07 Victor Mozgin 2003-06-09 Victor Mozgin
Moved testBug36766A(), testBug36766B() & testBug36766C() from STLFailedTests.java to DOMTests.java. Moved testBug36932() from DOMFailedTest.java to DOMTests.java.
Renamed them to testBug36766and36769x(), as they cover both PRs. Added DOMTests.testBug36932B() and DOMTests.testBug36932C().
Added testBug36766and36769D() - test for templated destructor.
2003-06-09 Victor Mozgin 2003-06-09 Victor Mozgin
Moved testBug36701() from ScannerFailedTests.java to ScannerTestCase.java. Moved testBug36701() from ScannerFailedTests.java to ScannerTestCase.java.
Renamed it to testBug36701A() and fixed it. Renamed it to testBug36701A() and fixed it.
Added ScannerTestCase.testBug36701B(). Added ScannerTestCase.testBug36701B().
2003-06-07 Victor Mozgin
Moved testBug36766A(), testBug36766B() & testBug36766C() from STLFailedTests.java to DOMTests.java.
Renamed them to testBug36766and36769x(), as they cover both PRs.
Added testBug36766and36769D() - test for templated destructor.
2003-06-05 John Camelon 2003-06-05 John Camelon
Moved testBug23478A() & testBug23478B() from failed tests to TranslationUnitTests.java. Moved testBug23478A() & testBug23478B() from failed tests to TranslationUnitTests.java.
Removed TranslationUnitFailedTests.java as it was empty. Removed TranslationUnitFailedTests.java as it was empty.

View file

@ -21,12 +21,7 @@ public class DOMFailedTest extends BaseDOMTest {
super(name); super(name);
} }
public void testBug36932() {
failTest("A::A( ) : var( new char [ (unsigned)bufSize ] ) {}");
}
public void testBug36730()throws Exception { public void testBug36730()throws Exception {
failTest("FUNCTION_MACRO( 1, a )\n int i;"); failTest("FUNCTION_MACRO( 1, a )\n int i;");
} }
} }

View file

@ -1818,5 +1818,229 @@ public class DOMTests extends BaseDOMTest {
code.write("{}\n"); code.write("{}\n");
parse(code.toString()); parse(code.toString());
} }
public void testBug36932A() throws Exception {
parse("A::A( ) : var( new char [ (unsigned)bufSize ] ) {}");
}
public void testBug36932B() throws Exception {
parse(" p = new int; ");
parse(" p = new int(5); ");
parse(" p = new int(B); ");
parse(" p = new int(B,C); ");
parse(" p = new int[5]; ");
parse(" p = new int[5][10]; ");
parse(" p = new int[B]; ");
parse(" p = new int[B][C][D]; ");
parse(" p = new A; ");
parse(" p = new A(5); ");
parse(" p = new A(B); ");
parse(" p = new A(B,C); ");
parse(" p = new A[5]; ");
parse(" p = new A[5][10]; ");
parse(" p = new A[B]; ");
parse(" p = new A[B][C][D]; ");
parse(" p = new (int); ");
parse(" p = new (int)(5); ");
parse(" p = new (int)(B); ");
parse(" p = new (int)(B,C); ");
parse(" p = new (int)[5]; ");
parse(" p = new (int)[5][10]; ");
parse(" p = new (int)[B]; ");
parse(" p = new (int)[B][C][D]; ");
parse(" p = new (A); ");
parse(" p = new (A)(5); ");
parse(" p = new (A)(B); ");
parse(" p = new (A)(B,C); ");
parse(" p = new (A)[5]; ");
parse(" p = new (A)[5][10]; ");
parse(" p = new (A)[B]; ");
parse(" p = new (A)[B][C][D]; ");
parse(" p = new (0) int; ");
parse(" p = new (0) int(5); ");
parse(" p = new (0) int(B); ");
parse(" p = new (0) int(B,C); ");
parse(" p = new (0) int[5]; ");
parse(" p = new (0) int[5][10]; ");
parse(" p = new (0) int[B]; ");
parse(" p = new (0) int[B][C][D]; ");
parse(" p = new (0) A; ");
parse(" p = new (0) A(5); ");
parse(" p = new (0) A(B); ");
parse(" p = new (0) A(B,C); ");
parse(" p = new (0) A[5]; ");
parse(" p = new (0) A[5][10]; ");
parse(" p = new (0) A[B]; ");
parse(" p = new (0) A[B][C][D]; ");
parse(" p = new (0) (int); ");
parse(" p = new (0) (int)(5); ");
parse(" p = new (0) (int)(B); ");
parse(" p = new (0) (int)(B,C); ");
parse(" p = new (0) (int)[5]; ");
parse(" p = new (0) (int)[5][10]; ");
parse(" p = new (0) (int)[B]; ");
parse(" p = new (0) (int)[B][C][D]; ");
parse(" p = new (0) (A); ");
parse(" p = new (0) (A)(5); ");
parse(" p = new (0) (A)(B); ");
parse(" p = new (0) (A)(B,C); ");
parse(" p = new (0) (A)[5]; ");
parse(" p = new (0) (A)[5][10]; ");
parse(" p = new (0) (A)[B]; ");
parse(" p = new (0) (A)[B][C][D]; ");
parse(" p = new (P) int; ");
parse(" p = new (P) int(5); ");
parse(" p = new (P) int(B); ");
parse(" p = new (P) int(B,C); ");
parse(" p = new (P) int[5]; ");
parse(" p = new (P) int[5][10]; ");
parse(" p = new (P) int[B]; ");
parse(" p = new (P) int[B][C][D]; ");
parse(" p = new (P) A; ");
parse(" p = new (P) A(5); ");
parse(" p = new (P) A(B); ");
parse(" p = new (P) A(B,C); ");
parse(" p = new (P) A[5]; ");
parse(" p = new (P) A[5][10]; ");
parse(" p = new (P) A[B]; ");
parse(" p = new (P) A[B][C][D]; ");
parse(" p = new (P) (int); ");
parse(" p = new (P) (int)(5); ");
parse(" p = new (P) (int)(B); ");
parse(" p = new (P) (int)(B,C); ");
parse(" p = new (P) (int)[5]; ");
parse(" p = new (P) (int)[5][10]; ");
parse(" p = new (P) (int)[B]; ");
parse(" p = new (P) (int)[B][C][D]; ");
parse(" p = new (P) (A); ");
parse(" p = new (P) (A)(5); ");
parse(" p = new (P) (A)(B); ");
parse(" p = new (P) (A)(B,C); ");
parse(" p = new (P) (A)[5]; ");
parse(" p = new (P) (A)[5][10]; ");
parse(" p = new (P) (A)[B]; ");
parse(" p = new (P) (A)[B][C][D]; ");
}
public void testBug36932C() throws Exception {
parse("X::X( ) : var( new int ) {}");
parse("X::X( ) : var( new int(5) ) {}");
parse("X::X( ) : var( new int(B) ) {}");
parse("X::X( ) : var( new int(B,C) ) {}");
parse("X::X( ) : var( new int[5] ) {}");
parse("X::X( ) : var( new int[5][10] ) {}");
parse("X::X( ) : var( new int[B] ) {}");
parse("X::X( ) : var( new int[B][C][D] ) {}");
parse("X::X( ) : var( new A ) {}");
parse("X::X( ) : var( new A(5) ) {}");
parse("X::X( ) : var( new A(B) ) {}");
parse("X::X( ) : var( new A(B,C) ) {}");
parse("X::X( ) : var( new A[5] ) {}");
parse("X::X( ) : var( new A[5][10] ) {}");
parse("X::X( ) : var( new A[B] ) {}");
parse("X::X( ) : var( new A[B][C][D] ) {}");
parse("X::X( ) : var( new (int) ) {}");
parse("X::X( ) : var( new (int)(5) ) {}");
parse("X::X( ) : var( new (int)(B) ) {}");
parse("X::X( ) : var( new (int)(B,C) ) {}");
parse("X::X( ) : var( new (int)[5] ) {}");
parse("X::X( ) : var( new (int)[5][10] ) {}");
parse("X::X( ) : var( new (int)[B] ) {}");
parse("X::X( ) : var( new (int)[B][C][D] ) {}");
parse("X::X( ) : var( new (A) ) {}");
parse("X::X( ) : var( new (A)(5) ) {}");
parse("X::X( ) : var( new (A)(B) ) {}");
parse("X::X( ) : var( new (A)(B,C) ) {}");
parse("X::X( ) : var( new (A)[5] ) {}");
parse("X::X( ) : var( new (A)[5][10] ) {}");
parse("X::X( ) : var( new (A)[B] ) {}");
parse("X::X( ) : var( new (A)[B][C][D] ) {}");
parse("X::X( ) : var( new (0) int ) {}");
parse("X::X( ) : var( new (0) int(5) ) {}");
parse("X::X( ) : var( new (0) int(B) ) {}");
parse("X::X( ) : var( new (0) int(B,C) ) {}");
parse("X::X( ) : var( new (0) int[5] ) {}");
parse("X::X( ) : var( new (0) int[5][10] ) {}");
parse("X::X( ) : var( new (0) int[B] ) {}");
parse("X::X( ) : var( new (0) int[B][C][D] ) {}");
parse("X::X( ) : var( new (0) A ) {}");
parse("X::X( ) : var( new (0) A(5) ) {}");
parse("X::X( ) : var( new (0) A(B) ) {}");
parse("X::X( ) : var( new (0) A(B,C) ) {}");
parse("X::X( ) : var( new (0) A[5] ) {}");
parse("X::X( ) : var( new (0) A[5][10] ) {}");
parse("X::X( ) : var( new (0) A[B] ) {}");
parse("X::X( ) : var( new (0) A[B][C][D] ) {}");
parse("X::X( ) : var( new (0) (int) ) {}");
parse("X::X( ) : var( new (0) (int)(5) ) {}");
parse("X::X( ) : var( new (0) (int)(B) ) {}");
parse("X::X( ) : var( new (0) (int)(B,C) ) {}");
parse("X::X( ) : var( new (0) (int)[5] ) {}");
parse("X::X( ) : var( new (0) (int)[5][10] ) {}");
parse("X::X( ) : var( new (0) (int)[B] ) {}");
parse("X::X( ) : var( new (0) (int)[B][C][D] ) {}");
parse("X::X( ) : var( new (0) (A) ) {}");
parse("X::X( ) : var( new (0) (A)(5) ) {}");
parse("X::X( ) : var( new (0) (A)(B) ) {}");
parse("X::X( ) : var( new (0) (A)(B,C) ) {}");
parse("X::X( ) : var( new (0) (A)[5] ) {}");
parse("X::X( ) : var( new (0) (A)[5][10] ) {}");
parse("X::X( ) : var( new (0) (A)[B] ) {}");
parse("X::X( ) : var( new (0) (A)[B][C][D] ) {}");
parse("X::X( ) : var( new (P) int ) {}");
parse("X::X( ) : var( new (P) int(5) ) {}");
parse("X::X( ) : var( new (P) int(B) ) {}");
parse("X::X( ) : var( new (P) int(B,C) ) {}");
parse("X::X( ) : var( new (P) int[5] ) {}");
parse("X::X( ) : var( new (P) int[5][10] ) {}");
parse("X::X( ) : var( new (P) int[B] ) {}");
parse("X::X( ) : var( new (P) int[B][C][D] ) {}");
parse("X::X( ) : var( new (P) A ) {}");
parse("X::X( ) : var( new (P) A(5) ) {}");
parse("X::X( ) : var( new (P) A(B) ) {}");
parse("X::X( ) : var( new (P) A(B,C) ) {}");
parse("X::X( ) : var( new (P) A[5] ) {}");
parse("X::X( ) : var( new (P) A[5][10] ) {}");
parse("X::X( ) : var( new (P) A[B] ) {}");
parse("X::X( ) : var( new (P) A[B][C][D] ) {}");
parse("X::X( ) : var( new (P) (int) ) {}");
parse("X::X( ) : var( new (P) (int)(5) ) {}");
parse("X::X( ) : var( new (P) (int)(B) ) {}");
parse("X::X( ) : var( new (P) (int)(B,C) ) {}");
parse("X::X( ) : var( new (P) (int)[5] ) {}");
parse("X::X( ) : var( new (P) (int)[5][10] ) {}");
parse("X::X( ) : var( new (P) (int)[B] ) {}");
parse("X::X( ) : var( new (P) (int)[B][C][D] ) {}");
parse("X::X( ) : var( new (P) (A) ) {}");
parse("X::X( ) : var( new (P) (A)(5) ) {}");
parse("X::X( ) : var( new (P) (A)(B) ) {}");
parse("X::X( ) : var( new (P) (A)(B,C) ) {}");
parse("X::X( ) : var( new (P) (A)[5] ) {}");
parse("X::X( ) : var( new (P) (A)[5][10] ) {}");
parse("X::X( ) : var( new (P) (A)[B] ) {}");
parse("X::X( ) : var( new (P) (A)[B][C][D] ) {}");
}
} }