From 307d084357f4f444562be9111b5b87b6c80141a8 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 25 Jun 2008 12:33:40 +0000 Subject: [PATCH] Switch without compound statement, bug 105334. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 20 ++++++++++++++++++ .../parser/AbstractGNUSourceCodeParser.java | 21 +++++++++++++++++++ .../core/dom/parser/c/GNUCSourceParser.java | 6 ++---- .../dom/parser/cpp/GNUCPPSourceParser.java | 6 ++---- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index c1322455348..a393c3250f9 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -56,6 +56,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; @@ -5019,4 +5020,23 @@ public class AST2Tests extends AST2BaseTest { assertEquals(";", empty.getRawSignature()); } } + + // void test() { + // int foux = 3; + // switch(foux) // no brace! + // case 0: + // case 1: + // foux= 0; + // foux= 1; + // } + public void testSwitchWithoutCompound_Bug105334() throws Exception { + final String comment= getAboveComment(); + for (ParserLanguage lang : ParserLanguage.values()) { + IASTTranslationUnit tu= parse(comment, lang); + IASTFunctionDefinition fdef= getDeclaration(tu, 0); + IASTSwitchStatement sw= getStatement(fdef, 1); + IASTStatement stmt= getStatement(fdef, 2); + assertEquals("foux= 1;", stmt.getRawSignature()); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index e3d6be83577..cb25fdfb445 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -1650,6 +1650,27 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { return break_statement; } + protected IASTStatement parseSwitchBody() throws EndOfFileException, BacktrackException { + IASTStatement stmt= null; + if (LT(1) != IToken.tEOC) + stmt= statement(); + + if (stmt instanceof IASTCaseStatement == false) + return stmt; + + // bug 105334, switch without compound statement + IASTCompoundStatement comp= createCompoundStatement(); + ((ASTNode) comp).setOffsetAndLength((ASTNode) stmt); + comp.addStatement(stmt); + + while (LT(1) != IToken.tEOC && stmt instanceof IASTCaseStatement) { + stmt= statement(); + comp.addStatement(stmt); + } + adjustLength(comp, stmt); + return comp; + } + protected IASTStatement parseContinueStatement() throws EndOfFileException, BacktrackException { int startOffset = consume().getOffset(); // t_continue diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 90aca7d97f7..c7677251ed5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -2488,10 +2488,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { default: throwBacktrack(LA(1)); } - IASTStatement switch_body = null; - if (LT(1) != IToken.tEOC) - switch_body = statement(); - + + IASTStatement switch_body = parseSwitchBody(); IASTSwitchStatement switch_statement = createSwitchStatement(); ((ASTNode) switch_statement).setOffsetAndLength(startOffset, (switch_body != null ? calculateEndOffset(switch_body) : LA(1).getEndOffset()) - startOffset); 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 4f2ef749642..e3a27b08014 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 @@ -4799,10 +4799,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { default: throwBacktrack(LA(1)); } - IASTStatement switch_body = null; - if (LT(1) != IToken.tEOC) - switch_body = statement(); - + + IASTStatement switch_body = parseSwitchBody(); ICPPASTSwitchStatement switch_statement = createSwitchStatement(); ((ASTNode) switch_statement).setOffsetAndLength(startOffset, (switch_body != null ? calculateEndOffset(switch_body) : LA(1).getEndOffset()) - startOffset);