Something went wrong. Try again.
Jam Programming Language jamlang.org
compiler
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139const { assert } = import("test");
// MVS P2: definite-initialization analysis. These tests exercise programs// that the analyzer must accept — they correctly initialize bindings// before reading them on every reachable control-flow path.//// Programs that should *fail* the analysis (must-fail tests) require a// dedicated test runner — that infrastructure lands in P7. Until then,// must-fail behavior is verified manually with one-off bad-input files.
// --- Direct init then read ---fn directInitRead() u32 { var x: u32 = 5; return x;}
// --- Reassign overwrites the initial value ---fn reassignOverInitial() u32 { var x: u32 = 0; x = 42; return x;}
// --- Multiple bindings, all initialized ---fn multipleBindings() u32 { var a: u32 = 1; var b: u32 = 2; var c: u32 = 3; return a + b + c;}
// --- if/else with both branches reassigning ---fn ifElseBothInit() u32 { var x: u32 = 0; if (true) { x = 100; } else { x = 200; } return x;}
// --- Re-assignment after init is fine ---fn reassign() u32 { var x: u32 = 10; x = 20; x = 30; return x;}
const Vec = struct { x: u32, y: u32,};
// --- Field reassignment after struct-literal init ---fn fieldReassign() u32 { var v: Vec = Vec { x: 0, y: 0 }; v.x = 7; v.y = 11; return v.x + v.y;}
// --- Element reassignment after array-literal init ---fn arrayReassign() u8 { var arr: [4]u8 = [10, 20, 30, 40]; return arr[2];}
// --- For-loop body overwrites array elements ---fn forLoopFill() u8 { var arr: [16]u8 = [0; 16]; for i in 0:16 { arr[i] = i; } return arr[7];}
// --- Address-of a binding; `&x` doesn't change init state. ---fn addressOfBinding() u8 { var x: u8 = 0; var p: *mut u8 = &x; x = 99; return x;}
// --- Return inside one branch; the other reaches the next stmt ---fn returnInBranch(b: bool) u32 { var x: u32 = 0; if (b) { return 0; } else { x = 50; } return x;}
// --- Tests ---
tfn directInitReadOK() { assert(directInitRead(), 5);}
tfn reassignOverInitialOK() { assert(reassignOverInitial(), 42);}
tfn multipleBindingsOK() { assert(multipleBindings(), 6);}
tfn ifElseBothInitOK() { assert(ifElseBothInit(), 100);}
tfn reassignOK() { assert(reassign(), 30);}
tfn fieldReassignOK() { assert(fieldReassign(), 18);}
tfn arrayReassignOK() { assert(arrayReassign(), 30);}
tfn forLoopFillOK() { assert(forLoopFill(), 7);}
tfn addressOfBindingOK() { assert(addressOfBinding(), 99);}
tfn returnInBranchOK() { assert(returnInBranch(false), 50);}