aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--parse.c13
-rw-r--r--tests/076.sh35
2 files changed, 47 insertions, 1 deletions
diff --git a/parse.c b/parse.c
index b1e65d4..b8ad901 100644
--- a/parse.c
+++ b/parse.c
@@ -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