From 9c6a0b4340fe430e941586134f585c27309a0084 Mon Sep 17 00:00:00 2001 From: lemon Date: Sun, 4 Jun 2023 09:51:46 +0200 Subject: do while --- parse.c | 20 ++++++++++++++++++++ test.c | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/parse.c b/parse.c index 5d40258..77d263a 100644 --- a/parse.c +++ b/parse.c @@ -1625,6 +1625,26 @@ stmt(struct parser *pr, struct function *fn) useblk(fn, end); } break; + case TKWdo: + lex(pr, NULL); + begin = end = NULL; + EMITS { + putbranch(fn, begin = newblk(fn)); + useblk(fn, begin); + } + terminates = stmt(pr, fn); + expect(pr, TKWwhile, NULL); + expect(pr, '(', NULL); + ex = commaexpr(pr); + expect(pr, ')', NULL); + if (!isscalar(ex.ty)) + error(&ex.span, "'while' condition is not a scalar (%ty)", ex.ty); + EMITS { + end = newblk(fn); + if (!terminates) condjump(fn, &ex, begin, end); + useblk(fn, end); + } + break; case TKWreturn: lex(pr, NULL); if (fn->retty.t != TYVOID) { diff --git a/test.c b/test.c index 9638de2..e061b2b 100644 --- a/test.c +++ b/test.c @@ -56,5 +56,12 @@ struct f2 f2test(struct f2 *r) { return *r; } +void memset(char *p, int c, unsigned long n) +{ + if (n) do { + *p++ = c; + } while (--n); +} + // -- cgit v1.2.3