diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-02 02:03:20 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 10:06:21 +0900 |
| commit | be7b759113e76223025cd025cf0172849385b444 (patch) | |
| tree | f1f00183656f6865011a6148629025ec509960e9 | |
| parent | 0d8eeaad5427840c1977654749c0f2e79644222e (diff) | |
| download | ducc-be7b759113e76223025cd025cf0172849385b444.tar.gz ducc-be7b759113e76223025cd025cf0172849385b444.tar.zst ducc-be7b759113e76223025cd025cf0172849385b444.zip | |
feat: support sizeof() for variables
| -rw-r--r-- | parse.c | 13 | ||||
| -rw-r--r-- | tests/076.sh | 35 |
2 files changed, 47 insertions, 1 deletions
@@ -403,7 +403,18 @@ AstNode* parse_prefix_expr(Parser* p) { } else if (op == TokenKind_keyword_sizeof) { next_token(p); expect(p, TokenKind_paren_l); - Type* ty = parse_type(p); + Token* next_tok = peek_token(p); + Type* ty = NULL; + if (next_tok->kind == TokenKind_ident) { + int lvar_idx = find_lvar(p, &next_tok->raw); + if (lvar_idx != -1) { + next_token(p); + ty = p->lvars[lvar_idx].ty; + } + } + if (!ty) { + ty = parse_type(p); + } expect(p, TokenKind_paren_r); return ast_new_int(type_sizeof(ty)); } diff --git a/tests/076.sh b/tests/076.sh new file mode 100644 index 0000000..065094e --- /dev/null +++ b/tests/076.sh @@ -0,0 +1,35 @@ +set -e + +cat <<'EOF' > expected +sizeof(a) = 4 +sizeof(b) = 8 +sizeof(c) = 123 +sizeof(d) = 16 +sizeof(e) = 8 +sizeof(f) = 1968 +EOF +bash ../../test_diff.sh <<'EOF' +int printf(); + +struct S { + long x; + long y; +}; + +int main() { + int a; + long b; + char c[123]; + struct S d; + void* e; + struct S f[123]; + + printf("sizeof(a) = %d\n", sizeof(a)); + printf("sizeof(b) = %d\n", sizeof(b)); + printf("sizeof(c) = %d\n", sizeof(c)); + printf("sizeof(d) = %d\n", sizeof(d)); + printf("sizeof(e) = %d\n", sizeof(e)); + printf("sizeof(f) = %d\n", sizeof(f)); + return 0; +} +EOF |
