fix(ir): materialize global initialized from module const (issue 0071)
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.
This commit is contained in:
18
examples/0134-types-global-init-from-module-const.sx
Normal file
18
examples/0134-types-global-init-from-module-const.sx
Normal file
@@ -0,0 +1,18 @@
|
||||
// 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;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
42
|
||||
@@ -0,0 +1 @@
|
||||
g=42
|
||||
Reference in New Issue
Block a user