From 9b571cb993ddf6d78494ffe0b38436a1fd2dbdd7 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 28 Jul 2003 14:18:39 +0000 Subject: [PATCH] Patch for Victor Mozgin. Fixed PR 39537 : Parser fails if template parameters contain '>' or '<' characters. --- core/org.eclipse.cdt.core.tests/ChangeLog | 3 ++ .../parser/failedTests/ASTFailedTests.java | 4 --- .../core/parser/tests/QuickParseASTTests.java | 6 ++++ core/org.eclipse.cdt.core/parser/ChangeLog | 3 ++ .../cdt/internal/core/parser/Parser.java | 34 +++++++++++++++---- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 34cff48e791..faef813f3d8 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,6 @@ +2003-07-28 Victor Mozgin + Moved testBug39537() from ASTFailedTests.java to QuickParseASTTests.java. + 2003-07-27 John Camelon Fixed failedTests::testBug40714() to fail properly. diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java index b1d21115788..771cef78c98 100644 --- a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java @@ -107,10 +107,6 @@ public class ASTFailedTests extends BaseASTTest { assertCodeFailsParse("template class X { inline X(int); };"); } - public void testBug39537() throws Exception - { - assertCodeFailsParse("typedef foo<(U::id > 0)> foobar;"); - } public void testBug39538() throws Exception { assertCodeFailsParse("template C::operator int ();"); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java index 9e2157346d8..b938bd0c59b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java @@ -1709,4 +1709,10 @@ public class QuickParseASTTests extends BaseASTTest parse("#define COMP_INC \"foobar.h\" \n" + "#include COMP_INC"); assertTrue( quickParseCallback.getInclusions().hasNext() ); } + + public void testBug39537() throws Exception + { + parse("typedef foo<(U::id > 0)> foobar;"); + assertTrue( quickParseCallback.getCompilationUnit().getDeclarations().hasNext() ); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index 1d417e64653..2e26739f780 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,3 +1,6 @@ +2003-07-28 Victor Mozgin + Fixed PR 39537 : Parser fails if template parameters contain '>' or '<' characters. + 2003-07-25 Victor Mozgin Fixed PR 39553 : Macros are not expanded in #include statements. 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 193cb590de4..bac71c4805a 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 @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Stack; import org.eclipse.cdt.core.parser.Backtrack; import org.eclipse.cdt.core.parser.EndOfFile; @@ -1496,17 +1497,38 @@ public class Parser implements IParser { last = consume(IToken.tLT); // until we get all the names sorted out - int depth = 1; - while (depth > 0) + Stack scopes = new Stack(); + scopes.push(new Integer(IToken.tLT)); + + while (!scopes.empty()) { + int top; last = consume(); - switch (last.getType()) - { + + switch (last.getType()) { case IToken.tGT : - --depth; + if (((Integer)scopes.peek()).intValue() == IToken.tLT) { + scopes.pop(); + } break; + case IToken.tRBRACKET : + do { + top = ((Integer)scopes.pop()).intValue(); + } while (!scopes.empty() && (top == IToken.tGT || top == IToken.tLT)); + if (top != IToken.tLBRACKET) throw backtrack; + + break; + case IToken.tRPAREN : + do { + top = ((Integer)scopes.pop()).intValue(); + } while (!scopes.empty() && (top == IToken.tGT || top == IToken.tLT)); + if (top != IToken.tLPAREN) throw backtrack; + + break; case IToken.tLT : - ++depth; + case IToken.tLBRACKET: + case IToken.tLPAREN: + scopes.push(new Integer(last.getType())); break; } }