From 308e1f441788b12885452c8de7e54e1762c08fd9 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 27 Apr 2005 19:11:32 +0000 Subject: [PATCH] Fixed Bug 92980 - [Parser] infinite loop caused by invalid source code --- .../org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java | 5 +++++ .../cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java | 3 +++ 2 files changed, 8 insertions(+) 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 580f307309d..552eea66dc8 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 @@ -3792,5 +3792,10 @@ public class AST2CPPTests extends AST2BaseTest { assertEquals( declarators.length, 1 ); assertTrue( declarators[0] instanceof IASTArrayDeclarator ); } + + public void testBug92980() throws Exception { + String code = "struct A { A(); A(const A&) throw(1); ~A() throw(X); };"; //$NON-NLS-1$ + parse( code, ParserLanguage.CPP, true, 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 a0d10b62be4..aeabd8294e8 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 @@ -3943,6 +3943,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { consume(); break; default: + IToken before = LA(1); try { exceptionSpecIds.add(typeId(false, false)); } catch (BacktrackException e) { @@ -3955,6 +3956,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { p .setPropertyInParent(IASTProblemHolder.PROBLEM); exceptionSpecIds.add(typeIdProblem); + if( before == LA(1) ) + done = true; } break; }