History

A right fix for the array in struct initialization w/o '{' Parse a type if there is only one '(' before a type token. Otherwise a recursion will perform a job.

seyko committed 11 years ago

Commit bd531ec1 parent 367bb6f4 files · +116 −21Browse files

Unified · Split

4 files
  1. tccgen.c +9 −20
  2. tests/tests2/75_array_in_struct_init.c +33 −0
  3. tests/tests2/75_array_in_struct_init.expect +72 −0
  4. tests/tests2/Makefile +2 −1
tccgen.c+9−20
@@ -5546,33 +5546,26 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, · 5545 unmodified lines
55465546 s->c = array_length;
55475547 } else if ((type->t & VT_BTYPE) == VT_STRUCT &&
55485548 (sec || !first || tok == '{')) {
5549− int par_count;
55505549
55515550 /* NOTE: the previous test is a specific case for automatic
55525551 struct/union init */
55535552 /* XXX: union needs only one init */
55545553
5555− /* XXX: this test is incorrect for local initializers
5556− beginning with ( without {. It would be much more difficult
5557− to do it correctly (ideally, the expression parser should
5558− be used in all cases) */
5559− par_count = 0;
55605554 if (tok == '(') {
55615555 AttributeDef ad1;
55625556 CType type1;
55635557 next();
5564− while (tok == '(') {
5565− par_count++;
5566− next();
5567− }
5568− if (!parse_btype(&type1, &ad1))
5569− expect("cast");
5570− type_decl(&type1, &ad1, &n, TYPE_ABSTRACT);
5558+ if (tok != '(') {
5559+ if (!parse_btype(&type1, &ad1))
5560+ expect("cast");
5561+ type_decl(&type1, &ad1, &n, TYPE_ABSTRACT);
55715562 #if 0
5572− if (!is_assignable_types(type, &type1))
5573− tcc_error("invalid type for cast");
5563+ if (!is_assignable_types(type, &type1))
5564+ tcc_error("invalid type for cast");
55745565 #endif
5575− skip(')');
5566+ skip(')');
5567+ } else
5568+ unget_tok(tok);
55765569 }
55775570 no_oblock = 1;
55785571 if (first || tok == '{') {
@@ -5646,10 +5639,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, · 67 unmodified lines
56465639 }
56475640 if (!no_oblock)
56485641 skip('}');
5649− while (par_count) {
5650− skip(')');
5651− par_count--;
5652− }
56535642 } else if (tok == '{') {
56545643 next();
56555644 decl_initializer(type, sec, c, first, size_only);
tests/tests2/75_array_in_struct_init.c+33−0
@@ -0,0 +1,33 @@
1+#include <stdio.h>
2+
3+/* This test is a snippet from the J interpreter */
4+
5+typedef long I;
6+typedef struct{I c[4];I b,e,k;} PT;
7+
8+PT cases[] = {
9+ ((I)4194304L +(I)2097152L +(I)67108864L), (I)262144L, (((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), -1L, 1,2,1,
10+ ((I)+4194304L +(I)2097152L +(I)67108864L)+( (I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), (I)262144L, (I)262144L, (((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), 2,3,2,
11+ ((I)4194304L +(I)2097152L +(I)67108864L)+( (I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), (((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), (I)262144L, (((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), 1,3,2,
12+ ((I)4194304L +(I)2097152L +(I)67108864L)+( (I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), (I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), (I)524288L, -1L, 1,2,1,
13+ ((I)4194304L +(I)2097152L +(I)67108864L)+( (I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), (I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), (I)1048576L, (I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), 1,3,1,
14+ ((I)4194304L +(I)2097152L +(I)67108864L)+( (I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), (I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), (I)262144L, (I)262144L, 1,3,1,
15+ ((I)4194304L +(I)2097152L +(I)67108864L), ((I)1048576L +(I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), ((I)1048576L +(I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), -1L, 1,2,1,
16+ (I)33554432L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L), (I)2097152L, ((I)1048576L +(I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), -1L, 0,2,1,
17+ (I)67108864L, ((I)1048576L +(I)524288L +(I)262144L +(((I)1L +(I)256L +(I)4L +(I)8L +(I)16L +(I)64L +(I)128L +(I)268435456L +(I)536870912L +(I)1024L +(I)4096L +(I)8192L +(I)16384L)+((I)2L +(I)131072L +(I)2048L)+(I)32L +(I)32768L +(I)65536L)), (I)134217728L, -1L, 0,2,0,
18+};
19+
20+int main() {
21+ int i, j;
22+
23+ for(j=0; j < sizeof(cases)/sizeof(cases[0]); j++) {
24+ for(i=0; i < sizeof(cases->c)/sizeof(cases->c[0]); i++)
25+ printf("cases[%d].c[%d]=%ld\n", j, i, cases[j].c[i]);
26+
27+ printf("cases[%d].b=%ld\n", j, cases[j].b);
28+ printf("cases[%d].e=%ld\n", j, cases[j].e);
29+ printf("cases[%d].k=%ld\n", j, cases[j].k);
30+ printf("\n");
31+ }
32+ return 0;
33+}
tests/tests2/75_array_in_struct_init.expect+72−0
@@ -0,0 +1,72 @@
1+cases[0].c[0]=73400320
2+cases[0].c[1]=262144
3+cases[0].c[2]=805567999
4+cases[0].c[3]=-1
5+cases[0].b=1
6+cases[0].e=2
7+cases[0].k=1
8+
9+cases[1].c[0]=879754751
10+cases[1].c[1]=262144
11+cases[1].c[2]=262144
12+cases[1].c[3]=805567999
13+cases[1].b=2
14+cases[1].e=3
15+cases[1].k=2
16+
17+cases[2].c[0]=879754751
18+cases[2].c[1]=805567999
19+cases[2].c[2]=262144
20+cases[2].c[3]=805567999
21+cases[2].b=1
22+cases[2].e=3
23+cases[2].k=2
24+
25+cases[3].c[0]=879754751
26+cases[3].c[1]=805830143
27+cases[3].c[2]=524288
28+cases[3].c[3]=-1
29+cases[3].b=1
30+cases[3].e=2
31+cases[3].k=1
32+
33+cases[4].c[0]=879754751
34+cases[4].c[1]=805830143
35+cases[4].c[2]=1048576
36+cases[4].c[3]=805830143
37+cases[4].b=1
38+cases[4].e=3
39+cases[4].k=1
40+
41+cases[5].c[0]=879754751
42+cases[5].c[1]=805830143
43+cases[5].c[2]=262144
44+cases[5].c[3]=262144
45+cases[5].b=1
46+cases[5].e=3
47+cases[5].k=1
48+
49+cases[6].c[0]=73400320
50+cases[6].c[1]=807403007
51+cases[6].c[2]=807403007
52+cases[6].c[3]=-1
53+cases[6].b=1
54+cases[6].e=2
55+cases[6].k=1
56+
57+cases[7].c[0]=839122431
58+cases[7].c[1]=2097152
59+cases[7].c[2]=807403007
60+cases[7].c[3]=-1
61+cases[7].b=0
62+cases[7].e=2
63+cases[7].k=1
64+
65+cases[8].c[0]=67108864
66+cases[8].c[1]=807403007
67+cases[8].c[2]=134217728
68+cases[8].c[3]=-1
69+cases[8].b=0
70+cases[8].e=2
71+cases[8].k=0
72+
tests/tests2/Makefile+2−1
@@ -93,7 +93,8 @@ TESTS = \ · 92 unmodified lines
9393 71_macro_empty_arg.test \
9494 72_long_long_constant.test \
9595 73_arm64.test \
96− 74_nocode_wanted.test
96+ 74_nocode_wanted.test \
97+ 75_array_in_struct_init.test
9798
9899
99100 # 34_array_assignment.test -- array assignment is not in C standard