diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-09-02 00:17:51 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-09-02 00:17:51 +0900 |
| commit | 16aa2c081db71181ba33aa205d2b0699efa29a99 (patch) | |
| tree | 56a16139f384c317bcd82c43bea6f7c79e80375b | |
| parent | 09a245679c8d01eaec71b22985a9895667280cad (diff) | |
| download | ducc-16aa2c081db71181ba33aa205d2b0699efa29a99.tar.gz ducc-16aa2c081db71181ba33aa205d2b0699efa29a99.tar.zst ducc-16aa2c081db71181ba33aa205d2b0699efa29a99.zip | |
feat: support constant expression in array size
| -rw-r--r-- | src/parse.c | 9 | ||||
| -rw-r--r-- | tests/118.sh | 19 |
2 files changed, 23 insertions, 5 deletions
diff --git a/src/parse.c b/src/parse.c index 57dd316..ecd8e65 100644 --- a/src/parse.c +++ b/src/parse.c @@ -870,6 +870,8 @@ static Type* parse_pointer_opt(Parser* p, Type* ty) { return ty; } +static int eval(AstNode* e); + // array-declarator: // direct-declarator '[' TODO type-qualifier-list? TODO assignment-expression? ']' // TODO direct-declarator '[' 'static' type-qualifier-list? assignment-expression? ']' @@ -878,11 +880,8 @@ static Type* parse_pointer_opt(Parser* p, Type* ty) { static Type* parse_array_declarator_suffix(Parser* p, Type* ty) { next_token(p); // skip '[' - AstNode* size_expr = parse_expr(p); - if (size_expr->kind != AstNodeKind_int_expr) { - fatal_error("parse_var_decl: invalid array size"); - } - int size = size_expr->node_int_value; + AstNode* size_expr = parse_assignment_expr(p); + int size = eval(size_expr); expect(p, TokenKind_bracket_r); return type_new_array(ty, size); diff --git a/tests/118.sh b/tests/118.sh new file mode 100644 index 0000000..48a8569 --- /dev/null +++ b/tests/118.sh @@ -0,0 +1,19 @@ +cat <<'EOF' > expected +400 +80 +16 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + int a[10 * 10]; + int b[10 + 10]; + int c[1 << 2]; + + printf("%zu\n", sizeof(a)); + printf("%zu\n", sizeof(b)); + printf("%zu\n", sizeof(c)); +} +EOF |
