From 913d802e3381f61d3bd6e9e67b91fbe991733c88 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 23:10:38 +0000 Subject: [PATCH] Fix `ast.clone_node` --- core/odin/ast/clone.odin | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index b0d997091..400c064f5 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -88,16 +88,20 @@ clone_node :: proc(node: ^Node) -> ^Node { src = (^rawptr)(&node.derived)^ } mem.copy(res, src, size) - res_any: any - res_any.data = res - res_any.id = ti.id + res_ptr_any: any + res_ptr_any.data = &res + res_ptr_any.id = ti.id - reflect.set_union_value(res.derived, res_any) + reflect.set_union_value(res.derived, res_ptr_any) - derived_expr := reflect.struct_field_value_by_name(res_any, "derived_expr", true) - derived_stmt := reflect.struct_field_value_by_name(res_any, "derived_stmt", true) - reflect.set_union_value(res.derived, derived_expr) - reflect.set_union_value(res.derived, derived_stmt) + res_ptr := reflect.deref(res_ptr_any) + + if de := reflect.struct_field_value_by_name(res_ptr, "derived_expr", true); de != nil { + reflect.set_union_value(de, res_ptr_any) + } + if ds := reflect.struct_field_value_by_name(res_ptr, "derived_stmt", true); ds != nil { + reflect.set_union_value(ds, res_ptr_any) + } if res.derived != nil do switch r in res.derived { case ^Package, ^File: