aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/parse.c10
-rw-r--r--src/tokenize.c3
-rw-r--r--tests/for_loops.sh17
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