I recently some busy. may have to over a day or two to use the computer. I will give you reply.
Best regards, jiang Thomas Preud'homme <robo...@celest.fr>编写: >Le mercredi 06 août 2014, 22:41:18 Thomas Preud'homme a écrit : > >[SNIP review part 2] > >And here is the final part (part 3) > >@@ -3605,7 +3643,7 @@ static void vpush_tokc(int t) > >ST_FUNC void unary(void) >{ >- int n, t, align, size, r, sizeof_caller; >+ int n, t, align, size, r, sizeof_caller, save_ctrl; > CType type; > Sym *s; > AttributeDef ad; >@@ -3714,7 +3752,10 @@ ST_FUNC void unary(void) > return; > } > unary(); >+ save_ctrl = gen_ctrl; >+ gen_ctrl = CTRL_FOCE; > gen_cast(&type); >+ gen_ctrl = save_ctrl; > > >I think it would be better to add a parameter "explicit" of type bool to >gen_cast(). CTRL_INIT looks weird and you only need to know if it's an >implicit cast or not. > > > } > } else if (tok == '{') { > /* save all registers */ >@@ -5127,7 +5168,7 @@ static void decl_designator(CType *type, Section *sec, >unsigned long c, >static void init_putv(CType *type, Section *sec, unsigned long c, > int v, int expr_type) >{ >- int saved_global_expr, bt, bit_pos, bit_size; >+ int saved_global_expr, bt, bit_pos, bit_size, save_ctrl; > void *ptr; > unsigned long long bit_mask; > CType dtype; >@@ -5147,7 +5188,10 @@ static void init_putv(CType *type, Section *sec, >unsigned long c, > tcc_error("initializer element is not constant"); > break; > case EXPR_ANY: >+ save_ctrl = gen_ctrl; >+ gen_ctrl = CTRL_INIT; > expr_eq(); >+ gen_ctrl = save_ctrl; > break; > } > > >I don't see why this is needed. The code you moved in vstore() didn't need it >before. > > >diff --git a/tests/tests2/03_struct.c b/tests/tests2/03_struct.c >index c5d48c5..e06d20d 100644 >--- a/tests/tests2/03_struct.c >+++ b/tests/tests2/03_struct.c >@@ -27,5 +27,36 @@ int main() > printf("%d\n", jones[1].boris); > printf("%d\n", jones[1].natasha); > >+ struct sbf1 { >+ int f1 : 3; >+ int : 2; >+ int f2 : 1; >+ int : 0; >+ int f3 : 5; >+ int f4 : 7; >+ unsigned int f5 : 7; >+ } st1; >+ st1.f1 = st1.f2 = st1.f3 = st1.f4 = st1.f5 = 3; >+ printf("%d %d %d %d %d\n", >+ st1.f1, st1.f2, st1.f3, st1.f4, st1.f5); >+ >+ struct { unsigned a:9, b:7, c:5; } s1; >+ s1.a = s1.b = s1.c = 3; >+ printf("%d / %d / %d\n", s1.a, s1.b, s1.c); >+ >+ struct { >+ unsigned a:9, b:5, c:7; >+ } s2, *ps = &s2; >+ int n = 250; >+ >+ int ii = ps->a = ps->b = ps->c = n + 4; >+ printf("%d / %d / %d\n", ps->a, ps->b, ps->c); >+ printf("%d\n", ii); >+ >+ ps->a = n + 4; >+ ps->b = n + 4; >+ ps->c = n + 4; >+ printf("%d / %d / %d\n", ps->a, ps->b, ps->c); >+ > return 0; >} >diff --git a/tests/tests2/03_struct.expect b/tests/tests2/03_struct.expect >index ecbf589..6b90186 100644 >--- a/tests/tests2/03_struct.expect >+++ b/tests/tests2/03_struct.expect >@@ -1,6 +1,12 @@ >+03_struct.c:39: warning: overflow in implicit constant conversion >12 >34 >12 >34 >56 >78 >+-1 -1 3 3 3 >+3 / 3 / 3 >+30 / 30 / 126 >+30 >+254 / 30 / 126 > > >The added code in 03_struct.c don't exercise the explicit cast. Is it exercise >somewhere else? If not you should add something for this. > >Best regards, > >Thomas _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel