diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-07-29 20:59:30 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 10:04:41 +0900 |
| commit | 1b92ad61f4fb47dc54c19e785e4660ea920ea0c3 (patch) | |
| tree | b1321f985d94d5cb7d30a77d63e725df6c9612f9 | |
| parent | 3df0d758471d7654d4b85ef15a1675b4d62e7c41 (diff) | |
| download | ducc-1b92ad61f4fb47dc54c19e785e4660ea920ea0c3.tar.gz ducc-1b92ad61f4fb47dc54c19e785e4660ea920ea0c3.tar.zst ducc-1b92ad61f4fb47dc54c19e785e4660ea920ea0c3.zip | |
fix: type string literals
| -rw-r--r-- | ast.c | 4 | ||||
| -rw-r--r-- | parse.c | 1 | ||||
| -rw-r--r-- | tests/069.sh | 18 |
3 files changed, 23 insertions, 0 deletions
@@ -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); } @@ -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 |
