Last fix didn't work for function f1int in the added testcase.
Unified · Split
| @@ -5846,8 +5846,12 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, · 5845 unmodified lines | ||
| 5846 | 5846 | if (size < 0) |
| 5847 | 5847 | tcc_error("unknown type size"); |
| 5848 | 5848 | } |
| 5849 | − if (flexible_array) | |
| 5850 | − size += flexible_array->type.ref->c * pointed_size(&flexible_array->type) + 1; | |
| 5849 | + /* If there's a flex member and it was used in the initializer | |
| 5850 | + adjust size. */ | |
| 5851 | + if (flexible_array && | |
| 5852 | + flexible_array->type.ref->c > 0) | |
| 5853 | + size += flexible_array->type.ref->c | |
| 5854 | + * pointed_size(&flexible_array->type); | |
| 5851 | 5855 | /* take into account specified alignment if bigger */ |
| 5852 | 5856 | if (ad->a.aligned) { |
| 5853 | 5857 | if (ad->a.aligned > align) |
| @@ -0,0 +1,25 @@ | ||
| 1 | +#include <stdio.h> | |
| 2 | +struct wchar { | |
| 3 | + char *data; char mem[]; | |
| 4 | +}; | |
| 5 | +struct wint { | |
| 6 | + char *data; int mem[]; | |
| 7 | +}; | |
| 8 | +int f1char (void) { | |
| 9 | + char s[9]="nonono"; | |
| 10 | + struct wchar q = {"bugs"}; | |
| 11 | + return !s[0]; | |
| 12 | +} | |
| 13 | +int f1int (void) { | |
| 14 | + char s[9]="nonono"; | |
| 15 | + struct wint q = {"bugs"}; | |
| 16 | + return !s[0]; | |
| 17 | +} | |
| 18 | +int main (void) { | |
| 19 | + char s[9]="nonono"; | |
| 20 | + static struct wchar q = {"bugs", {'c'}}; | |
| 21 | + //printf ("tcc has %s %s\n", s, q.data); | |
| 22 | + if (f1char() || f1int()) | |
| 23 | + printf ("bla\n"); | |
| 24 | + return !s[0]; | |
| 25 | +} | |
Empty file added.