diff options
| author | 2023-06-04 22:16:57 +0200 | |
|---|---|---|
| committer | 2023-06-04 22:16:57 +0200 | |
| commit | 44dff9c3b9f0ba5ab574c91f406855a1cf0f4e7b (patch) | |
| tree | 0380215df1e57f93aa252ef9f4c78df18cd65193 | |
| parent | a6ccb15003ae0346b4437f6d81e2d9db44054af7 (diff) | |
enum fixes
| -rw-r--r-- | parse.c | 16 | ||||
| -rw-r--r-- | test.c | 1 |
2 files changed, 9 insertions, 8 deletions
@@ -257,7 +257,7 @@ Break2: } static union type -deftagged(struct parser *pr, struct span *span, enum typetag tt, const char *name) +deftagged(struct parser *pr, struct span *span, enum typetag tt, const char *name, union type ty) { struct tagged *l; struct typedata td = {0}; @@ -269,7 +269,7 @@ deftagged(struct parser *pr, struct span *span, enum typetag tt, const char *nam } } td.t = tt; - return envaddtagged(pr->env, mktagtype(name, &td), span)->ty; + return envaddtagged(pr->env, ty.t ? ty : mktagtype(name, &td), span)->ty; } /*******************/ @@ -2007,28 +2007,28 @@ tagtype(struct parser *pr, enum toktag kind) return mktype(0); } t = gettagged(pr, &span, tt, tag, /* def? */ peek(pr, NULL) == ';'); - if (!t.t) { - assert(tt == TYENUM); - error(&span, "cannot forward-declare enum"); + if (tt == TYENUM && !t.t) { + error(&tk.span, "cannot forward-declare enum"); return mktype(TYINT); } } else { if (tt != TYENUM) { if (tag) { - t = deftagged(pr, &span, tt, tag); + t = deftagged(pr, &span, tt, tag, mktype(0)); if (t.t != tt || !isincomplete(t)) { if (t.t != tt) error(&tk.span, "defining tagged type %'tk as %tt clashes with previous definition", &tk, kind); else - error(&tk.span, "redefinition of '%tt %s'", kind, tag); + error(&tk.span, "redefinition of '%tt %s'", kind, tag, mktype(0)); note(&span, "previous definition:"); } } t = buildagg(pr, tt, tag, tag ? typedata[t.dat].id : -1); } else { - t = buildenum(pr, tag); + t = buildenum(pr, tag, &span); + if (tag) deftagged(pr, &span, TYENUM, tag, t); } } @@ -82,6 +82,7 @@ enum ball { Z, W = ~0ul }; +enum ball x; main(t) { putc(t + 1, t + 2); |