diff options
| author | 2025-11-05 13:56:54 +0100 | |
|---|---|---|
| committer | 2025-11-05 19:02:44 +0100 | |
| commit | 13471741b538baa45cd53a521cf7d52087f3200f (patch) | |
| tree | 15624e0f3a2e8a11f2c114f8309af6e3207193c0 /c/eval.c | |
| parent | 088c3c1ce51de82ef317592bae766ad20f82208d (diff) | |
amd64: fix aggregate abi stuff;; ir: fold, peephole optimizing constructors
Diffstat (limited to 'c/eval.c')
| -rw-r--r-- | c/eval.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -29,6 +29,7 @@ numcast(union type ty, struct expr *dst, const struct expr *src) struct expr tmp; enum typetag td = targ2hosttype(ty.t); enum typetag ts = targ2hosttype(src->ty.t == TYENUM ? src->ty.backing : src->ty.t); + vlong isrc; if (src == dst) tmp = *src, src = &tmp; assert(src->t == ENUMLIT); @@ -45,11 +46,12 @@ numcast(union type ty, struct expr *dst, const struct expr *src) else if (td == TYDOUBLE) dst->f = (double) src->i; else if (TF(TYUVLONG)) dst->u = src->f; else if (TF(TYBOOL)) dst->i = (bool) src->f; - else if (isfltt(ts)) { dst->i = src->f; goto Narrow; } + else if (isfltt(ts)) { isrc = src->f; goto Narrow; } else { + isrc = src->i; Narrow: switch (td) { -#define I(Ty, Tag) case Tag: dst->i = (Ty) src->i; break; +#define I(Ty, Tag) case Tag: dst->i = (Ty) isrc; break; I(bool, TYBOOL) I(signed char, TYSCHAR) I(unsigned char, TYUCHAR) |