Просмотр исходного кода

fix type switching over internal pointer union

Fixes #3947
Laytan Laats 1 год назад
Родитель
Сommit
99aa0d3a35
2 измененных файлов с 25 добавлено и 1 удалено
  1. 1 1
      src/llvm_backend_stmt.cpp
  2. 24 0
      tests/internal/test_union_switch.odin

+ 1 - 1
src/llvm_backend_stmt.cpp

@@ -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 - 0
tests/internal/test_union_switch.odin

@@ -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")
+	}
+}