aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-04 22:16:57 +0200
committerlemon <lsof@mailbox.org>2023-06-04 22:16:57 +0200
commit44dff9c3b9f0ba5ab574c91f406855a1cf0f4e7b (patch)
tree0380215df1e57f93aa252ef9f4c78df18cd65193
parenta6ccb15003ae0346b4437f6d81e2d9db44054af7 (diff)
enum fixes
-rw-r--r--parse.c16
-rw-r--r--test.c1
2 files changed, 9 insertions, 8 deletions
diff --git a/parse.c b/parse.c
index 581d76d..c33d162 100644
--- a/parse.c
+++ b/parse.c
@@ -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);
}
}
diff --git a/test.c b/test.c
index d59088a..92ab2f2 100644
--- a/test.c
+++ b/test.c
@@ -82,6 +82,7 @@ enum ball {
Z,
W = ~0ul
};
+enum ball x;
main(t) {
putc(t + 1, t + 2);