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 ccd2835e1cd..df35ee099f5 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 @@ -1703,19 +1703,46 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { consume(IToken.tLPAREN); IASTNode init = forInitStatement(); IASTExpression for_condition = null; - if (LT(1) != IToken.tSEMI) + switch (LT(1)) { + case IToken.tSEMI: + case IToken.tEOC: + break; + default: for_condition = condition(); - consume(IToken.tSEMI); + } + switch (LT(1)) { + case IToken.tSEMI: + consume(IToken.tSEMI); + break; + case IToken.tEOC: + break; + default: + throw backtrack; + } IASTExpression iterationExpression = null; - if (LT(1) != IToken.tRPAREN) { + switch (LT(1)) { + case IToken.tRPAREN: + case IToken.tEOC: + break; + default: iterationExpression = expression(); - - } - consume(IToken.tRPAREN); - IASTStatement for_body = statement(); + } + switch (LT(1)) { + case IToken.tRPAREN: + consume(IToken.tRPAREN); + break; + case IToken.tEOC: + break; + default: + throw backtrack; + } IASTForStatement for_statement = createForStatement(); - ((ASTNode) for_statement).setOffsetAndLength(startOffset, + IASTStatement for_body = null; + if (LT(1) != IToken.tEOC) { + for_body = statement(); + ((ASTNode) for_statement).setOffsetAndLength(startOffset, calculateEndOffset(for_body) - startOffset); + } if (init instanceof IASTDeclaration) { for_statement.setInit((IASTDeclaration) init); @@ -1738,9 +1765,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { iterationExpression.setParent(for_statement); iterationExpression.setPropertyInParent(IASTForStatement.ITERATION); } - for_statement.setBody(for_body); - for_body.setParent(for_statement); - for_body.setPropertyInParent(IASTForStatement.BODY); + if (for_body != null) { + for_statement.setBody(for_body); + for_body.setParent(for_statement); + for_body.setPropertyInParent(IASTForStatement.BODY); + } return for_statement; } 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 121b2762d7e..ac5048e09ba 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 @@ -2215,7 +2215,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { IASTExpression e = null; if( LT(1) != IToken.tSEMI ) e = expression(); - consume(IToken.tSEMI); + switch (LT(1)) { + case IToken.tSEMI: + consume(IToken.tSEMI); + break; + case IToken.tEOC: + break; + default: + throw backtrack; + } // TODO is this a problem? Should we wrap this in an expression // statement? return e; 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 56b414cabd8..c812b344b25 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 @@ -4420,7 +4420,15 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IASTExpression e = null; if (LT(1) != IToken.tSEMI) e = expression(); - consume(IToken.tSEMI); + switch (LT(1)) { + case IToken.tSEMI: + consume(IToken.tSEMI); + break; + case IToken.tEOC: + break; + default: + throw backtrack; + } return e; } catch (BacktrackException bt) { backup(mark);