From ceccd3ead3884afba95fd21ba1967d01acd2f2df Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Fri, 11 Mar 2016 22:35:44 +0100 Subject: [PATCH] tccgen.c: Fix flex array members some more Last fix didn't work for function f1int in the added testcase. --- tccgen.c | 8 ++++++-- tests/tests2/80_flexarray.c | 25 +++++++++++++++++++++++++ tests/tests2/80_flexarray.expect | 0 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/tests2/80_flexarray.c create mode 100644 tests/tests2/80_flexarray.expect diff --git a/tccgen.c b/tccgen.c index 270d11c..11bf009 100644 --- a/tccgen.c +++ b/tccgen.c @@ -5846,8 +5846,12 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, if (size < 0) tcc_error("unknown type size"); } - if (flexible_array) - size += flexible_array->type.ref->c * pointed_size(&flexible_array->type) + 1; + /* If there's a flex member and it was used in the initializer + adjust size. */ + if (flexible_array && + flexible_array->type.ref->c > 0) + size += flexible_array->type.ref->c + * pointed_size(&flexible_array->type); /* take into account specified alignment if bigger */ if (ad->a.aligned) { if (ad->a.aligned > align) diff --git a/tests/tests2/80_flexarray.c b/tests/tests2/80_flexarray.c new file mode 100644 index 0000000..1fc1a60 --- /dev/null +++ b/tests/tests2/80_flexarray.c @@ -0,0 +1,25 @@ +#include +struct wchar { + char *data; char mem[]; +}; +struct wint { + char *data; int mem[]; +}; +int f1char (void) { + char s[9]="nonono"; + struct wchar q = {"bugs"}; + return !s[0]; +} +int f1int (void) { + char s[9]="nonono"; + struct wint q = {"bugs"}; + return !s[0]; +} +int main (void) { + char s[9]="nonono"; + static struct wchar q = {"bugs", {'c'}}; + //printf ("tcc has %s %s\n", s, q.data); + if (f1char() || f1int()) + printf ("bla\n"); + return !s[0]; +} diff --git a/tests/tests2/80_flexarray.expect b/tests/tests2/80_flexarray.expect new file mode 100644 index 0000000..e69de29