diff options
| author | 2026-03-20 08:32:09 +0100 | |
|---|---|---|
| committer | 2026-03-20 08:32:12 +0100 | |
| commit | 31032275a618f74865bdc877b569eae2227e79b4 (patch) | |
| tree | 6802666330d7fa29a6375da6d32d518e60f29884 | |
| parent | cdc076e6adf2e8066872d30535c71e128c5375ca (diff) | |
c: better preserve source location in some cases
| -rw-r--r-- | src/c.c | 6 | ||||
| -rw-r--r-- | src/c_eval.c | 4 |
2 files changed, 8 insertions, 2 deletions
@@ -1233,10 +1233,12 @@ Unary: ty = unops[nunop].ty; if (!castcheck(ty, &ex)) error(&span, "cannot cast value of type '%ty' to '%ty'", ex.ty, ty); - if (ex.t == ENUMLIT && isint(ex.ty) && ty.t == TYPTR) + if (ex.t == ENUMLIT && isint(ex.ty) && ty.t == TYPTR) { ex.ty = ty; - else + ex.span = span; + } else { ex = mkexpr(ECAST, span, ty, .sub = exprdup(cm, &ex)); + } } } diff --git a/src/c_eval.c b/src/c_eval.c index dce1457..20a5a12 100644 --- a/src/c_eval.c +++ b/src/c_eval.c @@ -403,11 +403,15 @@ eval(Expr *ex, enum evalmode mode) case EGETF: goto Unop; case ESEQ: if (!eval(&ex->sub[0], mode)) return 0; + Span span = ex->span; *ex = ex->sub[1]; + ex->span = span; return eval(ex, mode); case ECOND: if (!eval(&ex->sub[0], mode)) return 0; + span = ex->span; *ex = ex->sub[2-truthy(&ex->sub[0])]; + ex->span = span; return eval(ex, mode); case EINIT: for (InitElem *v = ex->init->vals; v; v = v->next) { |