aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-08-25 11:12:52 +0100
committergingerBill <bill@gingerbill.org>2018-08-25 11:12:52 +0100
commitcc88dd0b71c831fdabb4378930da2f074ff11a17 (patch)
treeb68d68e4e7fbac9e5e9c18f3917fe49a34ab84aa /src/ir.cpp
parentf050bfe8722f8470181975853c5ad6ea2b99fb6f (diff)
Allow for variadic `min` `max` procs
Request #252
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp20
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: {