aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2016-03-11 22:35:44 +0100
committerMichael Matz <matz@suse.de>2016-03-11 22:35:44 +0100
commitceccd3ead3884afba95fd21ba1967d01acd2f2df (patch)
tree654a668d1f8925398ec7e277b05a9b8c9955ea88
parent7e0ad4fdd2d5359799f16732df07e00c8719c1e6 (diff)
downloadtinycc-ceccd3ead3884afba95fd21ba1967d01acd2f2df.tar.gz
tinycc-ceccd3ead3884afba95fd21ba1967d01acd2f2df.tar.bz2
tccgen.c: Fix flex array members some more
Last fix didn't work for function f1int in the added testcase.
-rw-r--r--tccgen.c8
-rw-r--r--tests/tests2/80_flexarray.c25
-rw-r--r--tests/tests2/80_flexarray.expect0
3 files changed, 31 insertions, 2 deletions
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 <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];
+}
diff --git a/tests/tests2/80_flexarray.expect b/tests/tests2/80_flexarray.expect
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/tests2/80_flexarray.expect