#import "modules/std.sx";
SPECIAL_VALUE :u8: 42;

resolve :: (x: u8) -> i32 {
    return 12 + x;
}

Foo :: struct {
    a : u2; // this will have 0 as default
    b : u8 = SPECIAL_VALUE; 
    c : u8 = ---; // default for c is undefined
    d : u8 = #run xx resolve(5); // converts i32 to u8
}

main :: () {
    a : Foo; // a=0, b=42, d=17 from defaults; c is `---` (undefined)
    // `c` was declared `---`, so its contents are undefined here. Pin it
    // before printing so the snapshot is deterministic — printing the raw
    // undefined byte yields whatever garbage the stack/codegen leaves.
    a.c = 0;
    print("a 0 : {}\n", a);
    a.a = 1;
    a.c = 8;
    print("a 1 : {}\n", a);

    large: f64 = 5989.5;
    b : Foo = ---; // EVERY field undefined — `= ---` skips all defaults
    // Assign each field explicitly; nothing here may be read before it is
    // written, since `= ---` left the whole struct undefined.
    b.a = 1;
    b.b = SPECIAL_VALUE;      // re-supply the default `= ---` skipped
    b.c = xx large;           // converts f64 to u8 (5989.5 -> 101)
    b.d = xx resolve(5);      // converts i32 to u8 (17)
    print("b: {}", b);
    print("\n");

    f := Pack.{1,0,3,5,9,100,3.5};
    print("{}\n", f);
}

Pack :: struct {
    a: u1;
    b: u2;
    c: u8;    
    d: u32;
    f: u64;
    v: i32;
    x: f32;
}
