From 931c41aa94070604944155357badc004b56a4b8d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 4 Sep 2025 12:27:59 +0900 Subject: [PATCH] mruby-compiler: clean up void_expr_error for variable-sized nodes only Remove obsolete cons-list node cases since control flow nodes (break, return, next, redo, retry) and logical operators (and, or) are now always created as variable-sized nodes. Move and/or handling to inner switch with proper struct field access. Co-authored-by: Claude --- mrbgems/mruby-compiler/core/parse.y | 32 ++++++++++++++++++----------- mrbgems/mruby-compiler/core/y.tab.c | 32 ++++++++++++++++++----------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 8f8078c19..4dee06fd4 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -5274,18 +5274,26 @@ void_expr_error(parser_state *p, node *n) if (n == NULL) return; c = node_to_int(n->car); switch (c) { - case NODE_BREAK: - case NODE_RETURN: - case NODE_NEXT: - case NODE_REDO: - case NODE_RETRY: - yyerror(NULL, p, "void value expression"); - break; - case NODE_AND: - case NODE_OR: - if (n->cdr) { - void_expr_error(p, n->cdr->car); - void_expr_error(p, n->cdr->cdr); + case NODE_VARIABLE: + /* Handle variable-sized nodes */ + switch (VAR_NODE_TYPE(n->cdr)) { + case NODE_BREAK: + case NODE_RETURN: + case NODE_NEXT: + case NODE_REDO: + case NODE_RETRY: + yyerror(NULL, p, "void value expression"); + break; + case NODE_AND: + case NODE_OR: + { + struct mrb_ast_and_node *and_n = (struct mrb_ast_and_node*)n->cdr; + void_expr_error(p, (node*)and_n->left); + void_expr_error(p, (node*)and_n->right); + } + break; + default: + break; } break; case NODE_STMTS: diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 4e2bbf756..ea63558d7 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -12099,18 +12099,26 @@ void_expr_error(parser_state *p, node *n) if (n == NULL) return; c = node_to_int(n->car); switch (c) { - case NODE_BREAK: - case NODE_RETURN: - case NODE_NEXT: - case NODE_REDO: - case NODE_RETRY: - yyerror(NULL, p, "void value expression"); - break; - case NODE_AND: - case NODE_OR: - if (n->cdr) { - void_expr_error(p, n->cdr->car); - void_expr_error(p, n->cdr->cdr); + case NODE_VARIABLE: + /* Handle variable-sized nodes */ + switch (VAR_NODE_TYPE(n->cdr)) { + case NODE_BREAK: + case NODE_RETURN: + case NODE_NEXT: + case NODE_REDO: + case NODE_RETRY: + yyerror(NULL, p, "void value expression"); + break; + case NODE_AND: + case NODE_OR: + { + struct mrb_ast_and_node *and_n = (struct mrb_ast_and_node*)n->cdr; + void_expr_error(p, (node*)and_n->left); + void_expr_error(p, (node*)and_n->right); + } + break; + default: + break; } break; case NODE_STMTS: