diff options
| author | gingerBill <bill@gingerbill.org> | 2017-11-27 23:00:23 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2017-11-27 23:00:23 +0000 |
| commit | 91b534d128be65ee672fd21f8100a15244597604 (patch) | |
| tree | ac1db2c3b20838090d020678f576ad514f1a5787 /src | |
| parent | 3268f43340454c6df15ea9f644f120923cbe4839 (diff) | |
Fix `transmute`
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_expr.cpp | 3 | ||||
| -rw-r--r-- | src/ir.cpp | 13 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index c59bd995c..359e1e069 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6423,7 +6423,8 @@ gbString write_expr_to_string(gbString str, AstNode *node) { str = gb_string_append_rune(str, ')'); case_end; case_ast_node(tc, TypeCast, node); - str = gb_string_appendc(str, "cast("); + str = string_append_token(str, tc->token); + str = gb_string_append_rune(str, '('); str = write_expr_to_string(str, tc->type); str = gb_string_append_rune(str, ')'); str = write_expr_to_string(str, tc->expr); diff --git a/src/ir.cpp b/src/ir.cpp index bd2d3ca9e..b8efb563e 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -3351,6 +3351,7 @@ bool ir_is_type_aggregate(Type *t) { case Type_Array: case Type_Slice: case Type_Struct: + case Type_Union: case Type_Tuple: case Type_DynamicArray: case Type_Map: @@ -6020,7 +6021,17 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) { case_ast_node(tc, TypeCast, expr); Type *type = type_of_expr(proc->module->info, expr); irValue *x = ir_build_expr(proc, tc->expr); - irValue *e = ir_emit_conv(proc, x, type); + irValue *e = nullptr; + switch (tc->token.kind) { + case Token_cast: + e = ir_emit_conv(proc, x, type); + break; + case Token_transmute: + e = ir_emit_transmute(proc, x, type); + break; + default: + GB_PANIC("Invalid AST TypeCast"); + } irValue *v = ir_add_local_generated(proc, type); ir_emit_store(proc, v, e); return ir_addr(v); |