aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-07-21 07:12:03 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:04:24 +0900
commit82c99e92032b8101443671604de7137ba7257cd0 (patch)
treecaecbc6bb7d14dca184e07c0e9598f4131521b69
parent4113cec4ecaef37eaa5638592bdc80ad7783d530 (diff)
downloadducc-82c99e92032b8101443671604de7137ba7257cd0.tar.gz
ducc-82c99e92032b8101443671604de7137ba7257cd0.tar.zst
ducc-82c99e92032b8101443671604de7137ba7257cd0.zip
fix: fix dereference of struct members
-rw-r--r--main.c1
-rw-r--r--tests/054.sh23
2 files changed, 24 insertions, 0 deletions
diff --git a/main.c b/main.c
index ef19587..6b0ca3d 100644
--- a/main.c
+++ b/main.c
@@ -942,6 +942,7 @@ AstNode* ast_new_member_access_expr(AstNode* obj, const String* name) {
AstNode* e = ast_new(AstNodeKind_deref_expr);
e->node_operand = ast_new_binary_expr(TokenKind_plus, obj, ast_new_int(type_offsetof(obj->ty->to, name)));
e->ty = type_member_typeof(obj->ty->to, name);
+ e->node_operand->ty = type_new_ptr(e->ty);
return e;
}
diff --git a/tests/054.sh b/tests/054.sh
new file mode 100644
index 0000000..06252b9
--- /dev/null
+++ b/tests/054.sh
@@ -0,0 +1,23 @@
+set -e
+
+cat <<'EOF' > expected
+0
+1
+EOF
+bash ../../test_diff.sh <<'EOF'
+int printf();
+void* calloc();
+
+struct S {
+ int a;
+ int b;
+};
+
+int main() {
+ struct S* s = calloc(1, sizeof(struct S));
+ s->b = 1;
+ printf("%ld\n", s->a);
+ printf("%ld\n", s->b);
+ return 0;
+}
+EOF