aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/llvm.cff12
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(", ");