tccgen.c: Fix flex array members some more

Last fix didn't work for function f1int in the added testcase.
master
Michael Matz 2016-03-11 22:35:44 +01:00
parent 7e0ad4fdd2
commit ceccd3ead3
3 changed files with 31 additions and 2 deletions

View File

@ -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)

View File

@ -0,0 +1,25 @@
#include <stdio.h>
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];
}

View File