// `cast(T) val` inside a conditional, evaluated by the IR interpreter
// during a post-link callback. The `cast` syntax lowers the type arg
// (`s64`) as a `placeholder` IR op; the interpreter treats placeholders
// as undef so the comparison runs through unchanged.

#import "modules/std.sx";
#import "modules/compiler.sx";

libc :: #library "c";
popen :: (cmd: [:0]u8, mode: [:0]u8) -> *void #foreign libc;
puts  :: (s: [:0]u8) -> s32 #foreign libc;

R :: struct { x: s32; }

bug :: (cmd: [:0]u8) -> ?R {
    f := popen(cmd, "r");
    if cast(s64) 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"); }
