Added support for commas in for loop update statement

This commit is contained in:
Russell Joyce 2020-06-18 17:05:10 +01:00
parent d04337125e
commit 3979f563aa
No known key found for this signature in database
GPG key ID: 3D46BD9018AF7B72
2 changed files with 20 additions and 0 deletions

12
c-tests/loop-comma.c Normal file
View file

@ -0,0 +1,12 @@
int main(void)
{
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < 2; i++, j++) {
k += 2;
}
return k - (j * 2);
}

View file

@ -509,6 +509,10 @@ void ParseFor(struct ParseState *Parser)
ParserCopyPos(&PreIncrement, Parser); ParserCopyPos(&PreIncrement, Parser);
ParseStatementMaybeRun(Parser, false, false); ParseStatementMaybeRun(Parser, false, false);
while (LexGetToken(Parser, NULL, false) == TokenComma) {
LexGetToken(Parser, NULL, true);
ParseStatementMaybeRun(Parser, false, false);
}
if (LexGetToken(Parser, NULL, true) != TokenCloseBracket) if (LexGetToken(Parser, NULL, true) != TokenCloseBracket)
ProgramFail(Parser, "')' expected"); ProgramFail(Parser, "')' expected");
@ -525,6 +529,10 @@ void ParseFor(struct ParseState *Parser)
while (Condition && Parser->Mode == RunModeRun) { while (Condition && Parser->Mode == RunModeRun) {
ParserCopyPos(Parser, &PreIncrement); ParserCopyPos(Parser, &PreIncrement);
ParseStatement(Parser, false); ParseStatement(Parser, false);
while (LexGetToken(Parser, NULL, false) == TokenComma) {
LexGetToken(Parser, NULL, true);
ParseStatement(Parser, false);
}
ParserCopyPos(Parser, &PreConditional); ParserCopyPos(Parser, &PreConditional);
if (LexGetToken(Parser, NULL, false) == TokenSemicolon) if (LexGetToken(Parser, NULL, false) == TokenSemicolon)