aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index b2a6b9579..cd611ea44 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -4283,6 +4283,23 @@ irValue *ir_build_builtin_proc(irProcedure *proc, AstNode *expr, TypeAndValue tv
return ir_emit_load(proc, slice);
} break;
+ case BuiltinProc_expand_to_tuple: {
+ ir_emit_comment(proc, str_lit("expand_to_tuple"));
+ irValue *s = ir_build_expr(proc, ce->args[0]);
+ Type *t = base_type(ir_type(s));
+
+ GB_ASSERT(t->kind == Type_Record);
+ GB_ASSERT(is_type_tuple(tv.type));
+
+ irValue *tuple = ir_add_local_generated(proc, tv.type);
+ for (isize i = 0; i < t->Record.field_count; i++) {
+ irValue *f = ir_emit_struct_ev(proc, s, i);
+ irValue *ep = ir_emit_struct_ep(proc, tuple, i);
+ ir_emit_store(proc, ep, f);
+ }
+ return ir_emit_load(proc, tuple);
+ } break;
+
case BuiltinProc_min: {
ir_emit_comment(proc, str_lit("min"));
Type *t = type_of_expr(proc->module->info, expr);