diff options
| -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 |
