diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-01-06 09:26:13 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-01-06 09:26:13 +0900 |
| commit | b400b6bbdc526f5de357cb2657d79ea0343870bc (patch) | |
| tree | dc5faeb2f26221b16d7b0b65058ac9d8ce344d1d | |
| parent | 4fd882beeee2ccbcc5b097cde9ba0e32b1b99a3e (diff) | |
| download | ducc-b400b6bbdc526f5de357cb2657d79ea0343870bc.tar.gz ducc-b400b6bbdc526f5de357cb2657d79ea0343870bc.tar.zst ducc-b400b6bbdc526f5de357cb2657d79ea0343870bc.zip | |
fix: for loop with multiple variable declarations
In this C code,
for (T v = expr1, u = expr2; ...; ...) { ... }
the "expr2" was silently discarded before.
| -rw-r--r-- | src/parse.c | 10 | ||||
| -rw-r--r-- | src/tokenize.c | 3 | ||||
| -rw-r--r-- | tests/for_loops.sh | 17 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/parse.c b/src/parse.c index 819c418..f336c0c 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1166,7 +1166,15 @@ static AstNode* parse_for_stmt(Parser* p) { enter_scope(p); if (peek_token(p)->kind != TokenKind_semicolon) { if (is_type_token(p, peek_token(p))) { - init = parse_var_decl(p)->node_items[0].node_expr; + AstNode* decls = parse_var_decl(p); + AstNode* initializers = ast_new_list(1); + for (size_t i = 0; i < decls->node_len; i++) { + AstNode* initializer = decls->node_items[i].node_expr; + if (initializer) { + ast_append(initializers, initializer); + } + } + init = initializers; } else { init = parse_expr(p); expect(p, TokenKind_semicolon); diff --git a/src/tokenize.c b/src/tokenize.c index 864da85..1e7a8df 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -438,8 +438,7 @@ TokenArray* convert_pp_tokens_to_tokens(TokenArray* pp_tokens) { size_t len = strlen(pp_tok->value.string); char* buf = calloc(len + 1, sizeof(char)); - size_t j = 0; - for (size_t i = 0; i < len; i++, j++) { + for (size_t i = 0, j = 0; i < len; i++, j++) { if (pp_tok->value.string[i] == '\\' && pp_tok->value.string[i + 1] == 'e') { // \e is not a part of Standard C, but commonly supported. buf[j] = 033; diff --git a/tests/for_loops.sh b/tests/for_loops.sh index 2e3205f..ef54d06 100644 --- a/tests/for_loops.sh +++ b/tests/for_loops.sh @@ -139,3 +139,20 @@ int main() { } EOF +cat <<'EOF' > expected +0 1 +1 3 +2 5 +3 7 +4 9 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + for (int i = 0, j = 1; i < 5; i++, j += 2) { + printf("%d %d\n", i, j); + } +} +EOF |
