diff options
| author | gingerBill <bill@gingerbill.org> | 2018-08-25 11:12:52 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-08-25 11:12:52 +0100 |
| commit | cc88dd0b71c831fdabb4378930da2f074ff11a17 (patch) | |
| tree | b68d68e4e7fbac9e5e9c18f3917fe49a34ab84aa /src/ir.cpp | |
| parent | f050bfe8722f8470181975853c5ad6ea2b99fb6f (diff) | |
Allow for variadic `min` `max` procs
Request #252
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index f199974c8..4c8ccb6dd 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -4539,13 +4539,29 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu case BuiltinProc_min: { ir_emit_comment(proc, str_lit("min")); Type *t = type_of_expr(expr); - return ir_emit_min(proc, t, ir_build_expr(proc, ce->args[0]), ir_build_expr(proc, ce->args[1])); + if (ce->args.count == 2) { + return ir_emit_min(proc, t, ir_build_expr(proc, ce->args[0]), ir_build_expr(proc, ce->args[1])); + } else { + irValue *x = ir_build_expr(proc, ce->args[0]); + for (isize i = 1; i < ce->args.count; i++) { + x = ir_emit_min(proc, t, x, ir_build_expr(proc, ce->args[i])); + } + return x; + } } case BuiltinProc_max: { ir_emit_comment(proc, str_lit("max")); Type *t = type_of_expr(expr); - return ir_emit_max(proc, t, ir_build_expr(proc, ce->args[0]), ir_build_expr(proc, ce->args[1])); + if (ce->args.count == 2) { + return ir_emit_max(proc, t, ir_build_expr(proc, ce->args[0]), ir_build_expr(proc, ce->args[1])); + } else { + irValue *x = ir_build_expr(proc, ce->args[0]); + for (isize i = 1; i < ce->args.count; i++) { + x = ir_emit_max(proc, t, x, ir_build_expr(proc, ce->args[i])); + } + return x; + } } case BuiltinProc_abs: { |