lang: rename signed integer types sN -> iN
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.
This commit is contained in:
@@ -15,21 +15,21 @@
|
||||
> resolution path (direct local decls, struct fields, function params/returns),
|
||||
> but the *stateless* registration-time resolver (`type_bridge`, used for type
|
||||
> aliases `Arr :: [N]T` and inline union/enum field types) still resolved the
|
||||
> named dim with a silent `else 0` — so `Arr :: [N]s64; a : Arr` and
|
||||
> `union { a: [N]s64 }` were still miscompiled. Fix: the module-global const
|
||||
> named dim with a silent `else 0` — so `Arr :: [N]i64; a : Arr` and
|
||||
> `union { a: [N]i64 }` were still miscompiled. Fix: the module-global const
|
||||
> table (`ProgramIndex.module_const_map`) is now threaded into `type_bridge`
|
||||
> alongside the alias map, so `StatelessInner.resolveArrayLen` resolves a named
|
||||
> module-const dim to the same length everywhere. The remaining unresolvable case
|
||||
> (a computed/comptime dimension on the binding-free path) bails LOUDLY instead of
|
||||
> fabricating a 0 length. Files: `src/ir/type_resolver.zig`, `src/ir/lower.zig`,
|
||||
> `src/ir/type_bridge.zig`. Regression: `examples/0140-types-named-const-array-dim.sx`
|
||||
> (direct + type-alias + nested `[N][M]T` + union-field dims, s64 / string /
|
||||
> (direct + type-alias + nested `[N][M]T` + union-field dims, i64 / string /
|
||||
> struct element types).
|
||||
>
|
||||
> **Root-cause close-out (attempt 3).** Attempt 2 threaded the const map into
|
||||
> `type_bridge` but the map wasn't fully populated when an alias resolved its
|
||||
> dimension: type aliases (`Arr :: [N]T`) resolve EAGERLY in scanDecls pass 1,
|
||||
> while TYPED consts (`N : s64 : 16`) register only in pass 2 and a
|
||||
> while TYPED consts (`N : i64 : 16`) register only in pass 2 and a
|
||||
> forward-declared untyped const (`Arr :: [N]T; N :: 16`) hadn't registered yet
|
||||
> either — so the stateless resolver saw an empty table, printed a non-fatal
|
||||
> warning, fabricated length 0, and CONTINUED to garbage / a segfault. Three
|
||||
@@ -46,7 +46,7 @@
|
||||
> `src/ir/program_index.zig`, `src/ir/lower.zig`, `src/ir/type_bridge.zig`,
|
||||
> `src/ir/type_resolver.zig`. Regressions:
|
||||
> `examples/0143-types-typed-const-array-dim.sx` (typed-const dim direct + via
|
||||
> alias for s64/string/struct, forward-ref alias, nested) and
|
||||
> alias for i64/string/struct, forward-ref alias, nested) and
|
||||
> `examples/1129-diagnostics-array-dim-not-const.sx` (an unresolvable computed dim
|
||||
> halts with a clean diagnostic + non-zero exit, not a fabricated 0-length array).
|
||||
>
|
||||
@@ -70,7 +70,7 @@
|
||||
> `src/ir/lower.zig`, `src/ir/type_bridge.zig`. Regression:
|
||||
> `examples/0144-types-const-expr-array-dim.sx` (every expression form, direct vs
|
||||
> alias, scalar / string / struct element types); `1129` re-pointed at a genuinely
|
||||
> non-const dimension (`[get()]s64`, a runtime call) so it still proves the
|
||||
> non-const dimension (`[get()]i64`, a runtime call) so it still proves the
|
||||
> stateless clean-halt.
|
||||
>
|
||||
> **Unified comptime-int evaluator (attempt 5).** Attempts 1–4 fixed the array
|
||||
@@ -106,7 +106,7 @@
|
||||
>
|
||||
> **Value-param type functions + oversized guard (attempt 6).** Two remaining
|
||||
> siblings in the comptime-int path. (1) A type-RETURNING function with a value
|
||||
> param used as a TYPE annotation (`b : Make(N, s64)` where `Make :: ($K: u32,
|
||||
> param used as a TYPE annotation (`b : Make(N, i64)` where `Make :: ($K: u32,
|
||||
> $T: Type) -> Type { return [K]T; }`) was rejected "unknown type 'N'" because
|
||||
> the unknown-type checker walked the value-param position as a type name, AND the
|
||||
> parameterized-type-annotation path never routed to `instantiateTypeFunction`
|
||||
@@ -116,8 +116,8 @@
|
||||
> binder's value/type classification); `resolveParameterizedWithBindings` routes
|
||||
> a type-returning-function name to `instantiateTypeFunction`; and that binder
|
||||
> resolves a general return-type expression (`return [K]T`) with bindings active.
|
||||
> `Make(N, s64)`, `Make(M + 1, s64)`, and `Make(3, s64)` now resolve to one
|
||||
> `[3]s64`. (2) Oversized dim/lane folds (`[5_000_000_000]`) panicked the
|
||||
> `Make(N, i64)`, `Make(M + 1, i64)`, and `Make(3, i64)` now resolve to one
|
||||
> `[3]i64`. (2) Oversized dim/lane folds (`[5_000_000_000]`) panicked the
|
||||
> compiler — fixed under issue 0087 via the shared range-checked
|
||||
> `program_index.foldDimU32` gate. Files: `src/ir/semantic_diagnostics.zig`,
|
||||
> `src/ir/lower.zig`, `src/ir/program_index.zig`, `src/ir/type_bridge.zig`.
|
||||
@@ -125,10 +125,10 @@
|
||||
>
|
||||
> **Diagnostic-accuracy parity (attempt 7).** The fold + layout were correct, but
|
||||
> the two paths still DIVERGED on the error MESSAGE for an oversized dim. The
|
||||
> direct form (`a : [5_000_000_000]s64`) reported the accurate "array dimension
|
||||
> direct form (`a : [5_000_000_000]i64`) reported the accurate "array dimension
|
||||
> 5000000000 does not fit in u32" (from the stateful `resolveArrayLen`, which
|
||||
> branches on `foldDimU32`'s `.too_large` / `.below_min` / `.not_const` variants),
|
||||
> but the type-ALIAS form (`Big :: [5_000_000_000]s64`) reported a FALSE "an array
|
||||
> but the type-ALIAS form (`Big :: [5_000_000_000]i64`) reported a FALSE "an array
|
||||
> dimension is not a compile-time integer constant" — because the stateless
|
||||
> `resolveArrayLen` collapsed every non-`.ok` `DimU32` to `null`, so the
|
||||
> alias-registration site had only one generic message to emit. Fix: a single
|
||||
@@ -147,7 +147,7 @@
|
||||
> **Integral-float counts + value-param range gate (attempt 8, Agra ruling).**
|
||||
> Two finishing items on the shared count path. (1) An *integral* compile-time
|
||||
> FLOAT used as a count (array dim, Vector lane, value-param, `inline for` bound)
|
||||
> was wrongly rejected — `N : f64 : 4.0`, `N :: 4.0`, and `[4.0]s64` all said
|
||||
> was wrongly rejected — `N : f64 : 4.0`, `N :: 4.0`, and `[4.0]i64` all said
|
||||
> "must be a compile-time integer constant". The shared evaluator now folds an
|
||||
> integral float to its integer at the single leaf
|
||||
> (`program_index.floatToIntExact`, used by both the `.float_literal` arm of
|
||||
@@ -175,7 +175,7 @@
|
||||
> `Box(5_000_000_000)` with `$K: Count` compiled and bound a truncated value. The
|
||||
> gate (`Lowering.resolveValueParamArg`, shared by BOTH binders — struct +
|
||||
> type-fn) now resolves the constraint to its underlying builtin
|
||||
> (`canonicalIntConstraintName`: `Count` → u32, `Small` → s8) before
|
||||
> (`canonicalIntConstraintName`: `Count` → u32, `Small` → i8) before
|
||||
> range-checking, so an aliased integer constraint behaves exactly like the
|
||||
> builtin it names. (2) A named const with an EXPRESSION RHS (`M :: 2; N :: M + 1`)
|
||||
> did not fold as a count — `program_index.moduleConstInt` read only a LITERAL RHS
|
||||
@@ -192,14 +192,14 @@
|
||||
> `src/ir/lower.zig`. Regressions: `examples/0146-types-comptime-count-matrix.sx`
|
||||
> (the full positive matrix — every consumer × representative leaf form),
|
||||
> `examples/1135-diagnostics-value-param-alias-constraint-overflow.sx` (aliased
|
||||
> u32 + s8 overflow), `examples/1136-diagnostics-array-dim-nonconst-direct-no-crash.sx`
|
||||
> u32 + i8 overflow), `examples/1136-diagnostics-array-dim-nonconst-direct-no-crash.sx`
|
||||
> (direct non-const dim halts cleanly, no fabrication / panic); the cascade
|
||||
> cleanup also tightened `examples/1502`/`1503` to one diagnostic each.
|
||||
>
|
||||
> **Final convergence — type-fn binder parity (attempt 10).** One last cell of
|
||||
> the count surface still diverged from the struct binder. A FAILED value-param
|
||||
> bind on a type-RETURNING FUNCTION (`MakeC :: ($K: Count, $T: Type) -> Type
|
||||
> { return [K]T; }`; `a : MakeC(5_000_000_000, s64)`) emitted its correct range
|
||||
> { return [K]T; }`; `a : MakeC(5_000_000_000, i64)`) emitted its correct range
|
||||
> diagnostic, but `instantiateTypeFunction` then returned `null`, so
|
||||
> `resolveParameterizedWithBindings` fell through to the empty-struct *placeholder*
|
||||
> named `MakeC`. The binding `a` got that placeholder type, so a downstream
|
||||
@@ -216,7 +216,7 @@
|
||||
## Symptom
|
||||
A fixed array whose dimension is a module-global integer constant (`N :: 16;
|
||||
a : [N]T`) miscompiles element access: reads/writes compute a wrong address.
|
||||
With `s64` elements `a[0]` returns GARBAGE (silent); with slice/pointer element
|
||||
With `i64` elements `a[0]` returns GARBAGE (silent); with slice/pointer element
|
||||
types (`[N]string`) it Bus-errors. The identical program with a LITERAL dimension
|
||||
(`a : [16]T`) is correct. Silent-miscompile class (cf. 0079–0082).
|
||||
|
||||
@@ -224,7 +224,7 @@ types (`[N]string`) it Bus-errors. The identical program with a LITERAL dimensio
|
||||
```sx
|
||||
#import "modules/std.sx";
|
||||
N :: 16;
|
||||
main :: () { a : [N]s64 = ---; a[0] = 7; print("a0={}\n", a[0]); }
|
||||
main :: () { a : [N]i64 = ---; a[0] = 7; print("a0={}\n", a[0]); }
|
||||
```
|
||||
`./zig-out/bin/sx run` prints `a0=8472789232` (garbage); want `a0=7`. Replacing
|
||||
`[N]` with `[16]` prints `7`.
|
||||
|
||||
Reference in New Issue
Block a user