// `cast(T) val` inside a conditional, evaluated by the IR interpreter // during a post-link callback. The `cast` syntax lowers the type arg // (`i64`) as a `placeholder` IR op; the interpreter treats placeholders // as undef so the comparison runs through unchanged. #import "modules/std.sx"; #import "modules/build.sx"; libc :: #library "c"; popen :: (cmd: [:0]u8, mode: [:0]u8) -> *void #foreign libc; puts :: (s: [:0]u8) -> i32 #foreign libc; R :: struct { x: i32; } bug :: (cmd: [:0]u8) -> ?R { f := popen(cmd, "r"); if cast(i64) f == 0 { return null; } R.{ x = 1 } } post_link :: () -> bool { if r := bug("echo hi") { puts("ok"); } else { puts("null"); } true } configure :: () { opts := build_options(); opts.set_post_link_callback(post_link); } #run configure(); main :: () { print("rt\n"); }