aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-07-29 20:59:30 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:04:41 +0900
commit1b92ad61f4fb47dc54c19e785e4660ea920ea0c3 (patch)
treeb1321f985d94d5cb7d30a77d63e725df6c9612f9
parent3df0d758471d7654d4b85ef15a1675b4d62e7c41 (diff)
downloadducc-1b92ad61f4fb47dc54c19e785e4660ea920ea0c3.tar.gz
ducc-1b92ad61f4fb47dc54c19e785e4660ea920ea0c3.tar.zst
ducc-1b92ad61f4fb47dc54c19e785e4660ea920ea0c3.zip
fix: type string literals
-rw-r--r--ast.c4
-rw-r--r--parse.c1
-rw-r--r--tests/069.sh18
3 files changed, 23 insertions, 0 deletions
diff --git a/ast.c b/ast.c
index 0326855..83f65d9 100644
--- a/ast.c
+++ b/ast.c
@@ -43,6 +43,10 @@ Type* type_new_array(Type* elem, int size) {
return ty;
}
+Type* type_new_static_string(int len) {
+ return type_new_array(type_new(TypeKind_char), len + 1);
+}
+
Type* type_array_to_ptr(Type* ty) {
return type_new_ptr(ty->to);
}
diff --git a/parse.c b/parse.c
index 0b682e2..f61386b 100644
--- a/parse.c
+++ b/parse.c
@@ -205,6 +205,7 @@ AstNode* parse_primary_expr(Parser* p) {
} else if (t->kind == TokenKind_literal_str) {
e = ast_new(AstNodeKind_str_expr);
e->node_idx = register_str_literal(p, string_to_cstr(&t->raw));
+ e->ty = type_new_static_string(t->raw.len);
return e;
} else if (t->kind == TokenKind_paren_l) {
e = parse_expr(p);
diff --git a/tests/069.sh b/tests/069.sh
new file mode 100644
index 0000000..2a43022
--- /dev/null
+++ b/tests/069.sh
@@ -0,0 +1,18 @@
+set -e
+
+cat <<'EOF' > expected
+h
+l
+,
+EOF
+
+bash ../../test_diff.sh <<'EOF'
+int printf();
+
+int main() {
+ char* h = " hello,world" + 1;
+ printf("%c\n", *h);
+ printf("%c\n", h[2]);
+ printf("%c\n", *(h + 5));
+}
+EOF