diff options
| author | seyko <seyko2@gmail.com> | 2015-03-05 20:18:25 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2015-03-05 20:18:25 +0300 |
| commit | d9b87c087c93034a68e8013201c24b506504af20 (patch) | |
| tree | 96b7420eeb45d32931c5adcdf263568b38d14abb | |
| parent | 4b92dbf9237c5712d2ab3a2ce3fab7904c85dad2 (diff) | |
| download | tinycc-d9b87c087c93034a68e8013201c24b506504af20.tar.gz tinycc-d9b87c087c93034a68e8013201c24b506504af20.tar.bz2 | |
fixing decl_initializer() for size_only: don't eat ')'
a test program:
struct { int c[1]; } s1[] = { (int)0 }; /* OK */
struct { int c[1]; } s2[] = { { ((int)0) } }; /* OK */
struct { int c[1]; } s3[] = { 0 }; /* OK */
struct { int c[1]; } sx[] = { ((int)0) }; /* error: ')' expected (got "}") */
int main() { return 0; }
| -rw-r--r-- | tccgen.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -5605,12 +5605,18 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, (tok != '}' && tok != ',')) && tok != -1) { if (tok == '(') parlevel++; - else if (tok == ')') + else if (tok == ')') { + if (parlevel == 0 && parlevel1 == 0) + break; parlevel--; + } else if (tok == '{') parlevel1++; - else if (tok == '}') + else if (tok == '}') { + if (parlevel == 0 && parlevel1 == 0) + break; parlevel1--; + } next(); } } else { |
