fix type switching over internal pointer union

Fixes #3947
This commit is contained in:
Laytan Laats
2024-08-12 00:02:05 +02:00
parent 26fa3aca44
commit 99aa0d3a35
2 changed files with 25 additions and 1 deletions
+1 -1
View File
@@ -1646,7 +1646,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss
union_data = lb_emit_conv(p, parent_ptr, t_rawptr);
Type *union_type = type_deref(parent_ptr.type);
if (is_type_union_maybe_pointer(union_type)) {
tag = lb_emit_conv(p, lb_emit_comp_against_nil(p, Token_NotEq, union_data), t_int);
tag = lb_emit_conv(p, lb_emit_comp_against_nil(p, Token_NotEq, parent_value), t_int);
} else if (union_tag_size(union_type) == 0) {
tag = {}; // there is no tag for a zero sized union
} else {
+24
View File
@@ -0,0 +1,24 @@
package test_internal
import "core:log"
import "core:testing"
@(test)
test_internal_pointer_union_switch :: proc(t: ^testing.T) {
foo: Maybe(^int)
switch _ in foo {
case ^int:
log.error("incorrect case")
case nil:
}
v := 1
foo = &v
switch _ in foo {
case ^int:
case nil:
log.error("incorrect case")
}
}