Skip to content

v3.8.2

Choose a tag to compare

@github-actions github-actions released this 30 Jun 04:51
e286595

3.8.2 (2026-06-30)

Bug Fixes

  • cli: cap update download at 256 MiB to prevent disk exhaustion (#1980) (2b14809)
  • cli: redact home directory from C compiler path in ez report (#1983) (26eeeb0)
  • cli: reject path traversal sequences in ez pz project name (#1979) (badd948)
  • cli: remove unsupported sized integer/float types from ez man docs (#1976) (f660865)
  • cli: restrict update download URLs to trusted GitHub release origin (#1978) (599f8c2)
  • codegen: cast dividend to int64_t in div/mod overflow check to silence Wtautological-constant-out-of-range-compare (2b753be)
  • codegen: cast of negative float to uint/u64 now panics with P0091 (#1964) (37f4d51)
  • codegen: emit T * const for const pointer variables, not const T * (#1937) (381b662)
  • codegen: fixed-size array [T, N] with partial init now has length N (#1965) (9810873)
  • codegen: map compound assignment now reads existing value before applying op (#1971) (c19d6e8)
  • codegen: promote integer literals to double in [float]/[f32]/[f64] array literals (#1963) (c4c39b8)
  • codegen: string(Error) now returns the error message instead of leaking C error (#1977) (72d3f2d)
  • consolidate reserved name lists into shared reserved.h (#1954) (a42a410)
  • leaks: print clear PASS/FAIL summary at end of make leaks output (#1975) (141b947)
  • lexer: catch physical newline in string literal as E1023 (#1959) (683203b)
  • parser: accept complex types in multi-return destructuring positions 2+ (#1962) (a2b0454)
  • parser: emit E2086 when in/not_in/!in has no left-hand value (#1960) (de90608)
  • parser: support blank identifier _ as for loop variable in range iteration (#1972) (3dc99b3)
  • runtime: drain overlong input() lines to prevent stdin contamination (#1981) (0576927)
  • runtime: use pre-addition overflow check in ez_string_concat to eliminate signed UB (#1984) (c1af77d)
  • scripts: handle escaped quotes in error message extraction (790e2cf)
  • typechecker: allow range(n, n) as empty sequence per spec start <= end (#1969) (f4683f9)
  • typechecker: reject == / != on tagged enums with E3124 (#1967) (ce02e3e)
  • typechecker: reject for_each with both positions as _ with E3123 (#1966) (7bda22b)
  • typechecker: reject tagged enum passed to print functions with E5038 (#1968) (d83c720)
  • typechecker: replace misleading 'only structs' phrasing in E3013 messages (b0d1695)

Performance Improvements

  • codegen: collapse buf_append_indent loop into a single buf_appendn call (#1953) (b27f4ed)
  • codegen: eliminate double vsnprintf in emitf for short emissions (#1952) (aaa214d)
  • codegen: replace linear scan in is_c_keyword with bsearch (#1956) (d2ac0a2)
  • error: add cached error/warning counters to DiagnosticList (#1943) (b7ac109)
  • error: build line-offset index in diag_set_source (#1942) (e0c5a5a)
  • error: replace single-file source cache with 4-slot LRU cache (#1947) (48ee72e)
  • imports: limit rewrite_labels outer pass to original main-program nodes (#1946) (22b8643)
  • imports: replace O(n) import-seen scan with FNV-1a open-addressing hash set (#1951) (8f5f9e2)
  • imports: replace while+rescan with a pending import queue (#1945) (b073b80)
  • scan: replace bubble sort in scan_ez_files with qsort (#1944) (1946c88)
  • typechecker: replace O(n) scans in display name and enum helpers with bsearch (#1948) (ea19b7c)
  • typechecker: replace O(n) scans in fallible stdlib lookups with bsearch (#1949) (521246d)
  • typechecker: sort stdlib lookup tables in typechecker_create (#1955) (b54a2f6)
  • typechecker: use stack buffer in levenshtein to avoid malloc on every call (#1950) (75f9ed4)