diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index f312989e3bd..69ba20bdaa9 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,3 +1,9 @@ +2003-04-27 John Camelon + Partial fix for Bug 36932 - RTS: Parser fails on "new" in ctor initializer + Fixed Bug 36704 - Problem parsing Loki's Reference Typelist.h + Fixed Bug 36699 - Problem parsing Loki's Reference SmartPtr.h Impl + Fixed Bug 36691 - Problem parsing Loki's Reference HierarchyGenerators.h Impl + 2003-04-25 Andrew Niefer Fixed bug36771 - Outline view shows include with no name Fixed bug36714 - Parser fails on initial assignment using floating-suffix diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 92907315b2f..d41e7709332 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -861,7 +861,23 @@ c, quick); break; case Token.t_typename: try{ callback.simpleDeclSpecifier(decl, consume( Token.t_typename ));} catch( Exception e ) {} + Token first = LA(1); + Token last = null; name(); + if( LT(1) == Token.t_template ) + { + consume( Token.t_template ); + last = templateId(); + try + { + callback.nameBegin( first ); + callback.nameEnd( last ); + } + catch( Exception e ) { } + + + } + try{ callback.simpleDeclSpecifierName( decl );} catch( Exception e ) {} return; case Token.tCOLONCOLON: @@ -872,6 +888,8 @@ c, quick); // handle nested later: if ( flags.haveEncounteredRawType() ) return; + if( parm && flags.haveEncounteredTypename() ) + return; if ( lookAheadForConstructor( flags ) ) return; if ( lookAheadForDeclarator( flags ) ) @@ -962,32 +980,11 @@ c, quick); */ protected void className() throws Backtrack { - Token first = LA(1); if( LT(1) == Token.tIDENTIFIER) { if( LT(2) == Token.tLT ) { - consume( Token.tIDENTIFIER ); - consume( Token.tLT ); - - // until we get all the names sorted out - int depth = 1; - Token last = null; - - while (depth > 0) { - last = consume(); - switch ( last.getType()) { - case Token.tGT: - --depth; - break; - case Token.tLT: - ++depth; - break; - } - } - - callback.nameBegin( first ); - callback.nameEnd( last ); + templateId(); } else { @@ -998,6 +995,31 @@ c, quick); else throw backtrack; } + + protected Token templateId() throws Backtrack, EndOfFile { + Token first = consume( Token.tIDENTIFIER ); + consume( Token.tLT ); + + // until we get all the names sorted out + int depth = 1; + Token last = null; + + while (depth > 0) { + last = consume(); + switch ( last.getType()) { + case Token.tGT: + --depth; + break; + case Token.tLT: + ++depth; + break; + } + } + + callback.nameBegin( first ); + callback.nameEnd( last ); + return last; + } /** * name @@ -1055,6 +1077,9 @@ c, quick); while (LT(1) == Token.tCOLONCOLON) { last = consume(); + if (LT(1) == Token.t_template ) + consume(); + if (LT(1) == Token.tCOMPL) consume(); @@ -2013,9 +2038,22 @@ c, quick); case Token.tLT: case Token.tLTEQUAL: case Token.tGTEQUAL: + Token mark = mark(); Token t = consume(); + Token next = LA(1); shiftExpression(expression); - try{ callback.expressionOperator(expression, t);} catch( Exception e ) {} + if( next == LA(1) ) + { + // we did not consume anything + // this is most likely an error + backup( mark ); + return; + } + else + { + try{ callback.expressionOperator(expression, t);} catch( Exception e ) {} + } + break; default: return; @@ -2195,6 +2233,21 @@ c, quick); castExpression( expression ); } + /** + * + * @param expression + * @throws Backtrack + * + * + * newexpression: ::? new newplacement? newtypeid newinitializer? + * ::? new newplacement? ( typeid ) newinitializer? + * newplacement: ( expressionlist ) + * newtypeid: typespecifierseq newdeclarator? + * newdeclarator: ptroperator newdeclarator? | directnewdeclarator + * directnewdeclarator: [ expression ] + * directnewdeclarator [ constantexpression ] + * newinitializer: ( expressionlist? ) + */ protected void newExpression( Object expression ) throws Backtrack { if (LT(1) == Token.tCOLONCOLON) { // global scope @@ -2203,7 +2256,34 @@ c, quick); consume (Token.t_new); - //TODO: finish this horrible mess... + // TODO: We are still not handling placement new right + // there are some ambiguities here that make it difficult to look ahead on + // we will need a better strategy in order to not do 3 or 4 backtracks + // every new expression + + boolean typeIdInBrackets = false; + if( LT(1) == Token.tLPAREN ) + { + consume( Token.tLPAREN ); + typeIdInBrackets = true; + } + + typeId(); + + if( typeIdInBrackets ) + { + consume( Token.tRPAREN ); + } + + // newinitializer + if( LT(1) == Token.tLPAREN ) + { + consume( Token.tLPAREN ); + if( LT(1) != Token.tRPAREN ) + assignmentExpression( expression ); + consume( Token.tRPAREN ); + } + } protected void unaryExpression( Object expression ) throws Backtrack { @@ -2476,7 +2556,9 @@ c, quick); if (currToken == null) currToken = fetchToken(); - lastToken = currToken; + if( currToken != null ) + lastToken = currToken; + currToken = currToken.getNext(); return lastToken; } diff --git a/core/org.eclipse.cdt.ui.tests/ChangeLog b/core/org.eclipse.cdt.ui.tests/ChangeLog index 6bcab5c4b15..5498b6eea75 100644 --- a/core/org.eclipse.cdt.ui.tests/ChangeLog +++ b/core/org.eclipse.cdt.ui.tests/ChangeLog @@ -1,3 +1,10 @@ +2003-04-27 John Camelon + Added testBug36932() to DOMTests. + Moved testBugFunctor758() from LokiFailures to DOMTests. + Moved testBug36704() from DOMFailedTest to DOMTests. + Moved testBug36699() from DOMFailedTest to DOMTests. + Moved testBug36691() from DOMFailedTest to DOMTests. + 2003-04-25 Andrew Niefer Moved ACEFailedTest::testBug36771 to DOMTests Moved DOMFailedTest::testBug36714 to DOMTests diff --git a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java index caab38c967c..09e64f81eb3 100644 --- a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java +++ b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java @@ -10,9 +10,6 @@ ***********************************************************************/ package org.eclipse.cdt.core.parser.failedTests; -import java.io.StringWriter; -import java.io.Writer; - import org.eclipse.cdt.core.parser.tests.BaseDOMTest; /** @@ -23,33 +20,6 @@ public class DOMFailedTest extends BaseDOMTest { public DOMFailedTest(String name) { super(name); } - - public void testBug36704() throws Exception { - failTest("template struct Length< Typelist > { enum { value = 1 + Length::value };};);"); - } - - public void testBug36691() throws Exception { - Writer code = new StringWriter(); - code.write("template \n"); - code.write( - "typename H::template Rebind::Result& Field(H& obj)\n"); - code.write("{ return obj; }\n"); - failTest(code.toString()); - } - - public void testBug36699() throws Exception { - Writer code = new StringWriter(); - code.write( - "template < template class ThreadingModel = DEFAULT_THREADING,\n"); - code.write("std::size_t chunkSize = DEFAULT_CHUNK_SIZE,\n"); - code.write( - "std::size_t maxSmallObjectSize = MAX_SMALL_OBJECT_SIZE >\n"); - code.write("class SmallObject : public ThreadingModel<\n"); - code.write( - "SmallObject >\n"); - code.write("{};\n"); - failTest(code.toString()); - } public void testBug36730(){ failTest("FUNCTION_MACRO( 1, a );\n int i;"); diff --git a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/LokiFailures.java b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/LokiFailures.java index 2abde033d90..994c7378a7e 100644 --- a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/LokiFailures.java +++ b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/LokiFailures.java @@ -28,10 +28,6 @@ public class LokiFailures extends BaseDOMTest { public void testBugSingleton192() { failTest("int Test::* pMember_;" ); } - - public void testBugFunctor758() { - failTest( "template Functor(Fun fun) : spImpl_(new FunctorHandler(fun)){}" ); - } public void testBugTypeManip151() { diff --git a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java index da3bd3b0f92..d9416e8a444 100644 --- a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java +++ b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java @@ -1712,5 +1712,48 @@ public class DOMTests extends BaseDOMTest { TranslationUnit tu = parse( code.toString() ); } + + public void testBugFunctor758() throws Exception { + TranslationUnit tu = parse( "template Functor(Fun fun) : spImpl_(new FunctorHandler(fun)){}" ); + } + + public void testBug36932() throws Exception + { + TranslationUnit tu = parse( "A::A(): b( new int( 5 ) ), b( new B ), c( new int ) {}" ); + } + + public void testBug36704() throws Exception { + Writer code = new StringWriter(); + code.write( "template \n" ); + code.write( "struct Length< Typelist >\n" ); + code.write( "{\n" ); + code.write( "enum { value = 1 + Length::value };\n" ); + code.write( "};\n" ); + parse(code.toString()); + } + + public void testBug36699() throws Exception { + Writer code = new StringWriter(); + code.write( + "template < template class ThreadingModel = DEFAULT_THREADING,\n"); + code.write("std::size_t chunkSize = DEFAULT_CHUNK_SIZE,\n"); + code.write( + "std::size_t maxSmallObjectSize = MAX_SMALL_OBJECT_SIZE >\n"); + code.write("class SmallObject : public ThreadingModel<\n"); + code.write( + "SmallObject >\n"); + code.write("{};\n"); + parse(code.toString()); + } + + public void testBug36691() throws Exception { + Writer code = new StringWriter(); + code.write("template \n"); + code.write( + "typename H::template Rebind::Result& Field(H& obj)\n"); + code.write("{ return obj; }\n"); + parse(code.toString()); + } + }