Surface rename of the signed integer family: s1..s64 become i1..i64
(u1..u64, usize, isize unchanged). 'string' keeps the s-prefix arm in
name classification; width parsing moves to the i-prefix arm next to
isize.
Internal TypeId tags follow the surface (.s8/.s16/.s32/.s64 ->
.i8/.i16/.i32/.i64), as do mono-key mangle fragments (ptr_i64,
tu_i64_bool) and all display/diagnostic formatting (i{d}).
Migrated in the same sweep: stdlib + examples + issue repros + FFI C
companions (shared symbol names like ffi_id_i64), expected
stdout/stderr/ir snapshots, specs.md, readme.md, CLAUDE.md/AGENTS.md,
implementation_plan.md, docs/, issue writeups. Vendored stb_image and
historical flow state left untouched.
zig build test: 426/426; examples suite: 595/595.
50 lines
2.4 KiB
Plaintext
50 lines
2.4 KiB
Plaintext
// A module-global aggregate (array of struct literals, a struct literal, and
|
|
// nested array/struct shapes) materializes its DECLARED field values into the
|
|
// global's static initializer, so reading the fields without any prior store
|
|
// returns the literal values — not zero.
|
|
// Regression (issue 0080): a global `[N]Struct` initialized with struct literals
|
|
// was emitted as `zeroinitializer`, silently dropping every field, because the
|
|
// constant-aggregate serializer had no struct-literal arm and collapsed the
|
|
// whole initializer to null. The fix threads the element/field type so struct
|
|
// and nested-array leaves serialize correctly; a genuinely non-constant
|
|
// initializer is now rejected loudly instead of silently zeroed.
|
|
|
|
#import "modules/std.sx";
|
|
|
|
Pair :: struct { a: i64; b: i64; }
|
|
WithArr :: struct { id: i64; xs: [3]i64; }
|
|
|
|
// global array of struct literals
|
|
pairs : [2]Pair = .[ .{ a = 1, b = 2 }, .{ a = 3, b = 4 } ];
|
|
// global struct literal
|
|
solo : Pair = .{ a = 7, b = 9 };
|
|
// global struct containing a fixed array (struct-with-array)
|
|
wa : WithArr = .{ id = 5, xs = .[ 11, 22, 33 ] };
|
|
// nested: global array of structs each containing an array
|
|
nested : [2]WithArr = .[ .{ id = 1, xs = .[ 1, 2, 3 ] }, .{ id = 2, xs = .[ 4, 5, 6 ] } ];
|
|
|
|
main :: () {
|
|
// Read the declared initializer values back with NO prior store.
|
|
print("pairs={},{} {},{}\n", pairs[0].a, pairs[0].b, pairs[1].a, pairs[1].b);
|
|
print("solo={},{}\n", solo.a, solo.b);
|
|
print("wa={} xs={},{},{}\n", wa.id, wa.xs[0], wa.xs[1], wa.xs[2]);
|
|
print("nested0={} xs={},{},{}\n", nested[0].id, nested[0].xs[0], nested[0].xs[1], nested[0].xs[2]);
|
|
print("nested1={} xs={},{},{}\n", nested[1].id, nested[1].xs[0], nested[1].xs[1], nested[1].xs[2]);
|
|
|
|
// A store on top of the materialized initializer still works (live storage).
|
|
pairs[0].a = 100;
|
|
nested[1].xs[2] = 999;
|
|
print("after-store={} {}\n", pairs[0].a, nested[1].xs[2]);
|
|
|
|
if pairs[0].b == 2 and pairs[1].a == 3 and pairs[1].b == 4
|
|
and solo.a == 7 and solo.b == 9
|
|
and wa.id == 5 and wa.xs[0] == 11 and wa.xs[2] == 33
|
|
and nested[0].id == 1 and nested[0].xs[0] == 1 and nested[0].xs[2] == 3
|
|
and nested[1].id == 2 and nested[1].xs[0] == 4
|
|
and pairs[0].a == 100 and nested[1].xs[2] == 999 {
|
|
print("PASS\n");
|
|
} else {
|
|
print("FAIL: global aggregate literal initializer zeroed\n");
|
|
}
|
|
}
|