Loading libacc/acc.cpp +15 −6 Original line number Diff line number Diff line Loading @@ -3868,7 +3868,7 @@ class Compiler : public ErrorSink { pGen->forceR0RVal(); pGen->convertR0(pCast); } else { expr(); commaExpr(); skip(')'); } } else if (t == '*') { Loading Loading @@ -4076,12 +4076,21 @@ class Compiler : public ErrorSink { } } void commaExpr() { for(;;) { expr(); if (!accept(',')) { break; } } } void expr() { binaryOp(11); } int test_expr() { expr(); commaExpr(); pGen->forceR0RVal(); return pGen->gtst(0, 0); } Loading Loading @@ -4117,7 +4126,7 @@ class Compiler : public ErrorSink { a = test_expr(); } else { if (tok != ';') expr(); commaExpr(); skip(';'); n = codeBuf.getPC(); a = 0; Loading @@ -4126,7 +4135,7 @@ class Compiler : public ErrorSink { skip(';'); if (tok != ')') { t = pGen->gjmp(0); expr(); commaExpr(); pGen->gjmp(n - codeBuf.getPC() - pGen->jumpOffset()); pGen->gsym(t); n = t + 4; Loading @@ -4150,7 +4159,7 @@ class Compiler : public ErrorSink { } else { if (accept(TOK_RETURN)) { if (tok != ';') { expr(); commaExpr(); pGen->forceR0RVal(); if (pReturnType->tag == TY_VOID) { error("Must not return a value from a void function"); Loading @@ -4166,7 +4175,7 @@ class Compiler : public ErrorSink { } else if (accept(TOK_BREAK)) { *(int *) l = pGen->gjmp(*(int *) l); } else if (tok != ';') expr(); commaExpr(); skip(';'); } } Loading libacc/tests/data/comma.c 0 → 100644 +35 −0 Original line number Diff line number Diff line int testReturn() { return 10, 20, 30; } int testArg(int a) { return a; } void testComma() { int a; 0, a = 10,20; printf("statement: %d\n", a); a = 1; if (a = 0, 1) { printf("if: a = %d\n", a); } int b = 0; a = 10; while(b++,a--) {} printf("while: b = %d\n", b); b = 0; for(b++,a = 0;b++, a < 10; b++, a++) {} printf("for: b = %d\n", b); b = testReturn(); printf("return: %d\n", b); b = testArg((a,12)); printf("arg: %d\n", b); } int main() { testComma(); return 0; } libacc/tests/test.py +10 −0 Original line number Diff line number Diff line Loading @@ -352,6 +352,16 @@ result: 0""", """2 *= 5 10 17&= 1 1 17^= 1 16 16|= 1 17 """) def testcomma(self): self.compileCheck(["-R", "data/comma.c"], """Executing compiled code: result: 0""", """statement: 10 if: a = 0 while: b = 11 for: b = 22 return: 30 arg: 12 """) if __name__ == '__main__': Loading Loading
libacc/acc.cpp +15 −6 Original line number Diff line number Diff line Loading @@ -3868,7 +3868,7 @@ class Compiler : public ErrorSink { pGen->forceR0RVal(); pGen->convertR0(pCast); } else { expr(); commaExpr(); skip(')'); } } else if (t == '*') { Loading Loading @@ -4076,12 +4076,21 @@ class Compiler : public ErrorSink { } } void commaExpr() { for(;;) { expr(); if (!accept(',')) { break; } } } void expr() { binaryOp(11); } int test_expr() { expr(); commaExpr(); pGen->forceR0RVal(); return pGen->gtst(0, 0); } Loading Loading @@ -4117,7 +4126,7 @@ class Compiler : public ErrorSink { a = test_expr(); } else { if (tok != ';') expr(); commaExpr(); skip(';'); n = codeBuf.getPC(); a = 0; Loading @@ -4126,7 +4135,7 @@ class Compiler : public ErrorSink { skip(';'); if (tok != ')') { t = pGen->gjmp(0); expr(); commaExpr(); pGen->gjmp(n - codeBuf.getPC() - pGen->jumpOffset()); pGen->gsym(t); n = t + 4; Loading @@ -4150,7 +4159,7 @@ class Compiler : public ErrorSink { } else { if (accept(TOK_RETURN)) { if (tok != ';') { expr(); commaExpr(); pGen->forceR0RVal(); if (pReturnType->tag == TY_VOID) { error("Must not return a value from a void function"); Loading @@ -4166,7 +4175,7 @@ class Compiler : public ErrorSink { } else if (accept(TOK_BREAK)) { *(int *) l = pGen->gjmp(*(int *) l); } else if (tok != ';') expr(); commaExpr(); skip(';'); } } Loading
libacc/tests/data/comma.c 0 → 100644 +35 −0 Original line number Diff line number Diff line int testReturn() { return 10, 20, 30; } int testArg(int a) { return a; } void testComma() { int a; 0, a = 10,20; printf("statement: %d\n", a); a = 1; if (a = 0, 1) { printf("if: a = %d\n", a); } int b = 0; a = 10; while(b++,a--) {} printf("while: b = %d\n", b); b = 0; for(b++,a = 0;b++, a < 10; b++, a++) {} printf("for: b = %d\n", b); b = testReturn(); printf("return: %d\n", b); b = testArg((a,12)); printf("arg: %d\n", b); } int main() { testComma(); return 0; }
libacc/tests/test.py +10 −0 Original line number Diff line number Diff line Loading @@ -352,6 +352,16 @@ result: 0""", """2 *= 5 10 17&= 1 1 17^= 1 16 16|= 1 17 """) def testcomma(self): self.compileCheck(["-R", "data/comma.c"], """Executing compiled code: result: 0""", """statement: 10 if: a = 0 while: b = 11 for: b = 22 return: 30 arg: 12 """) if __name__ == '__main__': Loading