struct { int a[2], b[2]; } cases[] = { { ((int)0), (((int)0)) }, ((int)0), (((int)0)) /* error: ',' expected (got ")") */ }; int main() { return 0; } This commit allow to skip ')' in the decl_initializer() and to see ','
Unified · Split
| @@ -80,7 +80,7 @@ static int is_compatible_types(CType *type1, CType *type2); · 79 unmodified lines | ||
| 80 | 80 | static int parse_btype(CType *type, AttributeDef *ad); |
| 81 | 81 | static void type_decl(CType *type, AttributeDef *ad, int *v, int td); |
| 82 | 82 | static void parse_expr_type(CType *type); |
| 83 | −static void decl_initializer(CType *type, Section *sec, unsigned long c, int first, int size_only); | |
| 83 | +static void decl_initializer(CType *type, Section *sec, unsigned long c, int first, int size_only, int *par_count_p); | |
| 84 | 84 | static void block(int *bsym, int *csym, int *case_sym, int *def_sym, int case_reg, int is_expr); |
| 85 | 85 | static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, int has_init, int v, char *asm_label, int scope); |
| 86 | 86 | static int decl0(int l, int is_for_loop_init); |
| @@ -5111,7 +5111,7 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, · 5024 unmodified lines | ||
| 5111 | 5111 | in arrays) */ |
| 5112 | 5112 | static void decl_designator(CType *type, Section *sec, unsigned long c, |
| 5113 | 5113 | int *cur_index, Sym **cur_field, |
| 5114 | − int size_only) | |
| 5114 | + int size_only, int *par_count_p) | |
| 5115 | 5115 | { |
| 5116 | 5116 | Sym *s, *f; |
| 5117 | 5117 | int notfirst, index, index_last, align, l, nb_elems, elem_size; |
| @@ -5203,7 +5203,7 @@ static void decl_designator(CType *type, Section *sec, unsigned long c, · 85 unmodified lines | ||
| 5203 | 5203 | c += f->c; |
| 5204 | 5204 | } |
| 5205 | 5205 | } |
| 5206 | − decl_initializer(type, sec, c, 0, size_only); | |
| 5206 | + decl_initializer(type, sec, c, 0, size_only, par_count_p); | |
| 5207 | 5207 | |
| 5208 | 5208 | /* XXX: make it more general */ |
| 5209 | 5209 | if (!size_only && nb_elems > 1) { |
| @@ -5372,7 +5372,7 @@ static void init_putz(CType *t, Section *sec, unsigned long c, int size) · 162 unmodified lines | ||
| 5372 | 5372 | dimension implicit array init handling). 'size_only' is true if |
| 5373 | 5373 | size only evaluation is wanted (only for arrays). */ |
| 5374 | 5374 | static void decl_initializer(CType *type, Section *sec, unsigned long c, |
| 5375 | − int first, int size_only) | |
| 5375 | + int first, int size_only, int *par_count_p) | |
| 5376 | 5376 | { |
| 5377 | 5377 | int index, array_length, n, no_oblock, nb, parlevel, parlevel1, i; |
| 5378 | 5378 | int size1, align1, expr_type; |
| @@ -5468,7 +5468,7 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, · 89 unmodified lines | ||
| 5468 | 5468 | } else { |
| 5469 | 5469 | index = 0; |
| 5470 | 5470 | while (tok != '}') { |
| 5471 | − decl_designator(type, sec, c, &index, NULL, size_only); | |
| 5471 | + decl_designator(type, sec, c, &index, NULL, size_only, par_count_p); | |
| 5472 | 5472 | if (n >= 0 && index >= n) |
| 5473 | 5473 | tcc_error("index too large"); |
| 5474 | 5474 | /* must put zero in holes (note that doing it that way |
| @@ -5485,6 +5485,10 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, · 10 unmodified lines | ||
| 5485 | 5485 | same time) */ |
| 5486 | 5486 | if (index >= n && no_oblock) |
| 5487 | 5487 | break; |
| 5488 | + if (*par_count_p != 0 && tok == ')') { | |
| 5489 | + skip(')'); | |
| 5490 | + *par_count_p -= 1; | |
| 5491 | + } | |
| 5488 | 5492 | if (tok == '}') |
| 5489 | 5493 | break; |
| 5490 | 5494 | skip(','); |
| @@ -5541,7 +5545,7 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, · 50 unmodified lines | ||
| 5541 | 5545 | index = 0; |
| 5542 | 5546 | n = s->c; |
| 5543 | 5547 | while (tok != '}') { |
| 5544 | − decl_designator(type, sec, c, NULL, &f, size_only); | |
| 5548 | + decl_designator(type, sec, c, NULL, &f, size_only, &par_count); | |
| 5545 | 5549 | index = f->c; |
| 5546 | 5550 | if (!size_only && array_length < index) { |
| 5547 | 5551 | init_putz(type, sec, c + array_length, |
| @@ -5607,8 +5611,9 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, · 59 unmodified lines | ||
| 5607 | 5611 | par_count--; |
| 5608 | 5612 | } |
| 5609 | 5613 | } else if (tok == '{') { |
| 5614 | + int par_count = 0; | |
| 5610 | 5615 | next(); |
| 5611 | − decl_initializer(type, sec, c, first, size_only); | |
| 5616 | + decl_initializer(type, sec, c, first, size_only, &par_count); | |
| 5612 | 5617 | skip('}'); |
| 5613 | 5618 | } else if (size_only) { |
| 5614 | 5619 | /* just skip expression */ |
| @@ -5680,6 +5685,7 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, · 65 unmodified lines | ||
| 5680 | 5685 | initializers handling */ |
| 5681 | 5686 | tok_str_new(&init_str); |
| 5682 | 5687 | if (size < 0 || (flexible_array && has_init)) { |
| 5688 | + int par_count = 0; | |
| 5683 | 5689 | if (!has_init) |
| 5684 | 5690 | tcc_error("unknown type size"); |
| 5685 | 5691 | /* get all init string */ |
| @@ -5715,7 +5721,7 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, · 29 unmodified lines | ||
| 5715 | 5721 | |
| 5716 | 5722 | macro_ptr = init_str.str; |
| 5717 | 5723 | next(); |
| 5718 | − decl_initializer(type, NULL, 0, 1, 1); | |
| 5724 | + decl_initializer(type, NULL, 0, 1, 1, &par_count); | |
| 5719 | 5725 | /* prepare second initializer parsing */ |
| 5720 | 5726 | macro_ptr = init_str.str; |
| 5721 | 5727 | next(); |
| @@ -5870,7 +5876,8 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, · 148 unmodified lines | ||
| 5870 | 5876 | #endif |
| 5871 | 5877 | } |
| 5872 | 5878 | if (has_init || (type->t & VT_VLA)) { |
| 5873 | − decl_initializer(type, sec, addr, 1, 0); | |
| 5879 | + int par_count = 0; | |
| 5880 | + decl_initializer(type, sec, addr, 1, 0, &par_count); | |
| 5874 | 5881 | /* restore parse state if needed */ |
| 5875 | 5882 | if (init_str.str) { |
| 5876 | 5883 | tok_str_free(init_str.str); |