diff options
| author | 2026-04-13 09:45:28 +0200 | |
|---|---|---|
| committer | 2026-04-13 09:45:28 +0200 | |
| commit | b9de0c34a285aa0e3a7cfffb542732819adafd61 (patch) | |
| tree | 55d54912f64f521da36240167934287ec26a4ee4 /src/c_type.c | |
| parent | db576fab9f4eed8591c332d8353eed26c517ff36 (diff) | |
frontend: accept zero size arrays and empty aggregates
GNU extension. Previously was overloading arraylength==0 to mean unsized
array, now they are distinct with the type flag TFUNKNOWN marking
unsized arrays & aggregates.
Diffstat (limited to 'src/c_type.c')
| -rw-r--r-- | src/c_type.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/c_type.c b/src/c_type.c index 5853eb8..ef4770d 100644 --- a/src/c_type.c +++ b/src/c_type.c @@ -105,11 +105,13 @@ interntd(const TypeData *td) *slot = *td; switch (slot->t) { case TYENUM: + assert(!(td->flag & TFUNKNOWN) || (!td->var && !td->siz)); if (slot->var) slot->var = alloccopy(&datarena, td->var, nmemb * sizeof *slot->var, 0); break; case TYSTRUCT: case TYUNION: + assert(!(td->flag & TFUNKNOWN) || (td->nmemb == 0 && !td->siz)); if (slot->fld) slot->fld = alloccopy(&datarena, td->fld, nmemb * sizeof *slot->fld, 0); break; @@ -132,12 +134,11 @@ isincomplete(Type t) { switch (t.t) { case TYVOID: return 1; - case TYARRAY: return !typearrlen(t); + case TYARRAY: return t.flag & TFUNKNOWN; + case TYENUM: case TYSTRUCT: case TYUNION: - return typedata[t.dat].nmemb == 0; - case TYENUM: - return !typedata[t.dat].backing; + return typedata[t.dat].flag & TFUNKNOWN; } return 0; } @@ -197,6 +198,15 @@ mkarrtype(Type t, int qual, uint n) } Type +mkunszarrtype(Type t, int qual) +{ + if (isprim(t)) + return mktype(TYARRAY, .flag = TFCHLDPRIM | (qual & TFCHLDQUAL) | TFUNKNOWN, .child = t.t); + return mktype(TYARRAY, .flag = TFUNKNOWN | (qual & TFCHLDQUAL), + .dat = interntd(&(TypeData) { TYARRAY, TFUNKNOWN, .child = t })); +} + +Type mkfntype(Type ret, uint n, const Type *par, bool kandr, bool variadic) { TypeData td = { TYFUNC, .ret = ret, .nmemb = n, .param = par }; @@ -214,7 +224,7 @@ completetype(internstr name, int id, TypeData *td) assert(tagtypetags[id] == name && "bad redefn"); else tagtypetags[id] = name; - return mktype(td->t, .dat = interntd(td)); + return mktype(td->t, .flag = td->flag, .dat = interntd(td)); } Type |