registerTopLevelGlobal's init_val switch serialized only literal / array- literal / struct-literal initializers. An identifier initializer (`K : A : 42; g : A = K;`) fell through to `else => null`, so the global was emitted with no payload and silently zero-initialized (printed g=0). Extract the initializer serialization into globalInitValue and add an .identifier arm that materializes the global's static value from ProgramIndex.module_const_map (typed module consts are registered in the same scanDecls pass-2 just before, via registerTypedModuleConst). An identifier that names no usable constant now emits a diagnostic instead of silently zeroing — a global has no run site for a dynamic initializer. Other initializer shapes (enum-literal shorthand, etc.) keep their established static-lowering behavior; enum-literal globals' zero-init is load-bearing for `inline if OS == ...` in the stdlib, so it stays out of scope here. This pass only closes the identifier/module-const hole. Regression: examples/0134-types-global-init-from-module-const.sx (g=42, exit 42). Gate: zig build, zig build test, run_examples.sh -> 355/0.
19 lines
578 B
Plaintext
19 lines
578 B
Plaintext
// Top-level global initialized from a module constant copies the constant's
|
|
// value (not a silent zero). `K : A : 42; g : A = K;` resolves the forward
|
|
// alias `A` to `s32` and materializes `g`'s static initializer from `K`.
|
|
// Regression (issue 0071): `registerTopLevelGlobal`'s init_val switch only
|
|
// handled literals/array/struct literals; an identifier initializer fell
|
|
// through to a null payload and the global silently zero-initialized.
|
|
#import "modules/std.sx";
|
|
|
|
A :: B;
|
|
B :: s32;
|
|
|
|
K : A : 42;
|
|
g : A = K;
|
|
|
|
main :: () -> s32 {
|
|
print("g={}\n", g);
|
|
return g;
|
|
}
|