aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-03-23 09:14:39 +0100
committerlemon <lsof@mailbox.org>2026-03-23 09:14:39 +0100
commit75c4a35e1884e64b6141df64a7df6293d38445b5 (patch)
treeea24a9ef610e7b30351d06c3e6e2fe6d0c8e5b43 /src
parent7c5dd45eca377a3b675b6f0d4a9331bc3f971ac9 (diff)
c: remove inline 'backing' type tag for enums
It was meant as a micro-optimization but actually keeping it in sync was annoying. This for example was broken: ``` extern enum foo { ... } g_foo; enum foo g_foo; ```
Diffstat (limited to 'src')
-rw-r--r--src/c.c1
-rw-r--r--src/c_type.c2
-rw-r--r--src/c_type.h10
3 files changed, 4 insertions, 9 deletions
diff --git a/src/c.c b/src/c.c
index d6879ad..6446ab5 100644
--- a/src/c.c
+++ b/src/c.c
@@ -2198,7 +2198,6 @@ buildenum(CComp *cm, internstr name, const Span *span, int id)
ty = completetype(name, id, &td);
else
ty = mktagtype(name, &td);
- ty.backing = td.backing;
return ty;
}
diff --git a/src/c_type.c b/src/c_type.c
index bf24653..5853eb8 100644
--- a/src/c_type.c
+++ b/src/c_type.c
@@ -214,7 +214,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), .backing = td->t == TYENUM ? td->backing : 0);
+ return mktype(td->t, .dat = interntd(td));
}
Type
diff --git a/src/c_type.h b/src/c_type.h
index ecca949..6f9a265 100644
--- a/src/c_type.h
+++ b/src/c_type.h
@@ -30,10 +30,7 @@ enum typeflagmask {
typedef union Type {
struct {
uchar t; /* type tag */
- union {
- uchar flag;
- uchar backing; /* type tag for enum backing int */
- };
+ uchar flag;
union {
struct {
uchar child; /* prim type tag */
@@ -141,11 +138,10 @@ Type cvtarith(Type a, Type b);
static inline Type
typechild(Type t)
{
- if (t.t == TYENUM) return mktype(t.backing ? t.backing : typedata[t.dat].backing);
+ if (t.t == TYENUM) return mktype(typedata[t.dat].backing);
if (t.flag & TFCHLDPRIM) return mktype(t.child);
if (t.flag & TFCHLDISDAT) {
Type chld = mktype(typedata[t.dat].t, .dat = t.dat);
- if (chld.t == TYENUM) chld.backing = typedata[t.dat].backing;
return chld;
}
return typedata[t.dat].child;
@@ -153,7 +149,7 @@ typechild(Type t)
static inline enum typetag
scalartypet(Type t)
{
- if (t.t == TYENUM) return t.backing ? t.backing : typedata[t.dat].backing;
+ if (t.t == TYENUM) return typedata[t.dat].backing;
if (isptrcvt(t)) return TYPTR;
assert(!iscomplex(t));
return t.t;