aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-07 15:33:59 +0900
committernsfisis <nsfisis@gmail.com>2026-02-07 17:37:23 +0900
commitf684a1f964d2761a4721497973023fa82923f121 (patch)
treea52514e06aaf20b4f72c5b00dd241d48e535d582
parentcdddf2422553f1f21c8d2c57cd382b8362dc80fb (diff)
downloadducc-f684a1f964d2761a4721497973023fa82923f121.tar.gz
ducc-f684a1f964d2761a4721497973023fa82923f121.tar.zst
ducc-f684a1f964d2761a4721497973023fa82923f121.zip
feat: support null pointer in initializer
-rw-r--r--src/parse.c4
-rw-r--r--tests/variables.c3
2 files changed, 7 insertions, 0 deletions
diff --git a/src/parse.c b/src/parse.c
index 9083ecc..b1a1d9b 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -2830,6 +2830,10 @@ static void do_eval_init_expr(InitData* buf, AstNode* expr, Type* ty) {
initdata_append_addr(buf, expr->as.ref_expr->operand->as.gvar->name);
} else if (expr->kind == AstNodeKind_gvar) {
initdata_append_addr(buf, expr->as.gvar->name);
+ } else if (expr->kind == AstNodeKind_func) {
+ initdata_append_addr(buf, expr->as.func->name);
+ } else if (expr->kind == AstNodeKind_int_expr && expr->as.int_expr->value == 0) {
+ initdata_append_zeros(buf, type_sizeof(ty));
} else {
unimplemented();
}
diff --git a/tests/variables.c b/tests/variables.c
index 2ba28d1..e6a0b3a 100644
--- a/tests/variables.c
+++ b/tests/variables.c
@@ -1,4 +1,5 @@
#include <helpers.h>
+#include <stddef.h>
int printf(const char*, ...);
@@ -33,6 +34,7 @@ struct S2 {
struct S2 arr5[] = {
{"foo"},
{"bar"},
+ {NULL},
};
int main() {
@@ -74,6 +76,7 @@ int main() {
ASSERT_EQ_STR("foo", arr5[0].x);
ASSERT_EQ_STR("bar", arr5[1].x);
+ ASSERT_EQ(NULL, arr5[2].x);
// local variables
int foo;