diff options
| -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 |
