From cc88dd0b71c831fdabb4378930da2f074ff11a17 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 25 Aug 2018 11:12:52 +0100 Subject: Allow for variadic `min` `max` procs Request #252 --- src/ir.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/ir.cpp') 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: { -- cgit v1.2.3