aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2017-04-29 22:09:10 +0200
committerMichael Matz <matz@suse.de>2017-04-29 22:09:10 +0200
commitf775d687253df56d136f70e82c7367b6ba62e9fb (patch)
tree38c554b65444666e2830e5cb71afa8f8fb1beef1
parent28084420fed1f833da04a6f69380c276c9431cff (diff)
downloadtinycc-f775d687253df56d136f70e82c7367b6ba62e9fb.tar.gz
tinycc-f775d687253df56d136f70e82c7367b6ba62e9fb.tar.bz2
Remove a bit-field TODO
Checked the lcc testsuite for bitfield stuff (in cq.c and fields.c), fixed one more error in initializing unnamed members (which have to be skipped), removed the TODO.
-rw-r--r--TODO1
-rw-r--r--tccgen.c2
-rw-r--r--tests/tcctest.c7
3 files changed, 9 insertions, 1 deletions
diff --git a/TODO b/TODO
index 3adeef2..d810088 100644
--- a/TODO
+++ b/TODO
@@ -13,7 +13,6 @@ Bugs:
- transform functions to function pointers in function parameters
(net/ipv4/ip_output.c)
- fix function pointer type display
-- check lcc test suite -> fix bitfield binary operations
- check section alignment in C
- fix invalid cast in comparison 'if (v == (int8_t)v)'
- finish varargs.h support (gcc 3.2 testsuite issue)
diff --git a/tccgen.c b/tccgen.c
index d558ff8..4252c57 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -6075,6 +6075,8 @@ static void decl_designator(CType *type, Section *sec, unsigned long c,
c += index * type_size(type, &align);
} else {
f = *cur_field;
+ while (f && (f->v & SYM_FIRST_ANOM))
+ *cur_field = f = f->next;
if (!f)
tcc_error("too many field init");
/* XXX: fix this mess by using explicit storage field */
diff --git a/tests/tcctest.c b/tests/tcctest.c
index c267fee..dc6a060 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2075,6 +2075,13 @@ void bitfield_test(void)
} st4;
st4.y = 1;
printf("st4.y == %d\n", st4.y);
+ struct sbf5 {
+ int a;
+ char b;
+ int x : 12, y : 4, : 0, : 4, z : 3;
+ char c;
+ } st5 = { 1, 2, 3, 4, -3, 6 };
+ printf("st5 = %d %d %d %d %d %d\n", st5.a, st5.b, st5.x, st5.y, st5.z, st5.c);
}
#ifdef __x86_64__