diff options
| -rw-r--r-- | src/llvm.cff | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/llvm.cff b/src/llvm.cff index e23b65d..a33ca56 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -776,8 +776,16 @@ fn genexpr(f *Fn, ex *Expr) Value { let fnty = &(lhs.ty->is(:Ptr) ? lhs.ty.u.Ptr : lhs.ty).u.Fn; let args *Value = xcalloc(call.args.#len, sizeof Value); defer free(args); + + fn varargpromote(ty *const Type) *const Type { + if ty->is(:Bool) { return ty_int; }; + if ty->is(:Int) { return typeof2(ty, ty); } + if ty->is(:Flo) and ty.size < 8 { return ty_f64; } + return ty; + } + foreach_ptr(arg, i, call.args) { - let ty = i < fnty.params.#len ? fnty.params[i] : typeof2(arg.ty, arg.ty); + let ty = i < fnty.params.#len ? fnty.params[i] : varargpromote(arg.ty); args[i] = convert(f, ty, arg); } let t Value #?; @@ -789,7 +797,7 @@ fn genexpr(f *Fn, ex *Expr) Value { gen("\t%v = call %t %v(", t, call.lhs.ty, lhs); } foreach_ptr(arg, i, call.args) { - let ty = i < fnty.params.#len ? fnty.params[i] : typeof2(arg.ty, arg.ty); + let ty = i < fnty.params.#len ? fnty.params[i] : varargpromote(arg.ty); gen("%t %v", ty, args[i]); if i < call.args.#len - 1 { gen(", "); |