diff --git a/parse.c b/parse.c index 823715b15d9064060b036000d44fc840dcea85e6..f21e8ae56a6fde77c64db77555b5b8bd16f00b12 100644 --- a/parse.c +++ b/parse.c @@ -675,6 +675,23 @@ void skip_excess_elements() { Initializer *gvar_initializer(Initializer *cur, Type *ty) { Token *tok = token; + if (ty->kind == TY_ARRAY && ty->base->kind == TY_CHAR && + token->kind == TK_STR) { + token = token->next; + + if (ty->is_incomplete) { + ty->array_size = tok->cont_len; + ty->is_incomplete = false; + } + + int len = (ty->array_size < tok->cont_len) + ? ty->array_size : tok->cont_len; + + for (int i = 0; i < len; i++) + cur = new_init_val(cur, 1, tok->contents[i]); + return new_init_zero(cur, ty->array_size - len); + } + if (ty->kind == TY_ARRAY) { bool open = consume("{"); int i = 0; diff --git a/tests b/tests index 70480a3d96c110b90649a214d10392bf6597c181..ccc0995cbc33818e849fe9c55515897d8163d028 100644 --- a/tests +++ b/tests @@ -23,6 +23,9 @@ struct {int a[2];} g13[2] = {{1, 2}, 3, 4}; struct {int a[2];} g14[2] = {1, 2, 3, 4}; char *g15 = {"foo"}; char g16[][4] = {'f', 'o', 'o', 0, 'b', 'a', 'r', 0}; +char g17[] = "foobar"; +char g18[10] = "foobar"; +char g19[3] = "foobar"; int assert(long expected, long actual, char *code) { if (expected == actual) { @@ -564,6 +567,14 @@ int main() { assert(0, strcmp(g16[0], "foo"), "strcmp(g16[0], \"foo\")"); assert(0, strcmp(g16[1], "bar"), "strcmp(g16[1], \"bar\")"); + assert(7, sizeof(g17), "sizeof(g17)"); + assert(10, sizeof(g18), "sizeof(g18)"); + assert(3, sizeof(g19), "sizeof(g19)"); + + assert(0, memcmp(g17, "foobar", 7), "memcmp(g17, \"foobar\", 7)"); + assert(0, memcmp(g18, "foobar\0\0\0", 10), "memcmp(g18, \"foobar\\0\\0\\0\", 10)"); + assert(0, memcmp(g19, "foo", 3), "memcmp(g19, \"foo\", 3)"); + printf("OK\n"); return 0; }