diff options
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 |