Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
## V 0.5.2

*12 Jul 2026*

#### Improvements in the language
- Implement @[soa] struct attribute for Structure of Arrays transformation (#26738)
- Initial version of ownership via -ownership. All logic is behind comptime, so it won't have
  any speed/size impact on normal V (#26852)
- VGC, a concurrent tri-color mark-and-sweep GC translated from Go (#26739)
- ios and macos modules that allow writing code without Objective C
- Optional error parameter for closing channel (fixes #19203)
- Allow negative indexing of array like `arr#[-1]` (fixes #24066)
- Add power operator `**` (fixes #24067)
- BusyBox shebang #!/usr/bin/env -S v run (fixes #26820)
- Add ability to view code coverage output in editor (fixes #24416)
- Add new standard module: mcp (Model Context Protocol integration) (fixes #25694)
- Add operator overloading for `[]` (fixes #23177)
- vweb removed entirely (it was deprecated and replaced with veb a while ago)
- Comptime $if bsd (#26983)

#### V interpreter
- v2 eval backend (#27528)

#### Breaking changes

#### Checker improvements/fixes
- Allows you to pass a numeric value to JS.Number without a cast (fixes #24677)
- Add self-comparison and always true/false branch warnings (fixes #23404)
- Fix byte/u8 array param type checking and var-fn name clash (fixes #26492)
- Skip ref field init check when default expr exists (fixes #25213)
- Add error test for Result type in struct init fields (fixes #18210)
- Support smartcasting on index expressions (fixes #26550)
- Fix embedded struct member visibility (fixes #13607)
- Fix enum variant equality test is not commutative (fixes #10331)
- Fix implementing a generic interface using a concrete type does not compile (fixes #24060)
- Fix local variable with module before should give a compiler error (fixes #10658)
- Fix compiler omits to define struct method used in generic function (fixes #26419)
- Fix cannot sort 2d array (fixes #23892)
- Fix i64 transfer to f64 should be explicit (fixes #14934)
- Fix "Builder Error" when defining field `gg gg.Context = unsafe {nil}` not as a pointer (fixes
  #15201)
- Fix aliased pointers not recognized (fixes #24621)
- Change array initialization syntax (fixes #7061)
- Fix confusing error message when test file gets an invalid name (fixes #15642)
- Fix arrays.sum([]) or {panic(err)} produces misleading error message (fixes #22859)
- Added support for hover function declaration (#26789)
- Fix orm compiler crash (fixes #18269)
- Fix multiple bugs related to alias + reference (fixes #24010)
- Fix [params] struct visibility error location (fixes #16389)
- Fix immutability of variable may be broken (fixes #17135)
- Fix arithmetic operator overloading result type (fixes #23194)
- Fix type-casting issue with generic function as argument (fixes #21132)
- Fix cannot use &int as &&int in argument (fixes #23019)
- Fix implicit cast inconsistency (fixes #26759)
- Fix using sum type or interface for os.file.write_struct (fixes #19117)
- Match on mutable sumtype doesn't compile (fixes #16506)
- Custom error without `IError()` crashes V (fixes #16921)
- Cannot return a function from a generic function (fixes #22011)
- Unexpected sizeof() result on union (fixes #23141)
- Array returned by function bypasses illegal sumtype conversion checker error (fixes #23271)
- Duplicate case value (fixes #25240)
- SIGSEGV termination with os write_struct() and read_struct() when in separate v files (fixes
  #11285)
- Generics not passed to arguments when argument has a struct with generic (fixes #24318)
- Generics compile failure (fixes #24471)
- Immutable instance of a struct can be modified via interface (fixes #23509)
- Should report `unused parameter` in function parameters (fixes #26213)
- Passing a function to a function as a parameter does not work (fixes #22008)
- Error behavior in array of sumtype has array subtype (fixes #26363)
- Builder error "This should never happen" (fixes #12434)
- Match []u8 gives &[]u8 (fixes #24054)
- Unresolved variable in `defer` (fixes #17309)
- C compilation error with shared struct (fixes #25160)
- Error casting aliases to generic types (fixes #13863)
- Map key type `time.Time` not supported (datatypes.Set[time.Time]) (fixes #25013)
- Field does not exist with embedded structure and sumtype variants (fixes #11290)
- Specific array initialisation fails (fixes #14261)
- Some bug with comptime (fixes #26234)
- Creating array as value of map must be explicit when using `<<` (fixes #18160)
- V compiler bug: error when casting a generic function intricated in a generic type used in a
  generic sum type (fixes #25930)
- Cannot convert 'struct _option_string' to 'unsigned char *' (fixes #26347)
- Shared work on primitive types (fixes #25611)
- V sometimes thinks 1 == &1 (hidden dereferencing that shouldn't be there?) (fixes #11543)
- Wrong type is inferred in generic (fixes #19036)
- Invalid memory access with array of empty interface return type (fixes #24864)
- Fix generic type mismatch with generic functions from multiple sources (fixes #25217)
- Fix veb c compilation error when context not mutable (fixes #25361)
- Fix inline array index assignment with literals (fixes #9691)
- Fix c binding compiling to wrong c intermediary (fixes #19046)
- Fix cannot use $if/$else to set value of enum (fixes #23336)
- Fix return error() in match (fixes #16387)
- Fix cannot implement empty interface with different interface (fixes #24193)
- Fix select chan timeout (fixes #15269)
- Fix null pointer constructed and dereferenced in safe code (fixes #20497)
- Fix compiler bug when running tests (fixes #18121)
- Fix cannot match generic type in generic function (fixes #24648)
- Fix implicitly-added str method not available to interfaces (fixes #24791)
- Fix passing function as argument to vec.mul_scalar (fixes #25829)
- Support flag_var bitwise_operator= .enum_flag (fixes #20940)
- Fix duplicate case value for match with u8 and int (fixes #26627)
- Fix sumtype else branch of if !is should consider smartcast (fixes #13587)
- Fix referenced operator overloading not working (fixes #15551)
- Fix clang build generic issue (fixes #15285)
- Fix incorrect memory access with generics passing array (fixes #26587)
- Fix c compile error with ui.window.on_resize (fixes #13339)
- Fix passing normal array to array of interface type (fixes #18920)
- Fix enum values set with constants from $if/$else (fixes #23348)
- Fix array of variant not accepted for array of sumtype (fixes #24140)
- Fix arbitrary pointers in safe code (fixes #25247)
- Fix builder error when using function types from a module (fixes #18853)
- Fix broken operator overloading for aliased arrays (fixes #23213)
- Fix veb closure middleware generic inference error (fixes #23868)
- Fix guards being ignored (fixes #24401)
- Fix c error printing reference of a non-integer variable (fixes #23461)
- Fix cannot return struct implementing interface with return match (fixes #24148)
- Fix dereference of T after $if T is $pointer (fixes #25619)
- Fix error compiling a type alias with match (fixes #13860)
- Fix clang build error with if expr in or block (fixes #15214)
- Fix error message for missing import or block path (fixes #21533)
- Fix c structs pub inconsistency (fixes #22293)
- Fix pub field of private struct accessible outside module (fixes #26625)
- Fix generics relying on symbol declaration order (fixes #24678)
- Fix undeclared c constant not being checked (fixes #15893)
- Fix implementing generic function for generic function type (fixes #18037)
- Add declaration errors for unused functions and constants (fixes #19079)
- Fix int <-> u8 promotions (fixes #25936)
- Fix optional value in maps not allowed (fixes #26235)
- Fix type-casting issue when providing generic function as argument (fixes #21132)
- Fix consecutive asserts ignoring previous (fixes #24194)
- Unknown type for json.decode with nested generics (fixes #22220)
- Mutating immutable variable (fixes #21080)
- Error handling, compile error (fixes #20980)
- V error not allowing locking of element in array of shared structs (fixes #23449)
- Cgen, checker: pointer in generic function (fixes #22791)
- Support smart casting receiver var (fixes #24670)
- Test vlib/v/tests/aliases/modules/value/value_test.v failed in a single file (fixes #26103)
- Misleading or wrong error message in UTF-8 byte sequence verification (fixes #25874)
- Compiler accepts &int as a key for map[int]int (fixes #23069)
- Incorrect error message when importing modules indirectly (fixes #16271)
- Asm bad operand with opcode error (fixes #10708)
- Mutability breaks encapsulation principle (fixes #24719)
- Passing interface to generic function result in C error. (fixes #18320)
- Error when using options fields (fixes #18333)
- Add support for generic struct params (fixes #24191)
- Cross compiling for windows on Linux Mint, openssh issue (fixes #13978)
- Comparing interface with struct instance gives c error: invalid operand types for binary
  operation, invalid aggregate type for register load (fixes #24018)
- Maps with non-generic interfaces as values don't work (fixes #16576)
- Types should be interchangable if they have the same structure (fixes #26190)
- Segmentation fault when trying to use an array return type for a pool_processor callback (fixes
  #21543)
- Fix cannot use `[]Data` as `[]Cols` even though `Data` implements `Cols` (fixes #23666)
- Fix type inference with generic structs and generic interfaces (fixes #19618)
- Fix cannot convert struct to struct pointer in generics (fixes #21835)
- Do not force the declaration of unused callback params (fixes #24460)
- Fix empty interface array push with fixed array c error (fixes #23011)
- Implement syntax change for fixed arrays (fixes #25183)
- Fix enum taking function as init value when cast to int (fixes #25908)
- Fix mut smartcasts not working correctly (fixes #17440)
- Fix TCP server socket file descriptor corruption when using GC (fixes #18263)
- Fix anonymous generic struct shadow variable (fixes #15535)
- Fix using only C functions from a module making it appear unused (fixes #26232)
- Fix wrong error when smartcasting references to sumtypes (fixes #17236)
- Fix wrong alias management in generic methods (fixes #24012)
- Fix checker error for veb handler param type (fixes #24870)
- Fix nested `if` expression causing compilation error (fixes #26865)
- Fix smart casting on array's element (fixes #14766)
- Fix simple generic structure declaration error (fixes #21989)
- Fix missing compile time error for option selector in or block (fixes #17761)
- Fix wrong alias management in generic methods (fixes #24011)
- Fix compiler bug with bound mut ref callback (fixes #14741)
- Fix invalid utf8 string warning in character literal (fixes #23741)
- Fix silent conversion of u64 to f64 (fixes #21778)
- Fix wrong check error when using `mut` + `interface` in function parameter (fixes #26159)
- Add @[nocopy] attribute to prevent struct value copying (fixes #26721)
- Fix type promotion not working with bitwise operators (fixes #9943)
- Fix error for same function signature passed as argument (fixes #13965)
- Fix private C definition causing compile error if importing `os` earlier than others (fixes
  #15811)
- Fix cannot assign to `*val` with StructTypePointer (fixes #23020)
- Fix vdoc failing to compile on macOS Sequoia (fixes #26698)
- Fix .str() method inconsistent behavior (fixes #25825)
- Fix failed type inference for fold with lambda expression (fixes #25934)
- Prevent mutation of a function result which should be immutable (fixes #13817)
- Fix infix arithmetic on explicit struct pointers (#26810)
- Fix cgen error redefinition of type (fixes #26884)
- Delete the default zero value in v (fixes #23940)
- Fix returning private struct from public function works without noinit (fixes #18427)
- Fix setting variable through generic function to any{} field (fixes #19010)
- Fix generic function with generic sumtype compile error (fixes #25248)
- Fix getting index of an array with ref arg (fixes #17800)
- Fix checker checks wrapped generic type while cgen uses incorrect type (fixes #20664)
- Support passing generic types to orm select (fixes #24041)
- Fix option smartcast after non-option assignment (fixes #23611)
- Fix stacking multiple types producing error in match smartcast (fixes #25418)
- Fix c error when reference field improperly initialized (fixes #25980)
- Fix implements keyword not working with generics (fixes #22629)
- Fix ice when sorting an array of functions (fixes #10739)
- Support $for variant in field.typ.variants for sumtype fields (fixes #26902)
- Fix return 0; throwing unreachable code error (fixes #26916)
- Fix named function type embedding (fixes #26918)
- Fix !-propagating call to always-erroring function still requires placeholder return (fixes
  #26895)
- Fix mutable pointer parameters under certain circumstances (fixes #24408)
- Allow c declarations imported from an external module to be used for casting (fixes #26192)
- Fix assert expression with -(-2) or +2 sub expression (fixes #26815)
- Fix unhandled exception on map with anon fn value (fixes #23522)
- Fix ?&t cannot be compared to nil in comptime indirections branch (fixes #26893)
- Fix passing fixed array [n]t to generic function expecting []t (fixes #26899)
- Fix int values incorrectly promoted to f32 (fixes #7692)
- Fix Compilation crash on OpenBSD since commit ee64e96 (fixes #26930)
- Fix cgen error when using `sdl.Window` as non-ref type for struct field (fixes #23042)
- Fix app timeouts once "before_request" middleware is registered. (fixes #24782)
- Fix Compiler doesn't catch type mismatch with `int` and `time.Duration` (fixes #18873)
- Fix Regression: V can't match generics variant (fixes #26866)
- Fix Modifying an immutable pointer indirectly is allowed (fixes #12899)
- Fix arrays in maps should be inferred based on the first value in the map (fixes #19253)
- Fix Error in return `none` from or block inside `match` (fixes #17422)
- Fix Generic method unable to implement an interface with a different interface passed as argument
  (fixes #20670)
- Fix empty `[noreturn]` function (fixes #18018)
- $if (int(typeof(val).idx) >> 16) & 0xff == 0 {  (fixes #20398)
- [ ';' expected (got "MessageError") ] (fixes #13484)
- Err fix (fixes #26975)
- Generics fix (fixes #27032)
- Validate or-block defaults before outer casts (#27059)
- Overwrite stale unresolved fixed-array sym for struct fields (fix #27078) (#27081)
- Update fixture outputs (#27155)
- Report unwrapped option in infix arithmetic (fix #27082) (#27225)
- Allow `C.S{}` zero-init for C structs with reference fields (fix #27170) (#27228)
- Explain smartcast narrowing in `or {}`/`?` error on unwrapped option (fix #27130) (#27238)
- Warn when a local variable shadows a function declaration (fixes #22685) (#27272)
- Accept `[]Alias` ↔ `Tokens` payload equivalence (fix #27006) (#27278)
- Fix static method used as `map`/`filter` argument (#27328) (#27331)
- Fix cgen 'pointer expected' for loop-local var passed to variadic interface arg (#27327)
- Fix return if fn multi-return (#27347)
- Improve missing C function diagnostics (#27414)
- Reject optional array args for plain arrays (#27425)
- Require common fields for match aggregates (#27428)
- Infer generic fn values from call args (#27426)
- Reject pointer targets in json.decode (#27427)
- Infer generic fn values from call args (#27432)
- Fix spawn-in-if/match-expr, zero-alloc error sentinel, cheaper slice marking, scalable GC (#27544)
- Reject multi-return elements that disagree on option-ness (fix #27562) (#27565)
- Register nested generic str deps (#27442)
- Reject address of bound method values (#27657)
- Reject `&` reference of fixed array alias (fix #27646) (#27661)
- Require mutable array for reverse_in_place (#27743)

#### Parser improvements
- Fix array init with parenthesized optional elem type (fixes #16515)
- Support `.to_fixed_size()` method on array literals (fixes #22849)
- Fix function body `{` error message is not correct (fixes #16133)
- Fix wrong error when declaring attribute after incomplete variable declaration (fixes #23396)
- Fix compiler does not infer field type and raise inappropriate error when initializing struct
  (fixes #14762)
- Fix referring map entries in template files (fixes #12091)
- Fix vweb.html() converts at characters in links of template file to dollar characters (fixes
  #14104)
- Fix thread variable in struct causing inconsistent expecting type declaration error (fixes #25330)
- Fix function argument commas (fixes #20526)
- New syntax for attributes (fixes #25502)
- Fix c functions do not warn for param named interface (fixes #25859)
- Fix incorrect error message for badly constructed struct (fixes #25380)
- Avoid closure auto import for field names (#26808)
- Generic interface methods expect old syntax (fixes #25087)
- V doesn't ignore variables in HTML comment template (fixes #12171)
- Template allows $ instead of @ (fixes #14788)
- Add support for optional parameters in function declarations (fixes #24910)
- Error: ';' expected (got "main__V4") (fixes #26422)
- `foo := bar` ; `foo[2..]` works but `bar[2..]` don't (fixes #14339)
- Failed to compile: Reference to a function prefixed with a type name is expected to be an enum
  (fixes #26414)
- Fix for loop not working in $tmpl templates (fixes #23447)
- Move error/warning messages from parser to checker (fixes #26097)
- Fix initializing fn field with matching fn function with ref params (fixes #16291)
- Fix inconsistent compiler bug with type resolution (fixes #25701)
- Fix $tmpl not locating template file for composed paths (fixes #24752)
- Fix chained methods not parsing correctly when . is separated from name (fixes #23258)
- Fix defer not being executed in compiler code (fixes #14438)
- Fix line indication for channel push syntax error (fixes #23571)
- Fix initializing anonymous struct (fixes #16207)
- Module function name conflict to keyword/type (fixes #23173)
- Import : warning err (fixes #24110)
- All fields within a structure param should be public by default (fixes #24234)
- Allow to omit commas in multiline function signature block (fixes #22021)
- Vfmt "breaks" invalid code with map of `[]u8` with `cap:` instead of giving error (fixes #24055)
- Generic closure that returns multi return with array generic type does not work (fixes #17876)
- Fix inaccurate error message in match expressions (fixes #13669)
- Allow using orm as a value in `if` expressions (fixes #23680)
- Fix vdoc panic with invalid type when generating docs (fixes #26348)
- Allow getting element by index or propagating an error to the caller (fixes #23452)
- Fix errors using conditionals in vweb templates (fixes #19475)
- Fix assert without comma but with message confusion with vfmt (fixes #25005)
- Add `$` compile-time code on root/module level (fixes #20420)
- Fix comptime $else { import log } error when in one line (fixes #26527)
- Fix assignment error with recursive definition in sum types (fixes #14160)
- Fix as cast cannot cast v.ast.unknowntypeinfo to v.ast.array (fixes #23704)
- Add inline syntax to construct []t from a [n]t element type at comptime (fixes #26898)
- Add inline syntax to allocate a fresh pointer of comptime-discovered field type (fixes #26897)
- Fix calling function wrapped in a parexpr (fixes #22652)
- Fix `$tmpl` error message improvement (fixes #16127)
- Fix Failed to compile `mut threads := [4]thread (int64, int){}` with multiple values (fixes
  #26795)
- Fix Receiver methods only work when top declared (fixes #7280)
- Fix support explicit asc keyword in order by clause for select (fixes #26951)
- Fix segfault in orm `where` expression check when left side is an Ident (#26989)
- Fix and test for list of generic bug (#27141)
- Allow short positional struct init in for-in array literal (fix #27146) (#27217)
- Count duplicate sumtype fields once (#27253)
- Fix @@ escape before complex at-expressions in templates (#27701)

#### Compiler internals
- optimize v3 ownership checking (#27708)
- reflection: rework attrs handling (fixes #21537)
- Fix native printing of runes, fixes native_test.v and CI failure (#26881)
- Fix dump native error (fixes #24610)
- Fix unhandled os ifdef name "x32" (fixes #20024)
- util: qualify modules relative to compilation project root (fix #27138) (#27219)
- v/v2: support array update/spread syntax `[...base, e1, e2]` (#22834) (#27261)
- gen: avoid heap allocation for empty `.attrs`/`.attributes`/`.args` in $for (fix #27274) (#27276)
- compiler: walk mut interface dispatch dependencies (#27430)
- compiler: fix generic sumtype aliases and duplicate imports (#27523)
- gc: add boehm thread-local alloc opt-out (#27572)
- compiler: fix invalid UTF-8 and ternary codegen (#27636)
- compiler: fix ownership translation and C backend blockers (#27644)
- vlib,builder,v3: add i18n and fix shared builds (#27721)
- builder: fix dynamic library loading and cc improvements (fixes #16899)
- builder: detect C++ headers included in C compilation (fixes #20634)
- builder: add Cosmopolitan/APE support for cross compiled bins (fixes #20992)
- builder: fix can't use eval in shared library compiled with tcc (fixes #24586)
- builder: fix compilation fails with bad architecture warning (fixes #14330)
- v.util: simplify the use of local modules and submodules (fixes #26025)
- v.util: fix module register being called twice with v.mod (fixes #26001)
- v.util: fix lookup fails for nested modules (fixes #14715)
- pref: allow path without filename for -o/-output flag (fixes #21766)
- builder: using structures defined in C header file leads to compilation error (fixes #19050)
- builder: "v run src" and "v run ./scr" behaves differently (fixes #24205)
- v.util: compilation error if theres "-" in path to executed file (fixes #17764)
- v.util: compiling with tcc breaks v doc (fixes #13420)
- builder: unused import (fixes #21606)
- markused: C compilation error when indexing a string, in a method, on a generic struct (fixes
  #26421)
- pref: fail : `v -o v2 -usecache cmd/v -gc boehm_full` (fixes #24980)
- builder: addr2line: 'v': No such file, instead of meaningful output, when build fails due to
  internal bug (fixes #20768)
- checker,pref: implement hover method for vls (#26821)
- builder: fix compiler bug error (fixes #25499)
- builder: fix compiler not found but still working (fixes #25949)
- markused: fix extra code in generated c code (fixes #26019)
- builder: fix libatomic detection to make v doc work on CentOS 8 (fixes #11949)
- builder: fix hot reload on mac thinking single implementation is duplicated (fixes #12235)
- builder: fix module resolution depending on working directory (fixes #22038)
- builder: fix linking failure with -cc gcc -parallel-cc (fixes #23209)
- builder: fix sibling module imports (fixes #21498)
- pref: fix undefined reference to tcc_backtrace when linking (fixes #23198)
- transformer: fix different test results with and without -prod (fixes #26568)
- pref: fix segfault when using gc on musl-based system (fixes #14737)
- builder: fix cannot use submodules defined inside src folder (fixes #15374)
- scanner: v parser should provide more accurate error msg (fixes #25309)
- builder: Default msvc produces slower and less optimized output than when explicitly flagging with
  -cc msvc (fixes #17729)
- builder: Add a .ico or .png to the .exe file in vlang? (fixes #19211)
- builder: v allows pass to -cc any compiler name and ignores if it is not found (fixes #17126)
- builder: fix wrong import check error for module (fixes #25999)
- builder: fix bad module definition in `.vmodules` (fixes #12292)
- builder: fix compiler bug when using imgui (fixes #12362)
- pref: fix setstacksize test failure across bit widths (fixes #24394)
- builder: fix unable to run v files with obscure filenames (fixes #19013)
- scanner: fix '$str' resulting in string interpolation/compilation error (fixes #26382)
- builder: fix crun not rebuilding c source (fixes #26876)
- scanner: fix wrong error message when identifier name starts with a number (fixes #14560)
- builder: fix module builder error (fixes #20147)
- pref: fix v -prof not working (fixes #24163)
- builder: add setting to specify sub directories as part of the same module (fixes #19902)
- builder: add a "base url" to v.mod to resolve module names (fixes #24223)
- builder: fix sdl2 creating window failure (fixes #13138)
- builder: fix default compiler cc not detected during compilation (fixes #22240)
- builder: fix building v on Debian 32-bit systems (fixes #15447)
- builder: fix error building graphic app webview due to cflags (fixes #12445)
- builder: fix c error that should never happen during tcc retry (fixes #15191)
- builder: add statically compiled tiny_gcc support (fixes #21576)
- builder: fix c error semicolon expected (fixes #25384)
- builder: fix import vsl.la failing (fixes #17389)
- markused: fix deducing generic type k from internal generic chain (fixes #22494)
- builder: fix difference in process arguments (fixes #25031)
- markused: fix segmentation fault during generic fn instantiation pruning (fixes #26928)
- builder: fix msvc builder error preventing v from running (fixes #19851)
- builder: fix cross compilation with shared argument fails (fixes #17608)
- builder: fix when using `v run <file>` in a path containing spaces i get "%1 is not a valid Win32
  application" (fixes #16501)
- builder: fix Error when using duarteroso.glfw (fixes #23648)
- pref: fix Add bsd environment specific file support (fixes #26755)
- builder: fix Confusion between v modules and subdirectories (fixes #17232)
- v.util: fix unknown function: cli004.sub.greetings (fixes #26828)
- pref: fix Bananas compile time with termux (fixes #22671)
- builder: fix V compiler has become significantly slower (fixes #26961)
- builder: fix Aliasing of a C Struct not working unless by adding a typedef attribute (fixes
  #17101)
- pref: fix build failed with msvc 2022 (fixes #14784)
- pref: fix invalid option -- '-bt25' (fixes #18199)
- markused: fix generics (fixes #26979)
- pref: Add arm64 and x64 to backend message (#27023)
- builder: fix TCC compiler integration for parallel compilation (#27033)
- builder: add Macports legacy software options (#26691)
- builder: default to hidden symbol visibility for -shared (fix #27167) (#27216)
- pref: re-enable boehm GC by default for musl (fix #27090) (#27220)
- markused: keep generic `next` for `for in` over instantiated iterators (fix #27147) (#27221)
- builder: skip foreign v.mod project dirs when resolving imports (fix #27151) (#27231)
- scanner: fix out-of-bounds read for \x, \u, \U escapes truncated at EOF (#27212)
- builder: submit C compiler error reports (#27279)
- builder: use bugs.vlang.io for C error reports (#27298)
- builder: skip C error reports in GitHub CI (#27308)
- builder: skip bug reports for missing C libraries (#27317)
- builder: send the V source line that caused a C error in bug reports (#27332)
- builder: fix resolving symlinked modules nested in a .vmodules namespace (#27391) (#27502)
- markused: fix generic fn instantiation dedup key collision for identical module names (#27399)
- markused: mark mut-receiver interface implementors (fix skip-unused dropping anon fn) (#27380)
- builder: cover libbacktrace with tcc (#27588)
- markused: fix undeclared C identifier for alias array type (#27660)
- builder: fix bundled TCC TLS fallback and stdatomic collision (#27740)

#### Standard library
- Un-private `datatypes.Set.elements` (#26710)
- x: fix It is recommended that vlang provide a data analysis tool library similar to Python
  Pandas (fixes #19355)
- Add an AES-GCM support into the `aes` module (#27484)
- archive: add tar library (fixes #1180)
- compress: fix compilation fails because of multiple includes of same .h (fixes #18378)
- maps: compilation error when using `.to_array()` with a map whose value type is an interface
  (fixes #26567)
- term.ui: fix mouse text marking for copy/paste (fixes #16191)
- yaml: [RFE] Add a YAML Module (fixes #708)
- x.markdown: add pure V markdown module (#26925)
- mcp: implement mcp server-side protocol (fixes #26917)
- encoding: fix xml module unhandled exception crashing the program (fixes #26164)
- snappy: add snappy compression (#26914)
- yaml: split module, raise conformance and performance (#27021)
- dtm2: introduce parsed runtime template manager (#27011)
- strings: fix edge case for 1 byte strings for jaro similarity (#27042)
- compress: add pure V bzip2 module (#27107)
- Context improvements (#27110)
- x.markdown: UTF-8 handling and plaintext render (#27115)
- compress: add newest compression types to README (#27126)
- compress: add pure V lz, supporting multiple variations (#27137)
- compress: make vlib/compress/lz/interop/lz77_ref.py pass on older Python versions too (Python
  3.8.10) (#27143)
- lz: add lzma2 variation (#27145)
- hash.crc32: add crc32c, crc32k, and crc32q variants (#27149)
- compress.deflate: changed to pure V RFC-compliant code (#27156)
- mcp: align with the 2025-11-25 spec (#27133)
- term.ui: use CSI ?2026 h/l for synchronized updates (fix #27136) (#27218)
- compress.zlib: changed to pure V RFC-compliant code (#27263)
- compress.gzip: use deflate for RFC compliance (#27320)
- hash.huffman: add shared canonical Huffman builder; migrate HPACK to it (#27392)
- compress.deflate: build Huffman trees via the shared hash.huffman builder (#27394)
- executor: add owner-thread executor module (#27540)
- strings: add Builder.write_u_decimal and write_decimal JS-backend parity (#27522)
- compress: fix deflate leaks and add brotli (#27613)
- image: add Go-inspired core image module (#27647)
- io: fix buffered writer flush and write loop (fixes #21975)
- gg: support translucent background colors with alpha blending (fixes #15755)
- io: fix stream_reader read function does not work (fixes #21768)
- strconv: fix common_parse_int not giving result when needed (fixes #17031)
- json: fix decode transforms empty objects to empty strings (fixes #19791)
- os: fix V should stop assuming characteristics of a system (fixes #17502)
- json2: fix json2.decode silently drops decoding all map values other than string (fixes #18734)
- strconv: fix compile error value `100000000000` overflows `u32` (fixes #20877)
- time: fix unexpected freestanding error (fixes #15777)
- builtin: fix execinfo.h is not available on musl (fixes #2397)
- json2: fix decoder2 can't decode an array of sumtypes (fixes #25262)
- builtin: fix closure support for s390x/riscv64/ppc/ppc64/mips/riscv32/sparc64 (fixes #18737)
- json2: fix alias type of json2.Any can't decode json used as generic (fixes #24127)
- regex: fix module ignores ^ and $ (fixes #22119)
- time: fix parse_format breaks under -autofree (fixes #21369)
- builtin: fix error when matching literal '*' using match_glob (fixes #22867)
- builtin: fix undefined symbol and clang failure for musl (fixes #24866)
- sync: fix inconsistent doc for chan try_pop (fixes #18231)
- pref: fix no file paths for flag.new_flag_parser(os.args).string() possible (fixes #19996)
- builtin: fix VUI components not removable from stack like other widgets (fixes #25066)
- thirdparty,sokol: handle xdg_wm_base ping/pong events (#26717)
- x.crypto.mldsa: add ML-DSA signature algorithm (#26711)
- sokol: add explicit casts for g++ compatability (#26744)
- crypto.blake2b: use fixed arrays for block manipulations (#26751)
- crypto.blake2s: use fixed arrays for block manipulations (#26750)
- crypto.blake3: use fixed arrays for block manipulation (#26754)
- crypto.rand: do not go beyond the buffer boundaries (#26764)
- crypto.cipher: copy to next only after encryption in OFB mode (#26765)
- builtin: set @markused for vgc_memdup_typed() (#26783)
- tmpl: stop ignoring tmpl test fixtures (#26800)
- json2: fix iterative json parser (fixes #8986)
- pref: fix cannot register struct os.file with -b wasm (fixes #17786)
- json: fix encoding an array of references (fixes #25266)
- regex: fix matching failure (fixes #16880)
- math.fractions: use bignum (bigint) in fractions (fixes #19089)
- builtin: fix string.is_upper() issue (fixes #25560)
- toml: fix nested tables array parsing issue (fixes #26747)
- strconv: fix string interpolation with large float format (fixes #23359)
- builtin: fix string interpolation by format function (fixes #24338)
- sokol.sgl: fix limit in the pixels amount that can be drawn (fixes #14163)
- gg: fix gui program cpu consumption is too high (fixes #14691)
- thirdparty: update libbacktrace from libbacktrace project (fixes #22268)
- math: add the decimal library (fixes #25010)
- sync.pool: fix v hangs with parallel http.fetch commands (fixes #10148)
- time: fix new_time() allows completely invalid time struct (fixes #17395)
- docs: fix os.walk() cannot update mut array passed to closure (fixes #23166)
- json2: fix decoding embedded structs with references (fixes #24950)
- thirdparty.mbedtls: upgrade to v3.6.6 (#26803)
- json: unable to decode struct with Sumtype. "unknown sum type value" (fixes #15081)
- math: decimal data type (fixes #21754)
- builtin: array.get (fixes #22837)
- strconv.atoi64: parsing "1.7596215426069998e+12": invalid radix 10 character (fixes #26420)
- builtin: is wyhash broken (fixes #26651)
- os: `process.stdout_read()` blocks execution (fixes #16598)
- builtin: alias reference test fails (fixes #25101)
- json: output of json encode/decode of structs containing f64 arrays is not equivalent to the input
  (fixes #22860)
- gg: Copy gg.Event results in runtime memory access error (fixes #24157)
- io: `BufferedReader.read` returns `io.NotExpected: invalid copy of buffer` (fixes #24291)
- json: encodes differently unicode strings yet decoded well (fixes #25103)
- builtin: fil-C complains about the test map_generic_call_test.v (fixes #25757)
- thirdparty: ./thirdparty/stdatomic/nix/atomic.h:12:23: fatal error: stdatomic.h: No such file or
  directory  #include <stdatomic.h> compilation terminated. GNUmakefile:93: recipe for target 'all'
  failed (fixes #12911)
- json2: features required for complete generic json implementation (fixes #25218)
- builtin: optimized path for concatenting integers into strings (fixes #26703)
- builtin: VUI Menu Can Not Be Removed From The Stack or Switched Like Other Widgets (fixes #24135)
- os: just installed Vlang on system and when running program it's shows failed createprocess:%1 is
  not valid win32 application (fixes #14579)
- os: year-2038 problem (fixes #26664)
- crypto: add ML-DSA algorithm (fixes #26683)
- builtin: fix strings builder bug with -cg (fixes #13613)
- stbi: fix bad function parameter name (fixes #21044)
- strconv: fix v_sprintf variadic voidptr rvalue (fixes #23767)
- os: fix process module reading stdout/stderr correctly (fixes #20123)
- json2: fix decode with skipped fixed array field in union (fixes #25607)
- gg: implement context.resize() (fixes #24013)
- gg: add option to remove window decoration/frame/border (fixes #25696)
- json: fix decode() segfault on recursive struct with ?&t (fixes #26385)
- time: fix elapsed time occasionally printing 0ns (fixes #18132)
- json2: fix raw_decode failing to parse valid json content with escapes (fixes #23884)
- json: fix inconsistent serialization/deserialization for u64 (fixes #25605)
- time: fix format deprecations (fixes #26302)
- json: fix json and json2 sumtype decode issues (fixes #16477)
- json2: fix c error when using both json2.decode[json2.Any] and json2.encode (fixes #24128)
- builtin: fix map memory management (fixes #24835)
- gg: improve error message for missing assets (fixes #14501)
- encoding.binary: add stream reader/writer (fixes #19037)
- regex: add case-insensitive matching support (fixes #24664)
- sync: fix reading from a closed channel (fixes #24679)
- os: fix error reading input from shell pipe (fixes #24701)
- json2: fix decoder cannot convert float to u64 (fixes #25426)
- os.filelock: fix unreliable locking for existing files (fixes #12059)
- gg: fix draw_rect_empty drawing ugly rectangle (fixes #14491)
- json: fix no error message given when [raw] fails (fixes #19801)
- builtin: fix stdout to be line buffered (fixes #21001)
- builtin: add support for splitting strings into unicode grapheme clusters (fixes #22117)
- builtin: fix free() not releasing memory on maps, arrays, strings (fixes #17416)
- io.fs: add standard library (fixes #24689)
- gg: fix preferred swap interval ignored on some platforms (fixes #20681)
- json2: fix decoding embedded structs (fixes #23354)
- time: Performance Issues with time.now? (fixes #19554)
- builder: sokol: shader v compiler error (fixes #21426)
- gg: gg.update_pixel_data() empty buffer still draws (fixes #10989)
- builtin: a.delete(a.len - 1) runs very inefficiently. Causes segmentation fault on armv7 (router)
  (fixes #11150)
- toml: cannot decode array of tables (fixes #22633)
- json2: x.json2 can't encode struct with shared data (fixes #25610)
- crypto: Tests fail for vlib/x/crypto/mldsa/usage_test.v (fixes #26827)
- sync: OS's behave differently in runtime concurrency locks (fixes #19376)
- crypto: argon2 (fixes #24389)
- gg: Image loading with stbi+gfx not working properly (Throwing unhandled exception) (fixes #16670)
- json: Possible bad transcription of struct to JSON - indentation of member of type structure
  without given name (fixes #20600)
- os: std_output / std_error is not always captured as expected (fixes #21410)
- Missing sokol.html page on modules.vlang.io (fixes #25403)
- gg: background image doesn't work (fixes #17815)
- flag: Params in Flag module return Option type (fixes #19235)
- flag: repeated int option in a single argument does not work (fixes #25362)
- cli: add command alias support (fixes #19136)
- io: fix BufferedReader.read_line undocumented behavior on new line characters (fixes #18751)
- builder: fix MSVC failing to compile thirdparty libraries with -m32 after -m64 (fixes #9151)
- sync: fix waitgroup behaving differently from Go (fixes #6870)
- os: fix using spawn with os.execute inside a thread causing runtime error (fixes #25721)
- json: document @[omitempty] and @[raw] attributes (fixes #20121)
- io: fix using io.read_all on a SSLConn giving a strange error (fixes #16557)
- flag: include default values of options in program usage printout (fixes #22977)
- sync: fix read from closed channel behavior as in Go (fixes #26796)
- builtin: optimize array modifiers to follow slice rules and avoid unnecessary memcpy (fixes
  #11223)
- os: fix problems executing programs (fixes #14486)
- sync: fix LIFO channel select order in sequential functions (fixes #18553)
- sokol: fix numpad arrow keys not returning correct values (fixes #15775)
- toml: fix cannot decode tables into maps (fixes #22634)
- sokol: fix issue with sokol and stbi opening images (fixes #22064)
- os: fix os.read_lines panic from int cast overflow (fixes #15908)
- gg: add texture filtering controls for pixel-perfect rendering (fixes #24934)
- os: allow using `os` constants without importing `os` in vsh scripts (fixes #17280)
- crypto.aes: fix vulnerability to cache-timing attacks (fixes #23791)
- x.json2: fix @[omitempty] not skipping empty arrays, nil pointers and empty maps (fixes #26908)
- x.json2: fix @[raw] decode stripping inter-token whitespace (fixes #26910)
- x.json2: speed up decode[t] on small nested structs (fixes #26911)
- term: add termui keyboard and mouse keyup event detection (fixes #20440)
- builtin: fix two dimensional array with f64 elements cannot store large values (fixes #17736)
- sokol: add vplayground feature to print out graphics (fixes #19857)
- os: fix builder error unc path does not exist (fixes #24180)
- sokol: fix gg.draw_text text corruption with font size and long string on mac (fixes #20457)
- sokol: fix fontstash freetype compiler bug (fixes #17376)
- os: provide default font location in addition to os default (fixes #25068)
- sokol: fix gg .char event inconsistency (fixes #26024)
- x.json2: fix encoder omitting _type discriminator field for sumtype values (fixes #26904)
- x.json2: fix @[json_as_number] enum attribute silently ignored on encode (fixes #26906)
- x.json2: fix f64 encode-decode round-trip not bit-exact (fixes #26909)
- os: fix notify polling on default backend (fixes #26225)
- builtin: fix runtime.nr_jobs assert without VJOBS env variable (fixes #26798)
- os: fix win_spawn_process with paths containing spaces (fixes #18812)
- sokol: fix gg unable to prevent resize (fixes #20099)
- x.json2: fix @[json_null] field attribute ignored on encode (fixes #26905)
- time: fix `time.Time{}` value is wrong? (fixes #25346)
- json: fix json.decode does not parse time into Struct (fixes #15610)
- x.json2: fix x.json2: encoder emits embedded-struct fields out of declaration order, breaking
  byte-for-byte round-trip (fixes #26907)
- builtin: fix [ARM64] - failed to build (fixes #26267)
- io: fix BufferedReader.read_line description is misleading (fixes #24667)
- x.json2: fix Module x.json2 fails to compile decoding to a type with references. (fixes #25614)
- thirdparty: fix Cross-compiling from amd64 to arm64 double definition C error (fixes #26534)
- time: fix time.Time is_zero method (fixes #24765)
- sokol: fix C error when running `gg` under Wayland (fixes #18030)
- x.json2: fix Batch test failed file collection (fixes #26949)
- Enable ALL_INTERIOR_POINTERS for bundled libgc; drop toml.ast_to_any GC wrap (#27007)
- os: remove warning for unused variable in JS implementation (#27028)
- builtin: remove useless test for array (#27027)
- rand: fix warnings for unused variables in JS implementation (#27026)
- os: fix unused variable in sleeping JS implementation (#27035)
- x.async: add structured concurrency helpers (#27029)
- Remove unused variables (#27047)
- thirdparty.mbedtls: apply upstream fix for a TLS 1.2 client regression (#27091)
- crypto.sha3: fix aliasing in write() (#27101)
- encoding.cbor: add CBOR (RFC 8949) module (#27018)
- strconv: fix atou64 silently wrapping on overflow (#27102) (#27105)
- term: remove extra spaces sent to methods in ok_message(), fail_message(), and warn_message()
  (#27128)
- cli: drop trailing periods and use 'Print' in default help/version/man descriptions (#27123)
- Revert "rand: use the OS CSPRNG for `uuid_v4`, `uuid_v7`, `UUIDSession` and `ulid` (#27152)"
- stdatomic: Remove unused aarch64_cas functions (#27160)
- hash: add pure V crc64 (#27164)
- hash: pure V adler32, RFC-1950 compliant (#27176)
- gg: mipmap generation when using sokol (#27206)
- gg: draw lines as lines instead of line strips (#27194)
- datatypes: BSTree to_left and to_right fix (#27198)
- thirdparty/libgc: gc.h uses GC_word instead of u64; valid standalone C (#27179) (#27201)
- json: fix builtin___option_ok cast for option decoder (fixes #27103) (#27234)
- x.json2: fix decode/encode regressions (fix #26967) (#27252)
- bitfield: optimizations, corrections to code and docs (#27289)
- crypto: add hkdf (#27315)
- builtin: guard array push len panics (#27335)
- regex.pcre: small fixes (#27341)
- builtin: add opt-in heap allocation hooks (-d track_heap) (#27357)
- builtin: fix track_heap cross C generation (#27367)
- encoding.hex: cleaner code, options for encode (#27378)
- builtin: preserve array capacity when deleting elements (#27419)
- flag: fix help text generation for xdocs containing colons (#27454)
- builtin: speed up single element array push (`a << x`), fixes #27468 (#27470)
- builtin: add closure lifetime reclamation (#27483)
- builtin: skip heap allocation for zero-capacity arrays (#27487) (#27500)
- async: add bounded pool, periodic, and group helpers (#27524)
- sync: fix ordering in Once and ManyTimes -- store count after f() completes (#27490)
- encoding.cbor: build option payloads via comptime `$zero(field.typ.payload_type)` (#27536)
- x.json2: decode option fields via comptime `$zero`/`$new` type accessors (#27535)
- crypto: document bcrypt, scrypt and pbkdf2 in the README (#27521)
- strconv: add buffer decimal writers (#27573)
- builtin: fix compiling with tcc showing v_stable_sort for all frames (#27417)
- gg: fix X11 C aliases for gg import (#27586)
- gg: add draw_rounded_rect_border function (#27605)
- time: add unix_now(), the cheapest wall-clock read (seconds, UTC) (#27641)
- time: allocation-free HTTP-date writers: write_http_header + incremental update_http_header
  (#27639)
- toml: handle comments in nested array tables (#27693)
- bitfield: add way to convert back into byte array (#27670)
- x.multiwindow/gg: add opt-in native multi-window support (#27690)
- x.multiwindow/gg: complete native event coverage part2 (#27711)

#### Web
- vweb: fix maps in applications not working properly (fixes #18985)
- vweb: fix print_backtrace_skipping_top_frames_tcc backtrace (fixes #15094)
- vweb: fix builder error with orm module (fixes #15571)
- vweb: path is mixed case, return 404 (fixes #15075)
- fix(fasthttp): rearm keep-alive poll events (#27585)
- veb: fix picoev chunked request body handling (fixes #25451)
- net.mbedtls: fix TLS 1.3 session ticket handling in ssl read (fixes #25760)
- net: fix address autofree and addr len handling (fixes #20635)
- veb: fix memory leak (fixes #22141)
- veb: add creation and serving of compressed files handling (fixes #26139)
- net.http: fix http.get panics with ssl read timeout (fixes #23719)
- net.http: add option to bypass https certificate check (fixes #20958)
- net.http: fix got symbols instead response body (fixes #14746)
- veb: fix @import gives `invalid character` but should `undefined ident` (fixes #23623)
- veb: add middleware per route path and http method combination (fixes #24368)
- net.html: unmatched closing tag breaks dom parsing (fixes #26619)
- vcreate: migrate vweb model to veb (#26745)
- veb: support graceful shutdown for veb server (fixes #25655)
- net: fix http.server and net.conn concurrency issues (fixes #18396)
- veb: filter mime types for enable_static_* (fixes #26038)
- net.mbedtls: fix ssl compile error with tcc on arm macs (fixes #19118)
- net.http: fix server different behavior between prod and non-prod (fixes #20899)
- veb: add ssl support (fixes #23663)
- net: concurrent processing of large response bodies results in `substr(start, length) out of
  bounds` (fixes #18094)
- wasm: backend indexing issue (fixes #21997)
- veb: context.set_header not working as expected for .content-type (fixes #24016)
- builder: fix mbedtls build error when using nix (fixes #20518)
- net.websocket: add proxy support to websocket client (fixes #21273)
- veb: fix memory leak (fixes #25518)
- veb: fix before_request not triggered after adding middleware (fixes #20757)
- veb: fix statichandler and ctx.file() not functioning properly (fixes #23596)
- net.http: fix http.get only returning after timeout (fixes #20283)
- net.smtp: add configurable timeout when sending mails (fixes #23287)
- veb: fix middleware access to app struct and resources (fixes #24372)
- net.smtp: separate config from client struct (fixes #19928)
- net.urllib: fix parsing of consecutive slashes in URLs (fixes #22958)
- net.mbedtls: fix websocket bug (fixes #26662)
- Fix v new --web creating vweb projects instead of veb (fixes #24270)
- net.smtp: fix attachments not fully conforming for all mail clients (fixes #23488)
- all: should rename picohttpparser to pico_http_parser in vlib? (fixes #16151)
- veb: Compile error `unknown type veb.Server` (fixes #26811)
- veb: fix response being sent twice over one connection (fixes #23715)
- net.ssl: fix mbedtls http.get_text returning nothing (fixes #23717)
- net: fix `UdpConn.set_read_timeout` not working for `UdpConn.read()` (fixes #26799)
- wasm: fix wasm backend browser issue (fixes #26833)
- veb: fix CSRF module (fixes #26871)
- net: fix socket bug (fixes #15026)
- net.ssl: fix cannot get whole response body on concurrent requests with -prod (fixes #20962)
- net.http: fix random error in download_file_with_progress (fixes #24917)
- veb: fix nested structure c compilation error (fixes #25415)
- veb: fix statichandler not working with veb.controller (fixes #24195)
- net.smtp: add support for sending both HTML and text emails (multipart/alternative) (fixes #23288)
- net.http: fix long-running HTTP polling program encountering socket error (fixes #24302)
- doc: update "building a simple web blog with veb" tutorial for fetching data with ORM (fixes
  #24708)
- net: fix veb test for listening on both IPv4 and IPv6 by default (fixes #26016)
- net.ssl: fix C error on Mac M1 when compiling pure V code (fixes #21820)
- veb: fix instantiating a SSE with vweb (fixes #17407)
- veb: fix timeout when receiving multipart/formdata request from a browser (fixes #24975)
- veb: add parallel event loop (fixes #22134)
- veb: fix long process started from app hogging CPU (fixes #26742)
- net.http: fix download_file_with_progress in net.http module (fixes #25002)
- net: fix net.html parser ignoring inner tags in tag.content (fixes #14138)
- net: add udp multicast support (fixes #25450)
- net.http: fix post requests not working (fixes #24226)
- net.http: fix when i run v download or v searh or v install it always fails (fixes #24553)
- net.http: fix `net.http.Request.proxy` is public but cannot be interpolated because `HttpProxy` is
  private and has no explicit `str()` (fixes #26938)
- veb: fix vweb handlers must be written in order to avoid being overwritten by "'/:path..."
  handlers (fixes #13277)
- compress: fix veb: unable to compile with clang (fixes #26936)
- veb: fix veb: segfault when serving static files (fixes #26939)
- wasm: fix wasm backend as a shared library (fixes #17621)
- net.websocket: treat zero-byte frame-header reads as peer close (#26956)
- net.websocket: add server on_attached hook after handshake attach (#26955)
- fasthttp: generalize kqueue implementation to the bsd os family (#26984)
- fasthttp: add BSD support in README (#26987)
- net.http: fix HEAD/1xx/204/304 responses hanging or erroring on Content-Length (#27000)
- Add an S3-compatible client and a scheme-handler dispatch in http.fetch (#27008)
- net: stop using vlib-specific symbols in C. defenitions in `net` module (#27052)
- veb: support reusable takeover connections (#27050)
- net.smtp: strip display name from MAIL FROM / RCPT TO envelope addresses (#27072)
- net.http: support Schannel validation modes (#27092)
- net: pure-V RFC 5952 IPv6 canonicalization, fixes Ip6.str() emitting deprecated ::a.b.c.d on libc
  (fix #27095) (#27096)
- net.http.file: fix unused parameter notice, when using `v -http` (#27185)
- net.http: make Header.get/get_custom return Option instead of Result (fix #27177) (#27214)
- fasthttp,veb: fix sendfile() failing on large static files (fix #27080) (#27223)
- net.ssl: add ALPN protocol support to mbedtls and openssl backends (#27343)
- net.http: add HPACK header compression (RFC 7541) for HTTP/2 (#27353)
- net.http: add HTTP/2 frame codec (RFC 7540) (#27356)
- net.http: add synchronous HTTP/2 client connection (H2Conn) (#27361)
- net.http: negotiate HTTP/2 in fetch via ALPN (opt-in) (#27362)
- net.http: add TLS termination to Server (HTTPS support) (#27373)
- net.http: stream response callbacks and stop limits over HTTP/2 (#27369)
- net.http: add server-side HTTP/2 (ALPN + h2 frame demux) (#27382)
- net.http: enable HTTP/2 by default for https requests (#27384)
- net.http: fix server_tls h2-negotiation test for default-on HTTP/2 (#27393)
- net.http: fix TLS server listener shutdown (#27429)
- net: fix creating UNIX stream sockets through net.new_tcp_socket/1 (#27449)
- wasm: add browser stderr builtins (#27452)
- net.http: add connection-pooling Transport with HTTP/1.1 keep-alive (#27412)
- net: record bytes written before a write error (last_write_sent) (#27460)
- net.http: track h2 server connections for idle shutdown once, not per frame (#27435)
- net.http: fix TLS server read/handshake timeouts and idle-shutdown fd race (#27434)
- net.http: fix four h2 server correctness gaps found in #27435 review (#27469)
- wasm: resolve fixed-array `.len` instead of aborting with "could not find field len" (#27518)
- wasm: make integer/string builtins available to the `-os browser` target (#27517)
- net.http: fix TLS server close_idle fd-reuse race and remove dead set_read_timeout (#27542)
- net.http: run TLS server handshakes on worker threads (#27433 item 3) (#27552)
- wasm: add table & element sections, call_indirect, and function values (#27532)
- v.gen.wasm: floor-safe wasm-opt/wasm-validate feature allowlist + memory-contract test (#27526)
- wasm: emit a clean error for scalar `?T`/`!T` returns instead of an internal ICE (#27516)
- ci: add h2spec RFC 9113/7541 conformance gate for net.http HTTP/2 (#27563)
- net.openssl: fix double-free on shutdown() (#27482)
- veb: fall back to peer IP from client fd (#27568)
- net.http: add multiplexed HTTP/2 client connection (H2MuxConn) (#27413)
- net.http,net.mbedtls: harden TLS parallel-handshake + idempotent-shutdown test guards (#27559)
- net.http: validate HTTP/2 server request headers (RFC 9113 §8.1.2) (#27569)
- net.http: HTTP/2 server stream state machine (RFC 9113 §5.1/§6.1/§6.4) (#27589)
- net.http: h2 server — close the final 7 h2spec conformance gaps (146/146) (#27627)
- veb: preserve middleware response context (#27698)
- net.http: pool multiplexed HTTP/2 client connections in Transport (pooling Phase 3) (#27643)
- net: avoid BSD fasthttp loopback deadlock (#27723)

#### ORM
- Skip sanitize check of orm_transaction_test.v (#26718)
- Add multi-tenant filtering support (fixes #26517)
- Fix C compilation error (fixes #26224)
- Fix DB changes table name to lowercase (fixes #24036)
- Fix sqlite with pragma foreign_keys=on error (fixes #11181)
- Support more advanced postgres types (fixes #18843)
- Fix errors and panics when using anonymous structs (fixes #23299)
- Fix where field == nil not working (fixes #15304)
- Fix using a generic struct leads to cgen error (fixes #18788)
- Ignores columns with type time.Duration (fixes #23033)
- Postgresql backend: invalid syntax for inserting default values (fixes #18319)
- Selecting struct with ORM does not get deeply nested `struct_field []arr @[fkey: 'some_id']`
  (fixes #23340)
- Fix tcc undefined symbol error with orm enums (fixes #19818)
- Fix cannot directly convert []string to union type (fixes #25851)
- Fix cgen error with v.ast.IfExpr not supported (fixes #25877)
- Add h2database support (fixes #22797)
- Add rails style updates for struct (fixes #22531)
- Fix c compilation error (fixes #25882)
- Table structures support joint primary keys (fixes #25579)
- Fix inserting many-to-many relation (fixes #24832)
- Add function-based query support (fixes #24931)
- Fix cgen issue when updating embedded structs (fixes #23023)
- Add dynamic select/update syntax support (fixes #26222)
- Add upsert SQL method (fixes #23957)
- Fix -prod transformations causes ORM to emit invalid queries (fixes #25983)
- Fixdynamic query-data guard folding (#27114)
- Add bulk insert/update support with CASE WHEN batch updates, MySQL time conversion, and
  checker/codegen validation (#27132)
- Support OR in dynamic where blocks (#27336)
- Add DataScope support for per-instance request-level filtering (#27324)
- Deprecate global tenant filter APIs, deadline 2027-06-08 (#27389)
- Add execute method to Connection interface for raw SQL queries (#27416)
- Fix O(n²) late-used-fn-bodies pass (7-10x faster transform) (#27663)

#### Database drivers
- db.mssql: fix builder error when db.mssql is imported (fixes #19141)
- db.mssql: avoid .sort() in get_conn_str to unbreak tcc CI (#27255)
- db.mysql: fix does not allow retrieving of statement results (fixes #17957)
- db.sqlite: add tables, columns, schema, db_size methods (#26791)
- db: support and cooperate with pool to implement a connection pool (fixes #26500)
- db.mysql: fix mysql.h not found on RHEL 9 (fixes #14952)
- db.sqlite: fix -prod with gcc causing program issues (fixes #24800)
- db.mysql: fix real_query to return proper mysql error (fixes #18059)
- db: db.pg and db.mysql consistency (fixes #24035)
- db.mysql: fix malformed error messages from real_query failing to encode to json (fixes #19842)
- db.sqlite: fix orm dynamic select with multiple conditions and in operator (fixes #26913)
- db.sqlite: fix no such file or directory error (fixes #26887)
- db.mysql: fix Seg fault on Mysql package if app.db.connect() is not at the right place (fixes
  #14287)
- db: fix V support to Microsoft SQL Server or to ODBC connection (fixes #4531)
- db.sqlite: fix [ORM] vfs_lowlevel.c.v:22: unexpected dot . where type is expected (fixes #26889)
- db.mysql: add Config.ssl_mode to control MYSQL_OPT_SSL_MODE (fix #27139) (#27215)
- db.pg: thread-safe pool-backed DB, Tx, and Conn (Go-style API) (#27265)
- db.mysql: support multi-statement queries (fixes #18061, #18063) (#27271)
- db.pg: decode TIMESTAMPTZ / fractional-second timestamps into time.Time (fix #27556) (#27561)
- db: add common driver and pg SSL config (#27628)

#### C backend
- C compilation error when using generics with multiple instantiat… (#26786)
- Preserve interface arrays as single varargs (#26771)
- Add coutput regression test for empty .attrs inline init (#27274)
- Fix sumtype assignment copy semantics (fixes #25839)
- Fix enum explicit size for tcc and gcc (fixes #25041)
- Fix autofree does not call free on unassigned returned struct value (fixes #13821)
- Fix modifying a struct pointer by passing it as mut to a function (fixes #17788)
- Fix incorrect f64 -> u64 conversions (fixes #20944)
- Fix C error while compiling using -autofree with the V UI library (fixes #18952)
- Fix C error when passing expression directly as argument instead of variable (fixes #19152)
- Fix -autofree C compiler error (fixes #23527)
- Import submodule of third-party module (fixes #14548)
- Fix error when trying to convey a variadic argument (fixes #22049)
- Fix V test coverage running against lilly lib results in C generation error (fixes #24842)
- Fix `could not find method` for compiling a veb program with an app alias (fixes #25253)
- Fix conflicting types for 'gc_enable' (fixes #24095)
- Fix autofree compile error '{' expected (fixes #25366)
- Fix removing code while executing in hot code mode may cause Segmentation fault (fixes #6669)
- Fix invalid C code generated (fixes #17200)
- Add sparc64 arch (#26730)
- Don't clone array fn args in struct field init, add test (#26709)
- Fix generic closure type parameter substitution (fixes #26629) (#26671)
- Fix C error array of incomplete type for fixed-size optional array (#26780)
- Avoid builtin print handling for user print fns (#26781)
- Allow embedded interface upcasts (#26772)
- Stop treating every .m as an Objective-C import (#26794)
- Fix short-circuit evaluation in asserts with || and && (#26777) (#26784)
- Fix veb.context vs x.json2.any (fixes #23777)
- Fix string | charptr sum type with unsafe{nil} (fixes #25994)
- Fix live programs hang if a [live] function calls another (fixes #15412)
- Fix if-guard struct copy for [heap] vars (fixes #17825)
- Fix recursive anonymous functions and closures (fixes #16349)
- Fix bad function argument name causes compilation error (fixes #26746)
- Fix function parameter mismatch (fixes #26760)
- Fix error for value := &(m[key]) with map values (fixes #15115)
- Fix -g incorrect line number in backtrace (fixes #15781)
- Fix generics gets wrong about types (fixes #25852)
- Fix interface with method str() returned as option (fixes #25931)
- Fix possible memory allocation issue (fixes #26758)
- Cannot use interface b as interface a, although interface b embeds interface a (fixes #18864)
- When calling dump() on a array with a type containing multiple types outputs wrong values and
  breaks execution (fixes #24154)
- Dynamic string interpolation format specifiers (fixes #19077)
- X__json2__Any_free cgen error (fixes #19289)
- Error assignment from incompatible pointer type (fixes #18977)
- C error instead of clean compile or V error (fixes #24462)
- Returned value differs from value to return (fixes #26346)
- V compiler bug: pointer-based sumtype heap allocation creates dangling pointers (fixes #26657)
- Builder error (fixes #14819)
- Keep fn calling order if subsequent expression needs to use a temporary variable (fixes #26134)
- Builder error: C error. This should never happen (fixes #14859)
- Referenced values are displayed incorrectly (fixes #18440)
- Unable to debug using GDB or LLDB (fixes #14904)
- C error found: /box/code.v:14: error: cannot convert 'struct _option_main__Foo_T_int_ptr' to
  'struct main__Foo_T_int *' (fixes #26425)
- Initializing struct in channel bug (fixes #10342)
- Compiling issue (fixes #16832)
- The gc makes the apps run slow at first (fixes #24827)
- Allocating structs on the heap is not efficient (fixes #16575)
- Install from source failed on macOs X Sierra (fixes #16961)
- Incorrect Auto De-referencing of &net.TcpConn in Map Access (fixes #21067)
- Error that occures when using gcc, clang or msvc but not tcc (fixes #25711)
- Struct pointer comparison with nil causes segfault (fixes #26370)
- Int refs interpolate strangely into strings (mut as hex, immutable as addresses) (fixes #15405)
- C error while compiling code on Playground (fixes #17809)
- Types are not respected with -no-builtin (fixes #21264)
- Generic function pointer returns wrong output (fixes #21499)
- Cant compile free standing type well can it (fixes #21934)
- C error, array: initializing an array of list into inside a struct using index (fixes #26372)
- Fix c error in conditional attribution (fixes #26375)
- Fix not finding structure defined in a separate file (fixes #15724)
- Fix wrapping a generic in a struct causing builder error (fixes #22250)
- Fix initializer element is not a compile-time constant (fixes #25684)
- Fix showing the line where interface is used as generic type (fixes #23004)
- Fix c error while migrating vpm to veb (fixes #24044)
- Fix dump() cross-reference field printing recursively (fixes #13370)
- Fix atomic int not respected by tcc (fixes #15365)
- Add switch to turn on generation of boilerplate in c output (fixes #17089)
- Fix undefined behavior signaled by clang sanitizer (fixes #21525)
- Fix incompatible types for redefinition of memcpy (fixes #14458)
- Fix asm volatile with no instructions generating invalid c code (fixes #26719)
- Fix duplicate code generated when using interface from a package (fixes #18326)
- Fix function pointer expected error (fixes #22256)
- Fix referencing an option creating incorrect option (fixes #26160)
- Fix incorrect comptime return with $if/$else (fixes #17262)
- Fix plugin creation not being called properly (fixes #20047)
- Fix two functions returning generic type with one casted and one not (fixes #18077)
- Fix custom print function with -no-builtin (fixes #26216)
- Fix wrong shift (fixes #26378)
- Optimize string concatenation chains (fixes #276)
- Fix compilation with -freestanding missing main (fixes #20227)
- Fix c compilation error using type parameters in function fields (fixes #26629)
- Fix runtime invalid memory access passing decomposed variadic array (fixes #24757)
- Fix asan complaint about comptime_map_it_test (fixes #25765)
- Fix c compilation issue with quoted items in xdoc attrs (fixes #23045)
- Fix static array unknown type c issue (fixes #24164)
- Assigning C.var to var triggers a compiler bug. (fixes #15971)
- Variable declarations after `continue  <label>` cause builder error with `-cc gcc -cstrict` (fixes
  #19973)
- C error when asserting value from `sql db { select from...}` (fixes #23345)
- C compiler error (fixes #24993)
- Compiler fails in submodule definitions (fixes #24649)
- Generic funtion infers base type for pointers (fixes #25208)
- Data read is corrupted, depending on the order of struct embedding (fixes #26788)
- V panic by sync__pool__process_in_thread (fixes #26826)
- Cgen error when changing the signature of a function with a specialized generic struct parameter,
  that is not called (fixes #23014)
- Can't spread rlock-ed shared variable (fixes #17273)
- 'Handling' assert failure (fixes #7868)
- (bug report summary) Builder Error (fixes #17430)
- Incompatible redefinition of 'size_t' (fixes #21477)
- Can't compile generated C (fixes #22762)
- Not having `[console]` makes application hang (fixes #11277)
- Instantiating struct with global on heap causes c error (fixes #22970)
- C code compiling error (fixes #21939)
- Cgen doesn't create temporaries for arguments with multiple references (fixes #22749)
- Building with MSVC Results in Error with Mutable Static Strings (fixes #25541)
- Wrong compile assigment on termux (fixes #17038)
- Str.bytes() bug (fixes #18243)
- Failed to build with make -clang command (fixes #18463)
- Using non-ref `app`, while vweb expects ref (fixes #20826)
- Use freestanding mode, but encounter incompatible size_t redefinition error by C (fixes #23228)
- Unhandled Exception when setting const to function that returns error or struct (fixes #23555)
- Fix global string array not being modifiable in function (fixes #17377)
- Fix os.File.seek() not generating correct C code for mode parameter (fixes #12003)
- Fix memory leak when using closures (fixes #21019)
- Fix c error when inserting struct reference into map that doesn't expect one (fixes #26860)
- Remove all #includes from vlib and manually define function signatures (fixes #304)
- Fix array.repeat(n) not deep-copying interfaces (fixes #14705)
- Fix c error on build with string interpolation of struct with context interface (fixes #15223)
- Fix circular printing not showing item count in array (fixes #21689)
- Fix segmentation fault with json in struct (fixes #13492)
- Fix sort_with_compare not working correctly (fixes #19575)
- Fix wrong array checking when using interface and multiple type bindings in generics (fixes
  #26004)
- Fix for loop with sleep and dump using more memory (fixes #25378)
- Fix program hang in `for` loop with u8 boundary at 255 (fixes #25379)
- Fix using `debug.dump_callstack()` with `-d callstack` causing a C error (fixes #23323)
- Fix compilation error with strings.Builder alias as array (fixes #26767)
- Fix u64 from C losing high part (fixes #14783)
- Fix string interpolation of generic structs and methods returning generic struct references (fixes
  #16340)
- Fix fixed array with option dynamic elem not compiling (fixes #25460)
- Fix inline `if` expression cannot return a closure (fixes #26595)
- Fix weird behavior on iterating an array (fixes #26874)
- Fix appending reference to array of sumtype references generating new memory address (fixes
  #14832)
- Enable referencing C global variables from V code (fixes #22691)
- Fix cgen error for generic function type inferred implicitly (fixes #25388)
- Fix use of float types as vweb function parameters leading to c error (fixes #15220)
- Fix build hang until timeout when using shared object (fixes #18915)
- Fix `bad address` error when using `os.execve()` (fixes #26007)
- Fix local headers not found (fixes #14706)
- Fix c error from a name shadow using the same name as a C function in unsafe (fixes #17831)
- Fix nested `if` in `if var := foo()` broken with `-prod` (fixes #26006)
- Add runtime guards for unsafe math operations (fixes #4261)
- Fix nesting of fixed arrays (fixes #16393)
- Fix cgen error with `-cstrict -cc clang` and defer in match branch (fixes #19092)
- Fix `dump` modifying decoded generic linked list when struct is @[heap] (fixes #25731)
- Fix println strange behavior in struct methods leading to runtime error (fixes #17629)
- Fix c compiler error when using datatypes.LinkedList[&SomeType] (fixes #25214)
- Fix interface deep embedded fields bug (fixes #17667)
- Fix memory leak when inserting random value into struct reference (fixes #18555)
- Fix memory leaks when using `if var := some_map[type]` (fixes #19454)
- Fix c error while compiling freestanding v program (fixes #25567)
- Fix c backend bug on tuple reassign to struct local (fixes #26594)
- Fix c error when building gui library (fixes #26861)
- Fix v generated shared .so crash on dlclose (fixes #15657)
- Fix runtime memory access for sumtype field access without smartcast (fixes #26297)
- Fix json.encode failing under some circumstances (fixes #15840)
- Fix array of empty interface push function c error (fixes #23013)
- Fix runtime error with invalid memory access regression (fixes #26875)
- Optimize string interpolation performance (fixes #7516)
- Fix c transpilation type bug (fixes #10802)
- Fix json voidptr is not struct error (fixes #13491)
- Fix generic methods passing lambda needing type hint (fixes #26259)
- Fix pointer expected error (fixes #26824)
- Fix invalid memory access when smart casting an alias fntype (fixes #17799)
- Add support for array as a map key (fixes #22992)
- Fix error related to empty interface (fixes #25872)
- Fix struct or union expected error (fixes #26837)
- Fix ability to modify a struct from another thread when it's already locked (fixes #14851)
- Fix implicit reference when appending to an interface array (fixes #25448)
- Fix optional val return in map got wrong value (fixes #26239)
- Fix println(struct) unhandled exception 0xc00000fd (fixes #19178)
- Fix -(-2) translated into --2 (fixes #26813)
- Fix json.decode for apidetails map in array with sumtype (fixes #23883)
- Fix incorrect casting of pointers to interface or sumtype (fixes #24309)
- Fix heap struct copy when accessing via an array in if-guard (fixes #10429)
- Fix $embed_file not compiling on win10 with microsoft compiler (fixes #12035)
- Fix autofree memory leak on reused assignment (fixes #18408)
- Fix invalid memory access when iterating on interface types in an array (fixes #26882)
- Fix comptime $for f in t.fields over generic struct with ?[]t / ?[n]t fields (fixes #26903)
- Fix generic-method symbol mangler strips pointer indirection for []&t (fixes #26892)
- Fix comptime passing ?t field to generic uses wrong payload type (fixes #26900)
- Fix v allocating too much memory for generic method returning option (fixes #20276)
- Fix member to c struct giving field not found error (fixes #24102)
- Fix invalid memory access printing union containing interface member (fixes #25953)
- Fix segfault or error c code when shared variable initialized (fixes #26379)
- Fix hot reload failure when using time.now() in interpolation (fixes #19456)
- Fix v-ui binding issues with sumtype ptr cast payload (fixes #22886)
- Fix program freezing with tcc but working with msvc (fixes #23793)
- Fix c compilation error in nested array declaration (fixes #23818)
- Fix flag -live with bug (fixes #14300)
- Fix json.decode on a sum type with a struct variant, results in incorrect data when the input json
  does not have a _type field (fixes #14058)
- Fix Cannot concatenate chars or runes into strings (fixes #17202)
- Fix Nested aggregate temporaries can be collected too early with Boehm in -prod (fixes #26945)
- Fix usecache will build modules with different sumtype _typ define (fixes #25116)
- Fix C errors with generic fn type (fixes #26156)
- Fix Compile error on alpine, /v/thirdparty/zip/ related problem (fixes #26963)
- Fix Debugger not updating variable values correctly during array iteration (fixes #17436)
- Fix Shared objects make function parameters shared (fixes #11957)
- Fix C error with interface combination (fixes #25982)
- Fix "builder error / C error. This should never happen.", when calling
  C.xcb_setup_roots_iterator() from XCB library (fixes #16906)
- Fix The line of code `println(json.encode_pretty(data))` will trigger a compilation error. (fixes
  #26611)
- Fix cast between pointer and integer of different size with a sum type (fixes #14492)
- As cast: cannot cast `v.ast.FnType` to `v.ast.Struct` (fixes #26944)
- Fix support cast expression in dynamic update blocks (fixes #26957)
- Fix C compiler error with arrays.filter_indexed (fixes #26959)
- Fix Fatal error of compilation generic structs (fixes #26675)
- Scope fix (fixes #26891)
- Keep nested aggregate temporaries alive under Boehm GC (#26946)
- Fix generic if-guard string interpolation (#27061)
- Resolve generic sumtype match method calls (#27068)
- Preserve option fn concrete type names (#27085)"
- Preserve option fn concrete type names (#27085)"
- Allow comparison between Option[T] and `none` literal (#27097)
- Pointer compare instead of deep struct_eq when one side is &lvalue (fixes #27089)
- Fix generic closure result expression temps (#27070)
- Avoid or-block err name collision (#27060)
- Fix generic sort comparator reusing wrong body across instantiations (fixes #27121)
- Fix NetBSD build by including system stdio headers (fix #27190) (#27211)
- Fix `$for method in field.methods` dispatch (fix #27076) (#27226)
- Fix `IError` assignment to `?IError` field (fix #26973) (#27227)
- Call GC_set_pages_executable(0) for shared libs on all OSes (fix #27165) (#27230)
- Fix string interpolation of `for mut item in []string` (fix #27122) (#27232)
- Allow consts referencing each other inside anon fn bodies (fix #27087) (#27224)
- Guard C extern fn decls with #ifndef to coexist with macros (fix #27098) (#27236)
- Fix C error on `return $tmpl(...)` when fn returns Result/Option (fix #27094) (#27235)
- Resolve generic map types in concrete contexts (#27058)
- Guard test coverage counter file creation (#27075)
- Fix invalid C for nested `or` block whose last expr is `!void` call (#27012) (#27256)
- Use c_fn_name for fn-variable signatures and closure captures (fix #27109) (#27259)
- Fix returning ?T/!T into ?Alias/!Alias and container variants (fix #27056) (#27264)
- Emit GC_allow_register_threads() in `_vinit` (fixes #27178)
- Keep interface typeof independent of builtin string (#26812)
- Heap-wrap interface-to-pointer-interface `as` casts (fixes #25785) (#27273)
- Fix bound interface method values (#27293)
- Clone comptime selector assignments (#27295)
- Allow chained type aliases (fix #27055) (#27296)
- Fix shared alias field access (#27313)
- Fix C codegen for generic chan pop via if-guard bound var (#27205) (#27337)
- Fix heap struct init hoist positions (#27349)
- Fix fixed array return via local (#27350)
- Use union tag for C union keepalive helpers (#27351)
- Unwrap option smartcast for interface casts (#27352)
- Fix fixed array expression field assignment (fixes #27360) (#27359)
- Add deref for aliased reference types using mut captures (#27377)
- Fix autofree temp args in map expressions (#27321)
- Unwrap option sumtype as casts (#27431)
- Fix option sumtype if expr struct init (#27443)
- Fix fixed array match return temps (#27444)
- Prevent main propagation panic fallthrough (#27462)
- Match aliases by runtime tag (#27461)
- Snapshot Boehm scope GC pins on the stack, fixes #27467 (#27471)
- Fix comparing two option-of-struct values (`?Struct == ?Struct`) (#27496)
- Fix `#line` directive glued to expression in array literal branches (#27495) (#27497)
- Fix bogus generic suffix on alias-of-generic method calls (#27465) (#27505)
- Fix fixed-array `if`/`match` return mixing a call and a literal branch (#27457) (#27504)
- Fix `as`/`is` on option-type sumtype variant using wrong union member (#27478) (#27499)
- Fix sumtype string-rvalue cast, ?&T == nil unwrap, and generic default interface field (#27551)
- Lower Boehm GC free-space divisor to 1 for the opt modes (fix #27555) (#27560)
- Stabilize auxiliary type symbol hashes (#27570)
- Emit interface type-table index as a real symbol under `-usecache` (fix undefined
  `_IError_None___index`) (#27381)
- Include stdio for GCC MinGW prelude (#27577)
- Fix `go expr` handle referencing undeclared `thread__tN` (#27379)
- Fix heap struct init in if expression (#27659)
- Fix generic multi-return interface cast with stale checker types (#27610)
- Fix ownership cgen, or-expr/multi-return, markused dispatch; regex group flags (#27662)
- Fix inlined tmpl scope type reuse (#27687)
- Fix invalid C for `&` reference of fixed array alias (#27665)
- Include Boehm header before spawn wrappers (#27692)
- Simplify enum from_string helper (#27699)
- Prefer exact alias tags in sumtype match (#27719)
- Fix option sumtype match and static method refs (#27747)

#### JavaScript backend
- js: fix backend not supporting [export] attribute (fixes #11375)
- js: fix array.get index out of range panic (fixes #11379)
- js: Backend / unwraping Javascript Objects / TypeError: e.stack.contains is not a function (fixes
  #10393)
- js: add output file for js_browser_builtin_print_regression.v (#26847)
- js: fix tos functions support (fixes #26304)
- js: fix TypeError with in operator in map (fixes #16404)
- js: JS backend errors (fixes #16415)
- Fix optional pointer properties cannot be mutated (fixes #24406)
- Fix js-backend cannot compile life.v (fixes #20667)
- Fix Playground `@LOCATION` and `@FILE_LINE` interpolation problems (fixes #23554)
- Fix Javascript cross compilation error (fixes #24784)

#### Comptime
- gen: fix comptime zero/new type expression resolution (#27048)
- comptime: include parent methods in $for on alias types (fixes #25405)
- comptime: add comptime-evaluated functions (fixes #26475)
- comptime: fix mix user defines and system defines (fixes #25176)
- comptime: fix struct comptime remove attrs' quotation mark (fixes #24186)
- comptime: convert some useful functions like dump to comptime fns (fixes #22864)
- comptime: Detailed `attrs` for methods (fixes #19082)
- comptime: Unable to take address of constructed method call, but can make a constructed method
  call (fixes #16221)
- comptime: fix $compile_error to locate the actual error position (fixes #24575)
- comptime: allow only explicit auto-expand of []string in compile-time $for loops (fixes #9278)
- comptime: fix unknown type error when using a generic interface (fixes #20762)
- comptime: add type metadata accessors .pointee_type, .payload_type, .variant_types, plus
  $zero(TypeExpr) and $new(TypeExpr) (fixes #26980)

#### vfmt
- Preserve attribute call syntax in vfmt (#26769)
- Allow conditional selective imports (#26787)
- Fix vfmt breaks the new attributes syntax (fixes #26766)
- Fix v fmt can create uncompilable code (fixes #26035)
- Inline if stmt not strict enough (fixes #14875)
- Array initializers should be indented (fixes #24091)
- Prioritize internal error exit code (5) over format-diff exit codes (#26857)
- Fix inconsistent wrapping of long lines (fixes #16543)
- Fix inconsistent wrapping of lines with + and - (fixes #25992)
- Automatically add imports for vlib modules (fixes #23389)
- Fix format line break for ORM update with multiline function (fixes #25883)
- Fix match with or expressions (fixes #17201)
- Fix format error on types (fixes #25496)
- Fix single-line short if expressions forced to multi-line (fixes #26915)
- Fix `parser`: anonymous struct type literal not accepted as a generic type argument (`fn[struct {
  … }](…)`) (fixes #26894)
- Fix [vfmt] Single-line short if expressions are incorrectly forced to multi-line (fixes #26941)
- Orm fix (fixes #26968)
- Keep enum name when stringifying fixed-array size expressions (#27106)
- Keep trailing comment on array element when next line starts with `.enum_val` (fix #27074)
  (#27222)
- Keep single-line struct init inline inside single-line array literal (#27239)
- Respect VFLAGS preferences (#27305)
- Don't prefix current-module types inside `fn` typed struct fields (#27475) (#27506)
- Keep first multiline fn parameter (#27600)

#### Tools
- build: fix tcc error library 'atomic' not found (fixes #18183)
- build: combine the v.c and v_win.c (fixes #4868)
- build: use PGO in -prod (fixes #7024)
- build: add command for generate c project (fixes #19972)
- vsh: cannot use constants from auto-imported modules (fixes #6372)
- editors: push syntax highlighting to vim and neovim (fixes #10321)
- make.bat: bootstrap from v_win.c only (#26779)
- cmd/tools/vsqlite: route dot commands from CLI args to dot_cmd (#26801)
- make: fix building with legacy-support without macports (fixes #24227)
- makev.bat: fix Clang bootstrap on MinGW-targeted LLVM installs (#26978)
- cmd: handle v share API failures (#27598)
- doc: fix changelog formatting (#26713)
- ci: add missing egl dep to sanitized ci (#26712)
- vpm: add commands to link or unlink V projects (fixes #24386)
- vpm: fix installing package from local git repository fails (fixes #21986)
- Add V version manager (fixes #21797)
- vpm: support custom mirrors for package installation (fixes #26217)
- Fix v up removes v and v_old, then fails (fixes #18325)
- cmd/tools: add vsqlite interactive SQLite CLI (#26793)
- vet: warn for confusing regex (fixes #26011)
- ci: fix v-analyzer build in "V Apps and Modules" workflow (#26807)
- repl: mkdir temp folder before chdir to avoid startup failure (#26805)
- cmd/tools: watch flag breaks backend option (fixes #24571)
- cmd/tools: allow specifying the location of the symlink (fixes #25244)
- vvet: assert true, 'multi line string with spaces at the start of the next lines' causes `v vet
  a.v` to fail (fixes #26467)
- repl: vlang repl is slow on OSX (fixes #23128)
- ci: fix vtcc int(0x8000_0000) overflow; document discord.v disable (#26858)
- Fix vshare.v test failing due to linkage with clang (fixes #22692)
- vpm: fix contradictory v install behaviour (fixes #16385)
- Fix first line after // vfmt off being replaced (fixes #23629)
- Vdoc incorrectly looks for modules past v.mod (fixes #14224)
- Time recording error in repl. (fixes #24317)
- all: remove !*.* gitignore rule that interferes with personal exclusions (fixes #24590)
- all: fix vrepl when up/folder `xxx/cmd/tools` is not writable (fixes #10324)
- Fix wrong replacing of @ to $ in links in html vweb templates (fixes #11978)
- ci: fix vtcc sed patch — use int(-2147483648) not u32 for shf_private (#26869)
- Rename make.bat to another name (fixes #21497)
- ci: fix release numbering in manual release workflow (fixes #26214)
- benchmark: fix nixos V panic: string.repeat: count is negative: -26  (fixes #10974)
- Fix v doc: cannot generate an HTML documentation of my own project (fixes #9170)
- Fix vdoc does not generate enum description immediately following $if statement (fixes #23338)
- vpm: refuse to overwrite an installed module with uncommitted or unpushed git changes (#27014)
- all: restore .gitignore rule for extensionless binaries (#27019)
- ci: update cross-platform-actions/action to v1.1.0 for BSD CI (#27195)
- vpm: normalize module path on update/remove (fix #27192) (#27210)
- Surface command failures in cmd/tools/fast/fast.v docs upload (fix #27038) (#27237)
- ci: fix vfmt and http redirect failures (#27319)
- Store C error reports as SQLite columns (#27322)
- Store C error report context lines (#27325)
- Store the V source line of a C error in a bug_reports.v_lines column (#27342)
- Fix `v watch run` not reloading on source changes (fix #27463) (#27501)
- ci: deploy docs.vlang.io from GitHub Actions (fix #27038) (#27520)
- Fix vdoc dropping the module overview comment when the first symbol also has a doc comment (fixes
  #27672) (#27677)
- Include build flags and V source in C error bug reports (#27735)

#### Operating System support
- make: add RegQueryInfoKeyW, RegEnumKeyExW, RegEnumValueW to advapi32.def (fixes #18918)
- build: fix 'this app cannot run on your PC' error (fixes #13795)
- closure: add sparc64 support (#26731)
- ast,pref,genc: bootstrap ppc64 arch (#26743)
- closure: add ppc64 ELFv1 support (#26749)
- build: fix compilation error on Raspberry Pi (fixes #12907)
- properly define stdin, stdout, and stderr for FreeBSD (#26920)
- tcc/bionic: fix unresolved __builtin_bswap16/__builtin_nanf on Termux (fix #27207) (#27277)
- mssql: add macOS support and improve ODBC build detection (fixes #18966)
- Fix parse_file() permanently breaks spawn + os.execute() on macOS (fixes #26633)
- net: fix importing net.openssl on linux causes tcp_conn.accept to fail (fixes #21257)
- net.mbedtls: fix cannot use mbedtls modules on macOS arm with tcc (fixes #21639)
- veb: fix session_app_test.v failure on OpenBSD (fixes #26012)
- Fix V fails to symlink after updating on Windows 10 (fixes #15580)
- net.http: fix HTTPS GET request fails on OpenBSD with tcc (fixes #26398)
- os: fix inconsistent behaviour of os.glob() on Windows and Linux (fixes #15448)
- db.sqlite: fix thirdparty amalgamation not found on Linux (#26724)
- builder: fix linux cross compilation for veb with -d use_openssl (#26733)
- builder: fix unable to override minimum macos version (fixes #10796)
- ci: increase timeout for gcc-freebsd job in FreeBSD workflow (#26814)
- net: `net.listen_tcp()` doesn't work on ipv6 disabeld Linux (fixes #12176)
- Cannot cross compile to linux from mac (fixes #18089)
- `vlang` 0.3.5+ broken on PowerPC (macOS, FreeBSD, Linux); while 0.3.4 builds fine (fixes #20507)
- sokol: restore Linux GL 4.1 default (fix the X11/EGL context creation regression for Ubuntu 20.04
  on older integrated GPUs, similar to 765cb7cfb6) (#26849)
- sqlite: use bundled amalgamation on Linux/macOS when pkg-config is unavailable (#26817)
- pref: fix c error building from source on Void Linux (fixes #14559)
- term.ui: add support for raw linux tty (fixes #25463)
- Subtle runtime segfault on Linux x86_64 in GitHub actions CI (fixes #26121)
- clipboard: clipboard not working on windows and doesn't use global on linux (fixes #11338)
- builder: Compile error parallel-cc on windows (fixes #23174)
- os: `os.data_dir()` is not common for Windows (fixes #24288)
- os: on windows, os.execute() disallow some char in cmd (fixes #25756)
- net: Compiling on windows with openssl (fixes #13980)
- gg: `fn gg.Context.text_width` does not return the correct width of the font on Windows (fixes
  #19516)
- os: Windows 10 folder corrupted 'v run' command (fixes #25364)
- builtin: windows gg apps runs without having a window when launched from a file explorer (fixes
  #25858)
- all: v symlink on Windows 11 broken. (fixes #24675)
- net: websocket client connection in windows (fixes #24715)
- Error: conflicting types for '__v_thread_bool_wait' on cross compile to windows (fixes #13871)
- all: vlang doesn't compile on arm windows (fixes #23917)
- pref: fix .vsh compilation not working on macOS (fixes #13601)
- Implement cg_call() for ARM64 on macOS (fixes #26878)
- builtin: fix undefined GC symbols when building with tcc and bundled libgc on macOS (fixes #25527)
- term.ui: fix key events not working in iTerm on macOS (fixes #14924)
- pref: fix macOS builtin option error (fixes #16243)
- db.mysql: fix no output on windows when using mysql lib (fixes #14464)
- builtin: fix v commands changing console font on windows (fixes #15124)
- builder: fix msvc error with cflags and windows config (fixes #15638)
- builtin: fix sort() behaving differently on linux and windows (fixes #16512)
- make: fix cannot build v under windows 7 32b (fixes #23137)
- builder: fix hot reload on windows (fixes #3548)
- Fix db.sqlite.sqlerror on windows 11 from release download (fixes #20744)
- pref: fix 32bit closures broken on windows (fixes #25803)
- Fix windows cannot compile v.exe (fixes #26919)
- pref: fix v -cc msvc does not include bwdgc under windows (fixes #24229)
- builder: fix db.sqlite errors on windows (fixes #25069)
- Fix v repl not working in certain shells on windows (fixes #15712)
- builder: fix cannot cross compile to freebsd while windows works (fixes #22333)
- Fix parallel compilation failing on windows (fixes #26877)
- stbi: fix c.stbi_load failing on clang windows (fixes #17248)
- encoding: add support for windows-1252 encoding (fixes #19198)
- builtin: fix building on windows 7 failing due to missing psapi.h (fixes #26885)
- builtin: fix windows backtrace false positives (fixes #6654)
- sokol: fix sokol.audio not working on windows tcc (fixes #15863)
- Fix hot code reloading not working on windows (fixes #16256)
- net.http: fix incorrect error messages on windows when http request fails (fixes #25393)
- Fix incompatible integer to pointer conversion on windows execinfo (fixes #17032)
- builtin: split cfns.c.v into windows and linux parts (fixes #25821)
- builder: fix windows cross compilation arm error (fixes #24785)
- builder: fix hot code reload with graphics not working on windows 10 (fixes #3054)
- os: fix prebuild release and manual installation crash on windows (fixes #19466)
- builtin: fix lf automatically converted to crlf on windows (fixes #25640)
- Fix makev.bat fails on windows-latest: TCC bootstrap crashes at runtime, Clang 20 fallback fails
  on vc/v_win.c (fixes #26958)
- builder: fix Cross compiling for Linux on Windows does not work (fixes #12128)
- builder: fix Cross compilation failed, windows>linux (fixes #15461)
- builder: fix Cross compiling from linux to windows produces very slow performing binary (fixes
  #17737)
- Fix sporadic runtime failure of assertion with `-gc boehm_full_opt` on windows (the default gc
  mode) (fixes #17916)
- Fix Rethink the way DLLs are created under Windows (fixes #24641)
- Fix v up error on windows (fixes #15298)
- net.http: fix Strange error message for invalid site on Windows (http.get) (fixes #16968)
- net.http: fix windows: Failed to upload a file via content_type: multipart/form-data (fixes
  #19256)
- builtin: fix libbacktrace not supported on OpenBSD (fixes #22261)
- readline: fix The read_char () of the readline module does not work in Windows OS. (fixes #24686)
- builtin: fix flaky segfault with boehm gc on FreeBSD (#26970)
- db: sqlite: fix ADDR macro conflict on Windows by using #flag instead of #include (#26982)
- makev.bat: fix Windows TCC bootstrap (#26998)
- sync: fix sync on freebsd so that shared_nested_lock_runtime_test.v passes (#27013)
- builder: prevent coroutines_runtime_test on FreeBSD (#27016)
- ci: install SQLite via PowerShell instead of v vsh on Windows (#27071)
- ci: fix windows tcc stack (#27084)
- builder: fix cached vsh run on windows (#27083)
- ci: group logs sections for FreeBSD and OpenBSD (#27099)
- ci: group logs sections in Tools CI for FreeBSD and OpenBSD (#27135)
- makefile: fix compatibility with BSD make (or bmake on Linux) (#27157)
- builtin,cgen: address Windows compilation errors when using tcc toolchains (#27186)
- vdoctor: remove redundant ANSI decoding for wmic output on Windows (#27203)
- pref: fall back to bundled tcc on Windows when gcc is not in PATH (fix #27119) (#27233)
- doc: document compiling for iOS on macOS (#27245)
- all: fix master CI failures on OpenBSD and markdown (#27246)
- gg: fix compiler error of ved on windows (adjust declaration of struct C.RECT from windef.h)
  (#27275)
- Fix macOS tcc header lookup (#27134)
- db.sqlite: link libm on linux (#27323)
- net.http: add ALPN negotiation to the Windows SChannel backend (#27395)
- net.http: speak HTTP/2 over the Windows SChannel backend (#27397)
- net.mbedtls: enable MBEDTLS_THREADING_C on Windows and macOS (#27437)
- builder: fix infinite loop in find_module_path for projects at a Windows drive root (#27473)
- builtin: fix GetFinalPathNameByHandleW declaration for TCC on Windows (#27534)
- builtin: guard linux_bare amd64 syscall asm with $if amd64 (#27564)
- ci: use FreeBSD version 15.1 (#27597)
- sokol: add opt-in Windows D3D11 support (#27654)
- time: declare the Linux timerfd C API (timerfd_create/settime/gettime) (#27642)
- fasthttp: add Windows IOCP backend (#27710)
- fasthttp: preserve pointer-sized Windows sockets (#27727)
- net.http: fix vschannel https_make_request() buffer leaks on Windows (#27717)
- sync.stdatomic: restore TCC Linux thread fence (#27750)
- ci: run gitly (veb/fasthttp) on Windows and check it serves the expected HTML (#27741)

#### Examples
- Fix cannot run abcd example from documentation (fixes #18538)
- Improve the AI heuristic for 2048, in order to consistently reach above 4096 (#26716)
- Add a 15 puzzle game (#26752)
- eventbus: fix example fails to compile (fixes #26763)
- Update wasm_codegen for current wasmer (fixes #22607)
- Memory leak in many of the examples in V (fixes #24738)
- Mac: examples/database/mysql.v fails (fixes #20475)
- io: fix io.read hanging for server example (fixes #12194)
- Improve error message when running shader examples (fixes #16125)
- net: examples/concurrency/concurrency_http.v fails on BSD with tcc (fixes #24728)
- Examples/2048: consumes GPU without user interaction (fixes #6602)
- net.http: fix comparison example fetch HN stories failing on OpenBSD (fixes #15548)
- doc: fix special channel features example needing set capacity to succeed (fixes #23481)
- builder: fix termux hot reload example segmentation fault (fixes #18135)
- all: convert js_dom_draw example to veb (fixes #22603)
- compress.zstd: fix use zstd example outputting nothing (fixes #25071)
- builder: fix compiler bug when trying to run the 2048 example on macOS (fixes #15519)
- doc: fix array slice example to match documentation (fixes #21487)
- db.sqlite: fix v examples sqlite (fixes #17888)
- Fix bugged numbers in 2048 example (fixes #13620)
- Remove unused variables for veb middleware (#27025)
- Remove unused variable in snek JS (#27036)
- Remove unused variable/function in viewer (#27037)
- x.async: fix format for example in README (#27046)
- cli: render command groups, inherited flags, examples and learn-more in --help (#27124)
- term: fix misleading example in README (fix #27120) (#27229)
- ci: smoke test the veb example (fasthttp) http server on windows (#27731)


## V 0.5.1

*9 Mar 2026*

#### Improvements in the language

- New clean and fast v2 backends: cleanc (similar to the old C backend), ssa/arm64, ssa/amd64,
  cleanc backend can already self host!
- Add a new generic solver stage (gated behind `-new-generic-solver`) (#26280)
- Refactor $var to ${var} across entire repository, make vfmt always output the newer form
  `${expr}` (#26494)
- Fix support for match exprs with nested if exprs (#26599)
- Add OS-specific headers support for #include directives (#26654) (fixes #26562)

#### Checker improvements/fixes

- Fix compiler panic on wrong arg count with or block (#26665)
- Support gotodef for fn param and []Type (#26193)
- Error for unwrapped option/result types used with in operator (fix #26208) (#26223)
- Expand @VEXEROOT, @VMODROOT, DIR, $d(), $env() inside $embed_file(path) too (#26319)
- Fix global empty const type check (fix #26324) (#26332)
- Add error message call stack support (requested by #16127, #24575, etc) (#26356)
- Fix option in struct member infix expr and swapped none comparion (fix #26351) (#26373)
- Disallow `foo()? == foo` where foo returns `!string` (fix #26383) (#26403)
- Unset `@VCURRENTHASH` for V build/bootstrapped outside of a Git repository (fix #26407) (#26426)
- Check generic struct fields and initialisation (fix #26433) (fix #26436) (#26450)
- Preserve mut in other non-none if branch (fix #26491) (#26495)
- Fix sql statement using an unwrapped option value from an if guard (fix #26496) (#26505)
- Add type checking for param of fn passed as generic arg (fix #26195) (#26257)
- Add warning for `fn f(x u8) {} f(999)` (fix #26584) (fix #26585) (#26586)
- Add passes for top level decls (fix #26306) (#26589)
- Avoid panic on unresolved infix operand types in -check (fixes #26458) (#26607)
- Fix shared array slice type with implicit clone (fixes #26663) (#26666)
- Fix autofree crash with option/result method chains (#26694)

#### Parser improvements

- Disallow `[3]!int{}` (fix #26244) (#26249)
- Get correct generics for generics struct fn with generic param (fix #26191) (#26251)
- Fix dump() free bug for v.ast.TypeSymbol (fix #26282) (#26283)
- Disallow `[T]` as fn return type  (#26530)
- Show where another declaration is located (fixes #26483)
- Fix `pub:` not being detected in structs in -vls-mode (#26581)
- Fix anonymous function name collisions across files (#26642)
- Remove @[minify] from structs with enum fields (#26661)

#### Compiler internals

- v.comptime,v.generics: unwrap receiver type, support more generic comptime exprs (#26350)
- v.generic: improve new generic stage, unwrap generic ident info, set ct_expr to false if solved,
  update receiver_type generic flag (#26366)
- v.generics: improve the new generics stage, by fixing unwrapping in nested generic struct, also
  fix suggestions from previous PR (#26430)
- table: fix generics crash (fix #26438)
- markused: add array method map and filter support (fix #26233) (#26238)
- v.pref: exit early with an error message, if coroutines are not supported yet on the current
  platform, instead of producing a cgen error (#26342)
- builder: fix compile error message for -m32 (fix #16639) (#26353)
- v.builder: add -stats for top level statements and non-vlib top level statements (#26451)
- v.pref: improve musl detection; fixes __atomic_thread_fence for all musl nixes (fix #26449)
  (#26460)
- v.builder: always apply -fno-strict-aliasing too, on `-cc gcc -prod` to avoid the need for the
  `-cflags -fno-inline-small-functions` workaround with gcc > 12.0 (fix #26512) (#26552)
- v.scanner: optimise ident_dec_number, ident_oct_number, ident_hex_number, by using precomputed
  digit_table and letter_table consts, instead of u8 method calls
- v.scanner: eliminate str_helper_tokens changes outside string interpolation (fix speed loss after
  106da40)
- markused: add typ==0 guard for MapInit to fix panic in comptime $else branch (#26652)

#### Standard library

- builtin.closure: improve ppc64le closure if PIE (#26172)
- rand.xoroshiro128pp: prevent generation of extra zeros in u16() (#26229)
- thirdparty: fix tcc __atomic_thread_fence (fix #25856) (fix #26158) (#26185)
- builtin.closure: use volatile register for s390x (fix #24383) (#26256)
- thirdparty: update zstd patch with commit 8aa0369 (#26312)
- regex.pcre: add non-greedy quantifiers like `*?`, `+?`, `??` (fix #26579) (#26582)
- regex.pcre: optimise for speed the PCRE implementation (#26609)
- atomic: and/or bitwise ops (#26646)
- x.json2: add a `strict: true` mode for x.json2.decode(), that rejects string-to-number type
  casting during decoding (fix #26082) (#26220)
- builtin: add array.last_index() (#26252)
- bitfield: fix pop_count(), add test (#26262)
- io: deprecate the `io.string_reader` module (not used in vlib, with confusing and under
  tested/documented API - see #25713 ) (#26274)
- time: add Duration.times/1
- os: add Pipe.write_string/1 (#26286)
- gg: add .draw_ellipse_filled_rotate and .draw_ellipse_empty_rotate APIs (#26309)
- gg: add draw_ellipse_thick and draw_ellipse_thick_rotate (#26327)
- os: fix args quoting in win_spawn_process (fix #26261) (#26339)
- gg: optimize ellipses draw functions (#26340)
- gg: text_width_f
- math: fix acosh() for 0.0 (#26360)
- math: rewrite round() to match closely the Go version (and mpfr's one), update test (#26381)
- gg: optimise the ``draw_rounded_rect_filled`` function (#26390)
- os: add missing is_opened checks to File.read* functions (fix #26096) (#26413)
- x.json2: add `@[json: name]` attr support for enum values (fix #26437) (#26441)
- x.json2: rename Any.arr() to Any.as_array() for consistency with as_map(), as_map_of_string();
  deprecate Any.arr() (#26455)
- breaking,x.ttf: extract vlib/x/ttf/render_sokol_cpu.v in a separate module x.ttf.render_sokol,
  to enable headless programs, that do not use gg, to not depend on OpenGL, DX12, Metal etc, through
  sokol (#26477)
- crypto.blake3: add @[direct_array_access] and improve f() performance (#26480)
- crypto.rc4: add `@[direct_array_access]` (#26507)
- x.crypto.slhdsa: fix slh signature testing on latest version (fix #24086) (#26519)
- crypto.pbkdf2: replace a panic with an error return (#26526)
- regex: fixed missing OR operation on anchor flag (#26540)
- regex: new PCRE compliant regex submodule written in pure V, available through
  `import regex.pcre` (#26545)
- x.json2: fix decoding wrong value depending on field order (fix #26503) (#26571)
- crypto: add shake128 and shake256 entries into crypto.Hash enum (#26576)
- vlib: add x.atomics - implement native_x86-64_atomics in V and assembly, without depending on an
  external C library (impl #26474) (#26529)
- os: use _dyld_get_image_name() to increase compatibility with older versions of Mac OS X like
  10.4 (#26617)
- crypto: move up AEAD interface from experimental namespace to `cipher.AEAD` (#26632)
- builtin: fix `camel_to_snake` underscore placement in uppercase runs (#26634)
- time: parse_http_header_string (#26636)
- flag: add DocOptions/Show to FlagParser (#26630)
- runtime: fix issues with nr_cpus() (#26679)
- thirdparty,sokol: add wayland support (#26682)
- thirdparty,sokol: fix frame pacing issues on xwayland sessions, prevent sending some keycode
  events on wayland (#26706)

#### Web

- net: add raw sockets support (implement feature request from #19565) (#26237)
- veb: remove 2 clones of response bodies; reduce the GC load for the most common case (fix #25423)
  (#26236)
- wasm: support basic match keyword handling (#26246)
- wasm: fix infinite loop using continue in C-like for loops (#26250)
- wasm: add basic `for x in start .. end {` support (#26248)
- wasm: implement basic string operations (#26260)
- veb: fix double-send error when after-middleware sends response (#26270)
- builder,wasm: fix pointer size to 4 for `-b wasm` before the checker stage (#26281)
- wasm: support basic string interpolation (#26288)
- wasm: fix string plus assign with call expr (#26287)
- wasm: handle `for` in strings and FixedArrays (#26290)
- wasm: support WASI program arguments and IO functions (#26294)
- net.mbedtls: increase default timeout to 10s (like in Go): 550ms was too low
- net: add jsonrpc module (#26330)
- fasthttp,veb: static files via sendfile
- wasm: fix size of pointers in structs (#26357)
- thirdparty.mbedtls: upgrade to v3.6.5 (#26365)
- wasm: only compile `.wasm.v`, and platform independent `.v` files (#26386)
- fasthttp: fix sendfile (#26402)
- wasm: add run support with wasm-micro-runtime/iwasm (#26417)
- veb: fix unset Content-Length header, in responses with an empty body (#26431)
- veb: fix error lines for html templates via source to source mapping
- net.http: enable test for relative redirects (#26513)
- fasthttp: fix IPv6 support (fix #26548) (#26549)
- mbedtls: better ux around client timeout by mentioning the mbedtls_client_read_timeout_ms flag
  (#26574)
- Document `$veb.html()` too in the compiler error messages, as a known comptime function (#26605)
- fasthttp: remove zero-byte initialization in read buffer #26640
- net.http: stop reading after Content-Length bytes on keep-alive responses (#26669)

#### ORM

- Add explicit JOIN support (INNER, LEFT, RIGHT, FULL OUTER) (fix #21635) (#26400)
- Support embedded structs
- Make work with generic structs
- Fix generic struct creation inside a generic function
- Resolve generic inserting object type
- Cgen bug fix (fixes #25847)
- Handle inserting enum fields (#26680)
- Add aggregate function support (#26697)
- Add transaction API with savepoint-backed nesting (#26707)

#### Database drivers

- mysql: use correct link flag for both tcc and msvc (#26539)
- pg: exec_no_null(); gx: remove deprecated test; parser/tmpl: %raw translations;
  veb: time_to_render()
- fix(db.sqlite): replace vstring() with tos_clone() to prevent use-after-free (#26700)
- feat(db.sqlite): add Row.names, get_string/get_int, and improve exec_map (#26702)

#### C backend

- Fix multi dim fixed array with opt elem (fix #26243) (#26258)
- Fix array.contains() when right is ref (fix #26253) (#26255)
- Ast,checker,cgen,parser: fix comptime $if assign expr (fix #26061) (#26242)
- Promote non generic sumtype pointer initialiations to the heap too (#26285)
- Fix generic function error propagation type mismatch (fix #26263) (#26295)
- Fix interface pass string ref arg (fix #26293) (#26296)
- Fix shared array assigned call expr with fixed array (#26320)
- Fix fixed array of option with different size (#26326)
- Fix call with fixed array of builtin struct (#26328)
- Fix array init with option array (fix #26329) (#26331)
- Fix alias indent (fix #26272) (#26333)
- Fix chan autostr (fix #26337) (#26338)
- Transformer,markused,cgen: fix some problem for array init when use `-new-transformer` (#26341)
- Fix `-assert backtraces` after e317c63
- Fix for function-like macro '_BIONIC_AVAILABILITY_GUARD' which is not defined in older termux
  releases (#26345)
- Fix empty shared struct init (fix #16234) (#26354)
- Add rv32 inline assembly support (#26362)
- Fix fn arg for struct nested fields (fix #26346) (#26349)
- Fix `+=` overloading for aliases, regression after 29e60da #23967 (fix #26416) (#26423)
- Fix unused functions returning fixed arrays of custom structs (fix #26439) (#26440)
- Fix or-block with fixed array constants with GCC 15.2 (fix #26442) (#26443)
- Fix uninitialized interface bug (closes #17372)
- Fix regression in `./v test vlib/toml` after 38ac4e6 (#26485)
- Fix generation of struct initialisers for structs with option fields, inside ternaries (fix
  #26476) (#26493)
- Fix the saving of g.skip_stmt_pos and g.stmt_path_pos when generating anonymous fns (fix #26498)
  (#26508)
- Fix generic type handling bugs
- Fix -autofree used for code doing "string ${f(@VEXE)} interpolation" (#26521)
- Fix multi-return match in closure (fix #26558) (#26566)
- Fix alias for interface and option types (fix #26551) (#26565)
- Autofree fix generic math.min[T] used with time.Time (fix #26575) (#26577)
- Fix extra dereference when indexing array of fns passed by pointer (fix #26556) (#26591)
- Fix orm shared conn on sql expr (fixes #26479) (#26610)
- Fix comptime match assign in generic fn, T.name string intp (fix #26053) (#26597)
- Fix bit-field generation for option/result types in minified st… (#26670)
- Use unsigned int for enum bit fields or unspecified size in @[minify] structs (#26678)
- Fix auto-deref var in autofree string re-assignment (#26689)

#### vfmt

- Fix parser failing on duplicate methods in $if/$else blocks (fix #26271) (#26278)

#### Tools

- vwatch: fix process handle leak in kill_pgroup() (#26269)
- vwatch: fix `-o` short flag conflict that broke hot reload (fix #26221) (#26277)
- vcomplete: add git-fmt-hook command (#26396)
- vrepl: fix handling of `//` inside string literals (fix #25603) (#26240)
- v.help: add help for git-fmt-hook tool (#26394)
- Add support for `v missdoc @vlib`
- Add support for `v quest`
- Add support for `v install --local gui`
- Support .vcheckignore pattern files for `v check-md .` (#26623)

#### Operating System support

- msvc: split multi-token -I/-L values from pkg-config (#26637)
- wasm: fix path separator in windows (#26264)
- time: fix overflow in time.sys_mono_now() on windows (#26273)
- sokol: fix errors for audio unsupported on OpenBSD (fix #26299) (#26305)
- db.pg: improve support on OpenBSD (#26316)
- os: fix get_raw_line for EOF on OpenBSD (fix #26361) (#26368)
- Add support for vgit-fmt-hook on OpenBSD (fix #26344) (#26388)
- builtin: use -Xlinker flags on macos, for compilers != tcc, to pass the rpath folder (fix for
  folders with spaces)
- builtin: fix for tcc builds on paths with spaces on linux
- os: implement readlink/1 on !windows (#26405)
- builtin: fix compilation with tcc on OpenBSD using libgc (fix #26447) (#26448)
- fasthttp: multi threading fix reads in the socket in linux (#26478)
- time: prevent linux time functions from being included in non-linux platforms (#26596)
- Fix hanging when printing to console in a `-subsystem windows` executable (#26572)
- builder: fix Windows pkgconfig paths and MSVC flags (#26631)
- net.vschannel: chunk large TLS payloads to fix 16KB EncryptMessage crash on Windows (#26681)

#### Examples

- examples,strings: add a new `strings.lorem` module; use it in the Markov chain text generator
  example (#26387)
- Add examples/gg/pong/pong.v (#26528)
- Improve pidigits.v using a much faster spigot algorithm
- sokol: fix `v run examples/2048/` on macos (regressed after 5d6de17) (#26705)

## V 0.5.0

*31 Dec 2025*

#### Improvements in the language

- Add comptime `if is shared` support (fix #25600) (#25602)
- Make `defer{}` scoped by default, use `defer(fn){}` to get the old behavior #25639) (#25665)
- Add gotodef support for nested struct members, fn return types, etc (#26131)
- Add a new v.comptime stage `COMPTIME`, that runs after the checker (`CHECK`), and before the
  transformer (`TRANSFORM`), to simplify the work that later stages do #26068 (#26161)

#### Checker improvements/fixes

- Correctly detect variadic arg passed to struct fn (fix #25504) (#25509)
- Fix $(field.name) access on closure fn (fix #25513) (#25514)
- vls: skip unrelated files (#25531)
- Fix mutability in `for in` loops with pointer values (fix #25520) (#25536)
- Fix type inference, when pushing an empty array to a 2D array (fix #23854) (#25508)
- Prevent array.insert for array of references when non-reference is passed (fix #25511) (#25557)
- Add more support for mod autocomplete, allow for .vv files too (#25562)
- Fix cast from an empty struct to option (fix #25566) (#25581)
- Ensure ?Struct is not parsed as ??Struct when param is ?T (fix #25559) (#25564)
- Fix if branch type nr_muls mismatch (fix #25556) (fix #25555) (#25571)
- Fix comptime else branch handling (fix #25586) (#25589)
- Smart detect `or {}` inside loop when using `c <-val` (fix #24550) (#25435)
- Vls fix goto definition (#25595)
- Fix generic resolve for external module generic static method call (fix #21476) (#25634)
- Correctly detect type, when prepending to generic array (fix #25585) (#25645)
- Allow cast from voidptr to sumtype in unsafe block (fix #25652) (#25657)
- Disallow calls to a shared receiver method, on a non-shared var (fix #25577) (#25656)
- Fix or block endwiths expr (fix #25329) (#25667)
- Set ast file fallbacks for vls (fix #25678) (#25679)
- Error/warn when using `defer(fn)` inside function-scope and `lock` stmts (#25681)
- Maintain correct ref level in generic fn (fix #25676) (#25687)
- In vls mode, make ensure_type_exists return true (#25695)
- Only collect/hoist inner vars, when `defer` is function-scoped (#25693)
- Improve type checking for sumtypes with generics (fix #25690) (#25699)
- Unwrap for base type if ft.typ and inferred_typ are both opt (fix #25517) (#25728)
- Disallow deference of nil (fix #25740) (#25746)
- Fix comptime main fn (#25747)
- Parser,fmt,checker: use a trie for matching the generic array methods `all`, `any`, `count`,
  `filter`, `map`, `sort` and `sorted` (#25759)
- Fix array fixed unresolved return check and resolver (fix #25774) (#25790)
- Allow explicit sumtype to option casts (fix #25796) (#25812)
- Fix possible race on expected arg types unwrapping on cgen (#25815)
- Skip init check for options (fix #25798) (#25830)
- Fix module var set at change_current_file() (fix #25845) (#25846)
- Improve handling of array decompose for dynamic arrays and array init (fix #25838) (#25843)
- Force all fn declarations to follow after all other top level statements (fix #25889) (#25890)
- Fix used features tracking when printing pointer values (fix #25899) (#25901)
- Match type when auto deref occurs (fix #25913) (#25916)
- Relax the redundant () check to a notice, to enable a future `v -W test vlib/builtin` job on the
  CI
- remove () from match branch exprs (fix #25950) (#25952)
- Fix array map anon fn return fixed array (fix #25928) (#25977)
- Cleanup the output of `v new --web abcd` after feedback from https://youtu.be/IuE6Bo1klK0?t=555
- Allow assign to a shared int var (fix #25986) (#25988)
- Ensure type of global exists (fix #25910) (#25998)
- Ensure fn pointer cannot be used as non-fn argument (fix #26017) (#26022)
- Make sure  `$for` eval body statements at least once to set types and avoid markused issues later
  (fix #26058) (#26063)
- Fix return static method name (fix #26105) (#26110)
- Support gotodef for struct init and sumtype rhs (#26157)
- Detect circular type references in sumtype declarations (fix #24511) (#26162)
- Add interface type handling and new testcase (fix #24116) (#26165)
- Allow enum fields to reference previously declared fields (fix #25241) (#26173)
- Clear all ref from autostr receiver_type (needed by #25857) (#26202)
- Allow for `_` being used as both `import x as _` and `fn f(_ int) {` (fix (#26219) #26230

#### Parser improvements

- Fix vls mode strut mut keyword (fix #25548) (#25551)
- Fix vfmt comment in struct init after the update expr (fix #24361) (#25668)
- Fix infix expr comment in middle (fix #24183) (#25671)
- Disallow using generic functions as a field type name inside struct decl (fix #25452) (#25705)
- Warn on `@[deprecated_after]` used without a corresponding `@[deprecated]` attribute (#25712)
- Fix last stmt is fn call in or_expr (fix #25732) (#25739)
- Allow for `|mut x, y|expr` (fix #25734) (#25735)
- Allow using `a`, `b` and `it` as var names, when using the builtin array methods (fix #25729)
  (#25755)
- Disallow generic function to be exported (fix #25794) (#25806)
- Support `-d trace_parse` to ease diagnosing problems related to the order of parsing of .v files
  in modules
- Fix the language support for a nested anonymous C.struct (fix #25807) (#25789)
- Disallow untyped `chan` used as a fn parameter type (fix #25818) (#25854)
- Improve the unused import warning message (add fixing alternatives) (#25880)
- checker,parser,ast: make `type MyBuilder = strings.Builder` work (part 1); add `mod` fields to
  ast.SumTypeDecl and ast.AliasTypeDecl (#25943)
- Remove dead code in Parser.is_array_type/0 (#26080)
- Check invalid struct name in struct_init() (fix #26030) (#26093)
- Remove the support for the obsolete generic fn call syntax f<T>() (first deprecated in 2022/11)
  (#26126)
- Fix comptime for lock shared field (fix #26143) (#26146)
- checker,parser: add multifile gotodef support for -line-info (#26167)
- Optmize Parser.call_kind (#26196)

#### Compiler internals

- markused: fix markused struct heap (#25542)
- markused: fix array.prepend C code dependency (fix #25573) (#25582)
- markused: fix fn marked as used when variable and fn uses same name (fix #25649) (#25650)
- checker,transformer: add always true/false branch detection for the `if` and `match` constructs
  (#25674)
- v.util: measure more precisely how long a new tool recompilation lasts in launch_tool, when using
  `v -d trace_launch_tool self`
- transformer: fix struct init comparison turning into boolean (#25724)
- v.builder: support V_NO_RM_CLEANUP_FILES=1, to ease debugging of -usecache issues
- v.builder: make it easier to reproduce the exact specific stages of -usecache module compilation
  by logging the full CLI options for each
- v.builder: fix `.vsh` mode doing an implicit `import os`, now only for .vsh file itself (fix
  issue spotted in #25736) (#25745)
- v.builder: improve diagnostic information for a failed build_thirdparty_obj_file
- transformer: transform ArrayInit into a function call for C and native backends (part 1)
- builder,pref: add  `-file-list` support (implement feature #25707) (#25749)
- pref: for -usecache, set .parallel_cc = false and .no_parallel = true to make compilations more
  deterministic and ease CI diagnostics
- markused: fix missing builtin__memdup definition, when an option struct field is used (fix
  #25801) (#25802)
- transformer: move array logic to array.v
- v.builder: improve the error message for failing cgen; suggest `-g` and `-show-c-output`
- v.pref: fix GitHub download URL for the photonwrapper .so file (fix #25708) (#25831)
- v.pref: use `v download` for downloading the prebuilt `photonwrapper` shared library (#25849)
- markused: fix const as fn mark as used (fix #25888) (#25895)
- transformer: disable generic str_intp opt (fix #25896) (#25897)
- v.scanner: remove obsolete .is_crlf and .is_vh fields (#25918)
- v.scanner: use a named return for decode_XXX_escape_single methods, to reduce the generated C diff
  churn, during scanner code updates
- markused: add new auto_str() used funcs for bootstrap (#25938)
- v.builder: provide more detailed error message, on `msvc: failed to build a thirdparty object`,
  not just the failed command
- v.builder: improve formatting of the `failed to build a thirdparty object` message for msvc
- scanner: remove old generic check logic (fix #25959) (#25997)
- transformer: fix the setting of a generic flag for fixed array type with `-new-transformer` (
  #26009)
- transformer: add file/line info for fn with `expand_simple_interpolation` (#26135)
- transformer: add early return to avoid transform getting applied twice for a `for x < y {` body (
  #26153)
- markused: fix option none markused (fix #26147) (#26151)
- v.builder: enable gc back with msvc, build separate `.debug.obj` thirdparty files when -g is
  passed, to prevent linking issues (#26215)
- v.builder: support compiling asm .S files to .o files, mentioned in #flag directives (needed for
  #26185) (#26211)
- v.builder: fix compile asm file, followup of PR #26211 (#26227)

#### Standard library

- arrays: fix rotate_left() and rotate_right(), add test (#25539)
- encoding.base58: fix encoding, add test (#25538)
- x.crypto.chacha20poly1305: move up responsibility for allocs into higher caller (#25574)
- crypto.cipher: fix decryption in CBC mode, add test (#25584)
- os: use `@[noinline]` on os.create/1 to workaround a `-cc gcc -prod` panic (fix #25549)
- time: fix non-digit checks for parse_rfc3339() (#25597)
- gg: add explicit bounds checking for image caching methods in gg (fix #25590) (#25591)
- time: fix quarter calculation in custom_format() (#25608)
- rand: fix randomness in shuffle() (#25617)
- gg: destroy unused GPU resources before replacing cached images (#25615)
- encoding.binary: fix serialize skip struct shared fields (related to issue #25600) (#25613)
- x.crypto.chacha20poly1305: make implementation use fixed sized arrays more (#25627)
- builtin: make result string end with null in `u8(x).repeat(y)` (fix regression after #22100) (
  #25625)
- gg: fix address of const warnings for `v -experimental program_using_gg.v`
- builtin: add .hex() methods to the `rune` and `char` types too (#25635)
- datatypes: fix insert() and delete() for items in second half of DoubleLinkedList[T]{}, add test (
  #25647)
- builtin: use an explicit loop to determine min_common_indent in string.trim_indent/0 to reduce
  allocations and reduce the reasons for misfires of the closure detection heuristic
- vlib: use `defer(fn) {` syntax where appropriate (part 2 of #25639) (#25653)
- x.json2: fix decode_number not initializing value to zero (fix #25641) (#25675)
- crypto.hmac: optimize hmac.new, support calculations with a blocksize > 256 (#25686)
- math.unsigned: fix put_bytes(), add test (#25718)
- builtin: reset .len and .cap to 0 too, in the array.free() method (#25717)
- os: add pipe and stdio_capture support (implement #25714) (#25716)
- encoding.utf8.validate: fix validation, add test (#25748)
- crypto.blake2b,crypto.blake2s: add `@[direct_array_access]` to hot functions (#25750)
- strconv: fix handling of subnormal numbers like `'1.23e-308'.f64()` (fix #25751) (#25752)
- crypto.sha3: remove `import math` (just for int_max), to improve compilation time and complexity
  for code that uses sha3
- builtin: add declarations for C.GetCurrentThreadId(), C.gettid() and C.pthread_self()
- builtin: add pid: and tid: fields to the panic reports (part 2 of #25808) (#25809)
- gg: add doc comments for the FN** types (#25814)
- rand: add missing i8() utility function (#25819)
- builtin: fix C.SYSTEM_INFO (fix #25788) (#25823)
- builtin: support `-d no_getpid` and `-d no_gettid` for systems that lack proper process management
  APIs
- math: fix vec2,3,4 project not using the right formulas (fix #25811) (#25813)
- math.vec: swap u and v in the .project() method of Vec2,Vec3,Vec4 (#25841)
- crypto.cipher: fix xor_key_stream() for OFB mode, add test (#25844)
- encoding.binary: use unions for small speed increase and readability (#25867)
- math.complex: replace `==` with eq_epsilon() in equals() (#25873)
- crypto.cipher: fix xor_key_stream() for CTR mode, add test vector created with OpenSSL (#25866)
- os: enhance os.cp() to mimic Python's shutil.copy2() (#25893)
- io.util: use correct TempDirOptions parameter type name in temp_dir() (#25904)
- builtin,sync: eliminate calls to _us32_lt in new_map/6, and in the spinloops in
  Channel.try_push_priv, Channel.try_pop (#25912)
- rand: restore error margin in dist_test.v back to 0.05 (the updated seeds were found by @tankf33er
  in #25907)
- builtin: reduce the max size of string representations of integers (#25919)
- builtin: remove commented code, improve comments
- x.crypto.chacha20: fix deprecation warning during compilation of Cipher.rekey/2
- math.easing: fix in_out_expo(), add test (#25944)
- builtin: split builtin.v and builtin.c.v into smaller, and more focused .v files, to ease working
  on unrelated subsystems (#25965)
- transformer: fix `v -new-transformer vlib/strconv/atoi_test.v` (#26021)
- gg: add more documentation for color substraction (fix #21549) (#26023)
- toml: fix for single `\r` occurence in multi-line `"""` strings (`\r\n` is still allowed) (#26029)
- toml: remove workarounds + `TODO`s for fixed issue #9507 (#26037)
- x.json2: fix decode_number for u8 (fix #26027) (#26033)
- rand.wyrand: switch to using the original C._wymix() as a performance optimisation (#26051)
- strconv: fix float scientific notation (fix #26045) (#26046)
- x.json2: fix decoding of float values in scientific notation (fix #26043) (fix #26062) (#26060)
- builtin: add a declaration for C.memchr too (#26054)
- toml: add compliance up until official toml-lang/toml-test@c6a78f1 (#26067)
- builtin: fix some C fn parameter types (#26069)
- toml: add compliance to official toml-lang/toml-test@8bb8d9c (#26070)
- toml: remove special cases for `jq` normalization (#26092)
- toml: fix remaining valid `key/*` exceptions (#26125)
- builtin: make string.index_ public, to simplify code using a redundant
  `x := s.index(sub) or { -1 }` pattern (#26123)
- builtin: add declarations for C.memmem and C.mempcpy (#26129)
- builtin: speed up, fix and test impl_utf8_to_utf32 (#26109)
- toml: fix remaining valid `array/*` exception (#26138)
- toml: fix unicode decoding panic on invalid TOML `key/duplicate-keys-06.toml` (#26140)
- toml: allow `true` and `false` as keys when parsing root table (#26144)
- toml: allow dotted key lengths > 2 within nested arrays of arrays (#26145)
- flag: fix `v vet -W vlib/flag/` (fix remaining doc comments)
- x.json2: fix memory access error, when decoding string enum values (fix #26176) (fix #26179) (
  #26178)
- toml: fix invalid exception by erroring on duplicate keys in inline table (#26177)
- time: implement faster and simpler `push_http_header` (#26155)
- toml: fix remaining invalid exceptions for `table/*` (#26189)
- toml: reach 100% TOML v1.0.0 compliance with the official test suite (#26203)
- x.json2: remove workaround_cast(), add isize usize decode support (#26210)

#### Web

- net: fix cookie parsing when `;` is used (fix #25544) (#25561)
- veb: new fasthttp module with -d new_veb (multithreaded, epoll/kqueue): makes veb multithreaded
  and fixes frequent hangs
- veb: fix gzip middleware decode/encode (fix #20865) (fix #25753) (#25754)
- veb: gzip support for StaticHandler (fix #20859) (#25758)
- veb: support markdown content negotiation, compliant with https://llmstxt.org/ (#25782)
- fasthttp: move kqueue related code to a separate file
- veb: add zstd compression support (#25816)
- veb: remove println('send_file ct=...') leftover (#25834)
- ci: reduce false positives for veb_should_listen_on_both_ipv4_and_ipv6_by_default_test.v by
  retrying it 3 times (since sometimes binding to the port it listens to fails)
- veb: add an early startup panic error message, when the result type of route handler methods *is
  not* `veb.Result` (fix #25970) (#25973)
- net.mbedtls: make errors more verbose, to ease remote diagnosis of issues
- net.openssl: make errors more verbose, to ease remote diagnosis of issues
- veb: improve the before_request documentation
- veb: add method.location too, to the invalid return type error, to ease diagnosing problems while
  prototyping
- wasm: fix const reference another const (fix #25722) (#26010)
- fasthttp: fixes and improvements (#25906)
- wasm: export pub fns in main module when targeting wasi (#26041)
- net.http: use error_with_code in download_file() (fix #26056) (#26057)
- net.http,veb: fix detection of the headers/body boundary in parse_request_head_str (fix #26091) (
  #26112)
- fasthttp: expand http request parser (related to #26091 part1) (#26104)
- net.ftp: fix get() command conversation, add test (fix #18858) (#26194)
- x.sessions: verify HMAC signatures when extracting sessions IDs from cookies (#26199)
- net.http: fix a panic in parse_multipart_form, for small/incomplete form data (fix #26204)
- net.http: support keep-alive connections in server (fix #26136) (#26218)

#### ORM

- Mark orm_where_in_test.v to be skipped in the sanitize-memory-clang job
- Fix fkey insert as assigment expr (fix #25568) (#25575)
- Fix double fkey insert and update (fix #25593) (#25606)
- Add index attr support (#25604)
- Fix autofree detection for is_or with block style (fix #25969) (#26089)
- Allow multiple set() in one update() call (fix #26116) (#26117)
- Add check for invalid index field name (#26142)
- Supoprt DISTINCT keyword (#26163)

#### Database drivers

- db.sqlite: fix orm f32 field retrieval for sqlite (fix #25583) (#25592)
- db.pg: support returning `Result` type with column names (#25737)
- db.sqlite: allow for
  `mut db := sqlite.connect_full(":memory:", [.readwrite, .create, .fullmutex], "")!` defaulting to
  unix/win32 depending on the platform
- db.pg: support LISTEN/NOTIFY (implement feature #23983) (#26133)
- db.pg: fix `v check-md vlib/db/pg/README.md`
- Revert "db.sqlite: support calling exec_param_many with [][]string or []string (it now accepts a
  sumtype of both) (#26100)"
- Reapply "db.sqlite: support calling exec_param_many with [][]string or []string (it now accepts a
  sumtype of both) (#26100)"

#### Native backend

- Fixed array, `-new-transformer` dynamic array (#25817)
- Add `$if trace_native_todos ? {` to reduce noise in `v test-all`

#### C backend

- Fix resolution type Map[string]T when T is AliasToMap (fix #25494) (#25510)
- Fix markused for option generic param (fix #25501) (#25525)
- Fix empty struct initializer for clang (fix #25467) (#25526)
- Fix match codegen for option match case (fix #25533) (#25537)
- Fix codegen for alias for array fixed initialization (fix #25512) (#25540)
- Ensure option none/ok state is also compared (#25532)
- Fix match codegen for option expr on case (fix #25545) (#25553)
- Add `-no-closures` option to detect closure usage earlier (for emscripten or for less well
  supported platforms) (#25565)
- Create ctemp before lockexpr gen (fix #25576) (#25612)
- Fix if expr with condition that requires temporary variable (fix #19584) (fix #23903) (#25621)
- Fix multi return of a fixed array (fix #25626) (#25628)
- Fix generic multiple indirections on print (fix #22793) (#25633)
- Fix `fn (d Struct) a[T]() T { return d }` when T is a sumtype (#25644)
- Minimize code generated for asserts (generate the common parts for the pass/fail case once) (
  #25642)
- Handle pointers in json map decode/encode (fix #25632) (#25646)
- Fix `defer` stmts with `if` exprs and `or` blocks that return a value (#25651)
- Fix infix expr ComptimeSelector type (fix #25659) (#25662)
- Fix passing sumtype child to generic function taking sumtype parent (fix #25660) (#25664)
- Fix multi generics fn name (fix #23886) (#25673)
- Fix `defer` generation within comptime `$if`/`$match`/`$for` (#25677)
- Fix codegen for if comptime and array fixed (fix #25691) (#25697)
- Correct function definitions for callbacks in imported modules (fix #25700) (#25719)
- Improve codegen for array fixed init for g++ compiler (fix #25723) (#25725)
- Fix codegen for operator overload method_name on alias to builtin types (fix #25709) (#25726)
- Fix missing cast if fixed array is surrounded in brackets (fix #25629) (#25741)
- Fix comptime for types not being recognized with maps correctly (fix #25742) (#25743)
- Fix dump(ptr_to_fixed_array_value) - it now returns the argument directly (thanks @tankf33der) (
  #25764)
- Cast member variables to correct types in comptime $for (fix #25771) (#25773)
- Include `ast.ComptimeSelector` in fixed array checks (fix #25767) (#25777)
- Checker,cgen,type_resolver: prevent stale type cast on comptime `$for`, handle in dumpexpr (fix
  #25781) (#25784)
- Reduce the nested expr level complexity of Gen.ident
- Fix tcc __attribute__, fix os.notify (followup to #25779) (#25804)
- Ensure array of string is not cloned with depth 0 (fix #25783) (#25793)
- Support `-d trace_check` and `-d trace_cgen` to help diagnose checker and cgen ordering issues
- Support `-d trace_cgen_fn_decl` and `-d trace_cgen_gen_fn_decl` too
- Show the v_gettid() hex with `-d trace_cgen_fn_decl` and `-d trace_cgen_gen_fn_decl`
- Use variadic_count == 1 when passing variadic to call of same array type (fix #25827) (#25837)
- Fix nested or in assign decl (fix #25864) (#25865)
- Fix variadic on translated (fix #25862) (#25876)
- Allow @[cinit] for const variables (#25881)
- Fallback to field type when default_expr_typ is 0 (fix #25891) (#25903)
- Fix map value init with array fixed const (fix #25887) (#25902)
- Fix cast type changed before last stmt in `stmts_with_tmp_var` (#25915)
- Update wyhash to version 4.2 (#25907)
- Use final_sym for elem_sym in index_of_array (fix #25960) (#25961)
- Fix variadic call on sumtype with array of itself (fix #25898) (#25964)
- Correct T{} init for []Type aliases (fix #25962) (#25963)
- Fix array init with fixed array from return call (fix #25954) (#25971)
- Fix fntype unwrap on ifguard (fix #25911) (#25914)
- Add a source .location field to `$for method in Type.methods {` (#25976)
- Fix iterator on alias to fn ptr (fix #25911) (#25978)
- Fix shared int string intp (fix #25984) (#25989)
- Allow init shared field with default value (fix #25990) (#25991)
- Allow init of struct from struct with array of optional values (fix #26000) (#26005)
- Fix default value in if/else or block (fix #26002) (#26020)
- Fix fnptr indirections declaration (fix #25940) (#25987)
- Fix bool cast from value (fix #26028) (#26031)
- Fix cast() generic type bug (fix #26065) (#26066)
- Fix fn_var_signature() support nr_muls (fix #26049) (#26075)
- Fix cast_expr() for alias (fix #26076) (#26079)
- Handle CallExpr in dumpexpr (fix #26084) (#26087)
- Clean code in return stmt (fix #25968) (#26118)
- Fix cast to array (fix #26099) (#26102)
- Fix fn_var_signature() allow option type (fix #26088) (#26120)
- Fix scoped struct array fixed generation (fix #26111) (#26114)
- Fix option array init with non option values (fix #26148) (#26170)
- Fix heap fixed array assign (fix #26149) (#26169)
- Fix stack overflow for `@[heap]` structs with large fixed arrays (fix #22690) (#26183)
- Fix print interface when arg0 is function call (fix #26184) (#26188)
- Checker,table,cgen: fix generic interface confusion (fix #25478) (#26181)

#### vfmt

- Force conversion of []Type{init: it} -> []Type{init: index} (#26201)

#### Tools

- ci: run `v doc` with VJOBS=1 on the CI, to make remote diagnosing of failures easier
- Remove unused `sw := time.new_stopwatch()` call
- Add support for VTEST_SHOW_CMD=1 in `v test .` too
- ci: use VJOBS=1 for the `v test cmd/tools/vdoc` step too, to ease diagnosing remote CI failures
- ci: bump cross-platform-actions/action from 0.29.0 to 0.30.0 (#25666)
- Fix showing the *failed* compilation output with `v -silent test .`
- ci: bump all `timeout-minutes: 15` to `timeout-minutes: 20` to reduce false positives due to
  network timeouts (mostly for the Termux job)
- Note about `v help check-md` when `v check-md .` fails
- ci: skip invalid_utf8_string.vv in compiler_errors_test.v for msvc
- ci: reduce annotation noise, remove dead code
- ci: skip the multistage v->v2->v3 -usecache checks for now (reduce false positives on the CI for
  unrelated PRs, until the root cause is fixed)
- ci: add new job `sanitize-address-clang-without-gc` that passes `-gc none` through VFLAGS (#25780)
- Support
  ```
  VTEST_SHOW_LONGEST_BY_RUNTIME=5 \
  VTEST_SHOW_LONGEST_BY_COMPTIME=5 \
  VTEST_SHOW_LONGEST_BY_TOTALTIME=5 \
  v test .
  ```
- Print total time at the *end* of the `v test-all` output to ease visual comparisons in separate
  shells, without scrolling
- Use unbuffer_stdout in TestSession.test, to ensure consistent output on the CI jobs
- v.builder: remove the obsolete check for V_NO_C_ERROR_INFO (VQUIET=1 replaced it in 2023); add
  VQUIET to the `-q` description
- Make `v search` failures easier to diagnose (on the CI)
- Support `v download -o some/folder/local.toml TOML_URL`, in addition to --target-folder
- Add `--sha3-256` support for checksumming the content that `v download` saves
- Add a watchdog timer in test_if_v_test_system_works.v to speedup the failure of stuck CI jobs
- Use local `vtest build:` tags to eliminate the need for the skip_fsanitize_too_slow list in
  vtest-self.v
- ci,vpm: make dependency_test.v more robust, and easier to diagnose remotely
- ci: set VTMP too in set_test_env/1, to avoid cloning conflicts during parallel test executions
- v.builder: do not produce `If the code is in a folder with multiple .v files` for temp V REPL
  files, to improve messages for `'asdas'.starts_wiz('xyz')`
- Add a `-new-transformer` task to `v test-all`. Remove `-skip-unused` flags (it is the default
  for ~1 year).
- Improve development experience for `v -W -silent test-self vlib` (especially on CIs); *always*
  show compilation errors for failures
- Support `VTEST_KEEP_SESSION=1 ./v test vlib/math`
- vet: use new annotation syntax ([] -> @[]) (#26026)
- ci: bump cross-platform-actions/action from 0.31.0 to 0.32.0 (#26074)
- Make the `is_sqlite3_present` check more robust (work with the system packaged sqlite library
  again too)

#### Operating System support

- ci: fix gcc-windows -std=c99 (#25534)
- os: add windows stdin_write() support (#25546)
- ci: use `macos-14` instead of `macos-13` (the older runner is being deprecated) (#25670)
- v.builder: fix json-errors with a windows path separator (#25680)
- ci: fix unsetting of VFLAGS in `v run ci/linux_ci.vsh v_self_compilation_usecache_clang`
- ci: stop unsetting VFLAGS completely in ci/linux_ci.vsh and ci/macos_ci.vsh
- builtin,os: fix windows execute ANSI encoding result, make msvc error messages readable in a
  Chinese locale (fix #25727) (#25736)
- db.sqlite: update windows version to https://sqlite.org/2025/sqlite-amalgamation-3510000.zip (
  #25766)
- os.notify: fix struct epoll_event alignment on ARM64/Linux (fix #25778) (#25779)
- fasthttp: Linux/epoll support
- math: reduce the nested level of expressions, to reduce the chances of stack overflows on windows
- net.http,ci,db.sqlite: rewrite .github/workflows/windows-install-sqlite.bat in .vsh, fix vschannel
  on windows downloading content > 32KB (#25792)
- v.builder: bump the default stack size for executables, when compiling with msvc on windows, to
  32MB (#25824)
- ci: reduce the chances of false positives due to hangs of use_net_and_net_unix_together_test.v on
  windows
- doc: add subsections about using SQLite on windows and about installing the self contained
  `sqlite` module.
- v.builder: switch to using `-std=c99`, instead of `-std=gnu99` to avoid name colisions with C
  `linux` macros defined by gcc/clang (#25848)
- gg: set more sensible and user friendly defaults for the width, height and the title of new
  windows
- thirdparty: update thirdparty-openbsd-amd64_tcc.sh (#25945)
- ci: install plain gcc on the OpenBSD jobs
- ci: use `gcc` as the name of the compiler instead of `egcc` on OpenBSD
- ci: remove the gcc-openbsd job, until OpenBSD people fix their broken conventions on 7.8
- ci: run `v -W -silent test-self vlib` on linux, so deprecations/warnings introduced in PRs, can
  fail (and be fixed) earlier (#25955)
- ci: use VTEST_SHOW_LONGEST_BY_* vars on OpenBSD (#25958)
- ci: update to use FreeBSD version 15.0 (#25985)
- crypto.ecdsa: update to test and use OpenSSL 3.5 on OpenBSD (#25995)
- x.crypto.slhdsa: add support on OpenBSD using OpenSSL 3.5 (#25996)
- ci: reduce failure rate for the gcc-windows job, in test_if_v_test_system_works.v
- ci: skip use_net_and_net_unix_together_test.v on gcc-windows (many weird timeouts on unrelated
  PRs)
- db.sqlite: fix exec_param_many on linux for the case of a [][]string parameter
- v.util: add `-d max_suggestions_limit=140` for v itself, to improve handling of large .v files
  with many thousands of lines on windows
- v.util: bump max_suggestions_limit to 200, to account for windows
- ci: extract windows_ci_msvc.yml from windows_ci.yml to enable finer grained workflow/job control
- ci: extract and split windows_ci_tcc.yml and windows_ci_gcc.yml from windows_ci.yml for improved
  job control

#### Examples

- Handle closing of the window in the event manager in examples/viewer (#25522)
- ci: add a report-wrong-examples-in-doc-comments job, that runs
  `./v doc -check-examples -f none vlib/` (#25554)
- Make reproduction of failed examples easier (make sure that all the checked sources have an ending
  \n)
- Use math.vec in path_tracing.v and in vyper.v
- Support `v -d trace_execution run examples/brainvuck.v mandlebrot.bf`
- ci: do not use `-silent` for the `v build-examples` task on windows, to make it easier to diagnose
  recent gcc-windows timeouts
- doc: add an example for reading from a non empty buffered channel, after closing it
- Fix and improve vanilla_http_server (#25905)
- ci: remove `-silent` from the macos build_examples task too, to make remote diagnosing of CI
  timeouts easier
- Add optional `update_fn: fn (dt f32, ctx &gg.Context)` to gg.Context and gg.Config . Pass
  consistently the current GG context to *all* callback functions, instead of nil.
- Add expanding_rect.v (modeled after the example from https://love2d.org/wiki/love), add generic
  helpers gg.frgb/3 gg.frgba/4
- tools,examples,veb: fix `v -d trace_before_request run examples/veb/veb_example.v` after feedback
  from https://youtu.be/IuE6Bo1klK0?t=2100
- Move flag/ .v files 1 level up, to prevent module lookup confusion for unrelated examples
- Add a Lorem Ipsum Generator (#26036)
- examples,net.ftp,v.builder: remove remaining matches of
  `rg --multiline --multiline-dotall "continue\n\t+\}\n\t+\}\n\t+return" -B3 -A3 `
- Update lorem.v with a Markov algorithm for better text generation (#26085)
- fasthttp: fix the correctness of the minimal server example, when tested with curl (#26072)
- v.gen.native: fix `v -os macos -experimental -b native -o hw.macos examples/hello_world.v` on
  linux
- tutorials: remove newline in the example for c2v's cc compilation to `doomv` (#26200)
- Make all the labels fit in the default window size header in minesweeper.v

## V 0.4.12

*19 Sep 2025*

#### Improvements in the language

- json2: replace encoder with a new implementation. It's 70% faster than the old json2, and 110%
  faster than json that is based on cJSON (#25224)
- Virtual C consts with custom types (const C.MY_CONST u8)
- Support `-div-by-zero-is-zero`, which allows for `x / 0 == 0` and `x % 0 == x`, avoiding division
  by zero traps/panics (#24981)
- Limit -div-by-zero-is-zero influence to just the integer types (for f32 and f64, / produces a +inf
  or -inf value, and the program continues to run)
- VLS mode for the language server in pure V
- Add support for `@OS`, `@CCOMPILER` `@BACKEND` and `@PLATFORM` (#25174)

#### Breaking changes

- Deprecate `gx` and replace all occurences with `gg` (which now contains all the functionality of
  `gx`) (#24966)

#### Checker improvements/fixes

- Fix `sizeof(T)` usage in generic struct (fix #24806) (#24808)
- Add `$if sizeof(T) == int_literal {` support (#24831)
- Improve virtual C consts
- Markused,checker: fix hello world size after the introduction of `builtin.closure` in 2d87ac4 (
  #24989)
- Remove dump() dependency from ComptimeFor (#25000)
- Cleanup - remove unused c.using_new_err_struct (#25036)
- Cleanup `err` removal (#25043)
- Add comptime support for s390x, ppc64le and loongarch64 platforms (#25048)
- Allow for `v -is_o -o x mm.v`, where `mm.v` starts with `module abc` (i.e. not just `module main`)
- Fix calls with result propagation, using other consts, in const declaration expressions (fix
  #21609) (#25060)
- Fix array init with interface (fix #24255) (#25073)
- Fix missing map float key duplicated checking (fix #25098) (#25117)
- Fix missing check for struct generic init from call (fix #25084) (#25119)
- Fix missing check for empty array to generic param (fix #25056) (#25118)
- Rewrite comptime_if_cond() to support comptime if cond evaluate (fix #24938) (fix #25099) (#25122)
- Add error for struct not init (fix #24893) (#25134)
- Fix sql insert expr propagate result (fix #24833) (#25136)
- Fix checking return type call disregarding unwrapping (fix #25140) (#25143)
- Ensure the defer behavior matches that of cgen (fix #25148) (#25146)
- Nil check for c.table.cur_fn in gen_branch_context_string() (fix #25170) (#25171)
- Relax the "unreachable code after a @[noreturn] call" error to a warning to reduce prototyping
  friction (#25173)
- Fix multi return arg passing checking (fix #25167) (fix #25180) (#25177)
- Use keywords matcher trie for imported symbol presence checks, instead of
  `x in p.imported_symbol` (#25201)
- Fix iteration over mutable option (fix #24860) (#25199)
- Add `T.typ` and `T.unaliased_typ` checking to `$match` (fix #25200) (#25202)
- Add more checks for map.delete (fix #25204) (#25205)
- Fix static init var (fix #25203) (#25209)
- Add top level comptime support for `$match @OS {` too (#25222)
- Comptime match only eval true branch (fix #25223) (#25225)
- Fix multi return var passing to fn arg (potential fix for #24870) (#25250)
- Prevent usage of imported module name prefix as identifier names, to avoid cgen collisions (
  #25280)
- Disallow duplicate export names (fix #25301) (#25302)
- Reduce the verboseness of `unsupported size ... for global` messages, for
  `v -b native examples/hello_world.v`

#### Parser improvements

- Split parser methods to files based on topic (#24786)
- Fix arch loongarch64 comptime support (fix #24906) (#24907)
- Fix const error
- pref,parser: implement support for `-force-bounds-checking` to enable easier testing of functions
  tagged with `@[direct_array_access]` (essentially turning off that flag)
- Allow keyword as struct param key on fn call (fix #24957) (#24958)
- Fix syntax error for `for c in [othermod.Struct{field: 255}] {` (fix #24943) (#24978)
- Reduce calls to util.contains_capital
- Fix overriding of fn names in `-translated` mode (fix #25024) (#25061)
- Fix asm modifier parsing (allow for `=r, =&r, +r, +&r,=m,=rm,=@ccl, =*r`) (fix #25070) (#25072)
- Allow using aliased types in interface method implementations (provide backwards compatibility to
  `ui`, during the migration of code from `gx` to `gg`) (#25106)
- Fix interface method declaration with fixed array return type (fix #25137) (#25145)
- Prepare for eliminating a warning for `v -cross -o vc/v.c cmd/v` (part 1) (reduce CI annotation
  noise)
- Add duplicate import symbol detect (fix #25185) (#25187)
- vfmt,parser: move mark used from vfmt to parser (#25190)
- v.ast: add a `mod` field to ast.FnTypeDecl too

#### Compiler internals

- scanner: fix multi-level string interpolation in if/match branch (#24805)
- markused: fix mark for array init from sumtype (fix #24887) (#24889)
- markused: whitelist `_option_none` too (fix #24862) (#24885)
- markused: remove `@[markused]` from option and result fns (#24900)
- markused: skip unused symbols, dump fns and generic specialization (fix #24921) (fix #24927) (
  #24924)
- parser,markused: support `@[markused]` for interface declarations too (#24963)
- markused: fix interface fields and chan usage (fix #24961) (#24962)
- v.builder: add a clearer error message for `v -shared run empty.v` (issue found by Felipe Pena)
- markused: use eprintln for `PANIC DEPS` too (for consistency and easier redirection for the whole
  trace)
- v.util: add support for setting VUTIL_RETRY_MAX_COUNT=1 to ease the workflow for developing
  backends
- markused: improve the tracking of used closures (#25009)
- markused: improve array resources tracking + remove all_fns loop for orm (#25007)
- markused: fix generic map index (fix #25012) (#25022)
- markused: improve array tracking (range, gated) (#25023)
- markused: fix option tracking on sumtype (fix #25025) (#25028)
- markused: fix thread type mark by go/spawn expr (fix #25049) (#25054)
- scanner: refactor string interpolation (fix #24198) (#25053)
- markused: fix array append c code dependency (fix #25057) (#25058)
- markused: fix option array element (fix #23089) (#25179)
- markused: fix option map value (fix #25186) (#25188)
- parser,fmt,markused: add top level comptime `$if` support (enable
  `$if platform { import module struct Abc {} }`) (#25216)
- v.builder: add -DNO_DEBUGGING in addition to -DNDEBUG, when compiling with -prod
- v.builder: support `-d trace_type_symbols_after_checker`
- scanner: uncomment working rune test  (#25305)
- v.util: fix handling of "start \u005c${...} end" in cgen (fix #25304) (#25306)
- markused: fix marking of mutable generic method calls (fix #25312) (#25314)

#### Standard library

- x.crypto: initial addition of curve25519 module (#24748)
- thirdparty: add NDEBUG check before glGetErrorCode if-statement in sokol_gfx.h (#24754)
- math.big: remove unnecessary code from / and % (the same is done in div_mod, which they call) (
  #24766)
- builtin: add a rune iterator method to strings, allowing `for for i, r in s.runes_iterator() {`
  without first allocating an array for all the runes (#24769)
- builtin: support `-d builtin_free_nop` to help diagnose problems with too early manual free()
  calls
- builtin: use s.runes_iterator() in trim_runes/2 to avoid needless allocation
- builtin: add string.expand_tabs() (#24781)
- os: do not resolve symlinks in os.find_abs_path_of_executable/1 (fix #24759) (#24761)
- os: improve documentation (#24790)
- gg: allow for `-d gg_memory_trace_frame` to be used in combination with
  `-prealloc -d prealloc_dump`
- sync: add SpinLock (#24788)
- os: fix documentation for environ function (#24796)
- sync: fix documentation for new_spin_lock function (#24795)
- sync: add implementation for WaitGroup.go/1, add test (#24797)
- sync: improve documentation (#24799)
- sync: fix spin lock, add destroy() and try_lock(), add valgrind annotate support (#24798)
- os: add os.write_bytes/2 as a complement to os.read_bytes/1, add test
- sync: use SpinLock for channel (fix #24680) (#24802)
- crypto: fix ambiguous expressions in DES implementation (#24814)
- sync: use an atomic counter in test_waitgroup_go in waitgroup_test.v
- datatypes: add lockfree version of counter and ringbuffer (#24839)
- sync: add thread local storage (TLS) support (#24849)
- math.unsigned: fix rotate_left() for uint256, add test (#24872)
- math.unsigned: replace untested comments for uint256 public APIs (#24873)
- log: use `@[noinline]` for level_from_tag/1 and target_from_label/1 to avoid triggering panics for
  programs using `log`, compiled with -prod and -cc gcc>10 (fix #24874)
- math.big: fix toom-cook 3-way multiplication (#24888)
- runtime: add used_memory() (#24897)
- runtime: add note for the availability of the used_memory implementation (#24913)
- os: remove commented code in home_dir() function (#24929)
- math.big: fix the order of calculations in mod_pow() to improve performance (#24935)
- math.big: add shrink zeros to karatsuba and toom-cook (#24937)
- math.big: fix big_mod_pow() (#24939)
- os,runtime: move some C struct and fn def to `builtin` (#24942)
- math.big: fix validate_string and integer_from_regular_string (check for characters.len > 0,
  before accessing characters[0])
- builtin: prepare for adding a `-force-bounds-checking` option
- strconv: fix bounds check bug, discovered by the equivalent of
  `./v -g -force-bounds-checking test vlib/toml/` (thanks to tankf33der)
- builtin: fix OOB bugs in s.is_bin, s.is_oct, s.is_hex, discovered through
  `./v -force-bounds-checking test vlib/builtin/`
- regex: fix OOB bug discovered through `./v -g -force-bounds-checking vlib/regex/` (fix by
  @penguindark) (#24960)
- time: fix custom_format panic (fix #24977) (#24987)
- time: fix more panics in the supported specifiers in Time.custom_format/1 (#24988)
- vlib: add `archive.tar` module to enable reading of .tar ang .tar.gz files (#24995)
- builtin: fix warnings for `./v doc -m -f html vlib/builtin/`
- sokol.gfx: set the missed array_count field too in the `set_vert_uniform` and
  `set_frag_uniform` APIs (#25019)
- builtin: fix `assert "ä ö å æ ã ø ô é ë".title() == "Ä Ö Å Æ Ã Ø Ô É Ë"`
  (fix #25017) (#25026)
- Apply `@[markused]` to builtin_init, remove its heuristic from markused.v
- gg: improve drawing effect and logic of draw_rounded_rect_empty (#25062)
- math.bits: add asm implementations for some 64 bit ops (#25020)
- vls: autocomplete for module functions: e.g. `os. ...`
- math.big: move from u32 to u60 digits (#25018)
- os: simplify file.c.v using cross platform f.seek/2 calls, add EINTR handling to
  f.write_full_buffer/2 (fix #25107) (#25110)
- builtin: add arr.pop_left() func (#25133)
- math.big: refactor add_digit_array() (#25138)
- math.big: optimize add_digit_array() (#25139)
- math.big: optimize subtract_digit_array() (#25142)
- strconv: produce a maximum of 8 digits after the `.` for f32.str() (fix #25141) (#25144)
- math.big: restore and refactor str() and integer_from_string() (#25154)
- os: remove `unknown host OS` panic from os.get_host_os()
- flag: fix tail/single bool flag error condition logic in `flag_to.v` (fix #25166) (#25172)
- flag: improve the fix for #25166 tail/single bool flag error in `flag_to.v` (#25189)
- readline: fix wide char display width for Chinese characters (fix #25219) (#25220)
- repl: fix handling of lines with comments like `math.pi // comment` (fix #25229)
- time: always return utc() timezone for Time.unix/0 (fix #17784) (#25233)
- builtin: fix C prefix for proc_pidpath() (#25239)
- math.big: replace division with Knuth, improve performance (#25242)
- time: move the nanosecond comparison before the rest in the Time == Time implementation
- builtin: add a temporary ctovstring_impl/1 API to enable `ui` to compile cleanly for PR#25264,
  part 1
- json2: replace encoder with new implementation (#25224)
- json2: improve enum decoding; fix handling of required fields at the end of a json string (#25289)
- json2: improve checker with better EOF detection (#25075)
- json2: prepare for moving into json2 (#25039)
- json2: fix remaining json2 discrepancies (#25029)
- json2: support custom decoders (#25021)
- json2: fix number decoding and improve errors (#25015)
- json2: add support for decoding utf-16 surrogates, produced by some JSON encoder implementations (
  Python, Java, C#) (#25193)

- x.crypto: add a new `ascon` cryptographic module, based
  on https://doi.org/10.6028/NIST.SP.800-232 (Lightweight Cryptography Standards for Constrained
  Devices) (#25260)
- x.crypto.ascon: improve the core of Ascon permutation routine (#25278)
- x.crypto.ascon: improve single-shot functions of ascon hashing variant; add benchmark (#25282)
- x.crypto.chacha20: improves the internals of chacha20, add a bench (#25311)

### V interpreter

- Add comptime-if support (#24919)
- Reset return value after const eval and fix if-expr (#24955)
- Add more infix op support; fix early func return (#24965)
- Fix if-else; add infix op; fix func calls (#24972)

#### Web

- picoev: fix documentation (#24811)
- veb: fix `app.text()` -> `ctx.text()` in `README.md`
- net.http: fix panic in parse_multipart_form for invalid boundary (fix #24974) (#24976)
- net.http: remove debug println statement from post_multipart_form (#25030)
- net.http: reduce the false positives on the CI for server_test.v, let
  test_host_header_sent_to_server return early, when the server can not start
- net: improve tracing output for `-d trace_tcp`; move `error_code()` calls right after the
  corresponding C APIs (errno is a global that should be read immediately to be valid)
- veb: fix a spurious error with Chromium, for POST requests, split into 2 parts, 1st with only http
  headers, without body (fix #25191) (#25195)
- net.http: Use a full url when using a proxy, instead of only the path (#25228)
- net.http.file: allow for serving requests to static files with cache busting suffixes like
  `/dist/littlejs.js?1117`
- veb: fix generic field access from alias (fix #25215) (#25246)
- ci: change url to http://archive.ubuntu.com in .github/workflows/disable_azure_mirror.sh

#### ORM

- Support lowercase operators `like`, `in`, `not in` etc (fix #25032) (#25035)
- Fix sub_structs (fix #25104) (#25105)

#### Database drivers

- db: modify mysql/pg/sqlite interface for pool working (#24780)
- db.sqlite: fix get_text trimming data after (including) first 0 character (#25040)

#### Native backend

- Add comptime cpu archs support (#24956)
- Add support for (elf) globals  (#25016)
- Improve consts, support more assigns (#25277)
- Structs multi_assign and multi_return (#25281)
- Support more assign ops, reduce code duplication (#25283)
- Begin array support, `a := []Type{len: x, cap: y}` and `a[i]` read/write (#25299)

#### C backend

- Only run freestanding_module_import on amd64 (#24763)
- Fix sumtype option unwrapping (fix #24746) (#24770)
- Protect against unlimited recursion in type_default_impl, by converting to a verror/1 call instead
- Fix `static` and `volatile` var deref (fix #24778) (fix #24779) (#24807)
- Fix codegen for interface method closure get (fix #24810) (#24818)
- Fix codegen for multi return assignment with option type (fix #24812) (#24817)
- Fix if codegen when func parameter is option type (fix #24813) (#24816)
- Skip `struct none {` in cgen, if `none` is not used by V code reachable from `fn main() {` (
  #24824)
- Skip `struct map {` and related type declarations, when no V maps are used (#24826)
- Fix anon struct encode (fix #24836) (#24852)
- Fix json decode option alias (fix #24843) (#24853)
- Fix const indexexpr dep (fix #24850) (#24851)
- Fix codegen for generic interface with multi return generic type (fix #24838) (#24858)
- Fix anon struct init passing (fix #24879) (#24884)
- Allow alias to map `type Dict = map[string]string` (fix #24878) (#24883)
- Builtin,cgen,markused: add struct @[aligned] support for structs allocated on the heap too (
  #24886)
- Add a `__closure_init` call for sokol/gg programs on android as well (#24892)
- Allow alias types to be iterated if parent type has `next` method (fix #24890) (#24894)
- Use alias `next` method if defined in `for x in iterator {` (#24905)
- Fix const fixed array with type alias (fix #24936) (#24946)
- Fix callback codegen on generic struct resolution (fix #24947) (#24948)
- Move sort fn after interface definitions(fix #24465) (#24967)
- Fix struct field init within fn without result type (fix #24970) (#24973)
- Move closure C code to V code under vlib/builtin/closure/ (#24912)
- Parser,ast,checker,cgen: use enum comparisons instead of string ones on
  ast.ComptimeCall.method_name (#25003)
- Fix generic key's type with `in` operation (fix #24983) (#25011)
- Remove unused enum declarations too (#25033)
- Parser,checker,cgen: remove unused `err` declaration or `or { }` blocks (#25034)
- Add a test for builtin_init being present (part 2 of 4a6941a)
- Fix closures on s390x, ppc64le, loongarch64 platforms, add test to s390x CI (#25047)
- Fix anon fn checking adding unresolved generic type on codegen (fix #25050) (#25055)
- Fix building on Termux after fa904c4
- Use `#if defined __BIONIC_AVAILABILITY_GUARD && ...` to be compatible with more Termux versions
- Fix asm stmt separators (#25067)
- Fix translated file fixed-array assignment (#25080)
- Fix codegen for passing int from selector to voidptr expect arg (fix #25081) (#25083)
- Fix codegen for option void fn return block unwrap (fix #25074) (#25082)
- Fix alias to sumtype cast initialization (fix #25086) (#25091)
- Allow alias sumtype smartcasting (fix #25085) (#25096)
- Fix codegen for generic struct field array option (fix #25093) (#25097)
- Fix mutable sumtype (fix #25108) (#25111)
- Fix generic return assign to ComptimeSelector (fix #25125) (#25131)
- Fix address of call with `cast(&(arr.last() as Type))` (fix #23528) (#25132)
- Fix eq for anon C structs (#25152)
- Fix generated str method for enums that have C values (use ifs, instead of switch) (fix #25135) (
  #25157)
- Fix autofree with option array (fix #25124) (#25149)
- Fix assigning fn address (fix #24537) (#25158)
- Fix veb alias type identification and generic CastExpr (fix #24895) (#25155)
- Revert "checker,cgen: evaluate comptime `$if` results in checker *only* (fix #25123) (fix
  #25156) (#25150)"
- Evaluate comptime if results in checker only (with fixed -cross compilation) (#25162)
- Fix generic_fn_name generating incorrect names for C structs (#25164)
- Add comptime match support (#25165)
- Fix resolving generic interface field from generic struct (fix #23556) (#25182)
- Fix autofree used vars on return (fix #25196) (#25198)
- Fix hash stmt code generation (fix #25184) (#25207)
- Expose is_embed in FieldData (#25232)
- Fix alias enum used in comptime `$for` (fix #25211) (#25212)
- Ensure variable names do not conflict with builtin methods (fix #25063) (#25178)"
- Add `@[reused]` attribute to mark methods, reusing the receiver memory on return (needed for
  autofree) (fix #25221) (#25235)
- Fix gen_struct_equality_fn null pointer crash (fix #25237) (#25231)
- Allow generic alias enum comptime (fix #25249) (#25251)
- Fix big IntegerLiteral LL postfix (fix #25269) (#25275)
- Prefix `builtin` APIs with `builtin__` (#25264)
- Fix fixed-array const initializer (fix #25291) (#25293)
- Fix generic cast to sumtype of empty struct (fix #25263) (#25290)
- Fix option variadic arg passing (fix #25261) (#25273)
- Support for 64bit int 1 (#25236)
- Cgen,parser,markused: add export const support (fix #25300) (#25303)
- Fix i64 enum as a map key, when the enum values are too small (fix #25294) (#25310)

#### JavaScript backend

- Simplify comptime if; catch up with cgen (fix #25295) (#25313)

#### vfmt

- Fix `if x := g() { x } else { return }` adding newline after `return` (fix #24908) (#24945)
- Fix eating the attribute from `@[deprecated] pub type Alias = int` (fix #24968), workaround
  -usecache bug (#24969)
- Fix call expr with single line comment in or expr (fix #24659) (#25159)
- Fix comment line number in file with crlf line separator (fix #23524) (#25163)
- Add support for 64bit int with `-new_int` (part 2) (#25298)

#### Tools

- v.vmod,tools: support a repo_branch property in v.mod files, in addition to the existing repo_url
  property, to allow for backlinks to repos that use `main` instead of `master` as their core branch
- Make the output of `v should-compile-all` more immediately useful in CI jobs (turn off stdout
  buffering)
- Add support for `// vtest vflags: -w` in `_test.v` files, to allow `v -W test .` later, for files,
  that have known warnings
- ci: make sure the generator for vlang/docs can be compiled with latest V (prevent silent doc
  update stops, after breaking changes)
- Add cmd/tools/gg_split_memdump_to_frames.vsh to ease working with memdump.bin files generated by
  gg programs (split by frames)
- Add find_doc_comments_with_no_dots.v
- Improve summary output of find_doc_comments_with_no_dots.v
- Skip _test.v and _test.c.v files in find_doc_comments_with_no_dots.v
- ci: add report-missing-dots-in-doc-comments job
- ci: mark tcp_test.v and unix_socket_test.v as flaky (they still fail sporadically on the CI,
  although very rarely now)
- ci: add `-prealloc` self compilation checks on more platforms (#24891)
- docs,ci: check more vlib modules in the report-missing-dots-in-doc-comments job (#24928)
- ci: add a watchdog timer thread to ringbuffer_test.v, to make sure the program exits in a
  reasonable time (~10s). Let the test be retried 2 times in a row if it fails.
- ci: bump cross-platform-actions/action from 0.28.0 to 0.29.0 (#24952)
- ci: retry session_app_test.v 2 times, since it is network dependent, and sometimes (rarely) fails
- v.help: document the new `-force-bounds-checking` option
- Improve alignment for `v repeat "program" "program_that_is_over_10x_faster"`
- ci: add checks for compilation of vlang/gui to v_apps_and_modules_compile_ci.yml
- ci: retry 2 times vlib/net/http/server_test.v to avoid false positives for unrelated commits/PRs
- ci: force changes to vlib/x/json2 to trigger the full sanitized checks (the implementation there
  uses unsafe blocks and vmemcmp/3...)
- ci: workaround -usecache issue afte 2d87ac4
- ci: add a performance-compare-with-master job
- Fix `return""` in vdoc html output (fix #24979)
- ci,tools: implement support for VREPEAT_SILENT=1 and `v repeat -S`, to only show the summary of
  the runs, without the progress lines
- ci: fix the performance-compare-with-master job, when run on PRs (#25014)
- ci: trigger updates to the module docs, even if just only the static files for the doc generator
  are changed
- ci: make sure to always compare with the latest commit on the main V repo's master branch, when
  running .github/workflows/compare_pr_to_master.v
- ci: compare the sizes of small programs like hello_world.v, but generated with `-cc gcc` too
- ci: improve the alignment of the results of file size comparisons in compare_pr_to_master.v
- Improve the output of `./v doc -m -f html vlib/`
- Use `Copying` instead of `Generating` for the static resources in `./v doc -m -f html vlib/`
- ci: bump actions/download-artifact from 4 to 5 (#25051)
- v.help: document the `-is_o option` (in `v help build-c`) and add a test for it (#25052)
- ci: add experimental support for building V and testing on a Termux docker container (#25059)
- ci: use retry.sh for the `pkg install` in termux_ci.yml to reduce false positives.
- ci: update vlang/gui commit its latest e5cc33fe816fef33d718cb1b91f66d6bd38fb4a4
- ci: bump actions/checkout from 4 to 5 (#25095)
- ci: retry 3 times vdoc_file_test.v
- ci: add a build_on_ubuntu_25_ci.yml script, for testing bootstrapping with GCC 14.2.0 (#25109)
- ci: define TERMUX_VERSION in .github/workflows/termux_ci.yml instead of using `-os termux`, to
  make the emulation closer to a real Termux (#25128)
- ci: reduce timeout-minutes for CI jobs that are normally fast to help detect anomalies earlier (
  #25129)
- ci: add a disable_azure_mirror.sh script, and use it before `apt update` to reduce the recent
  timeouts during installing dependencies (#25147)
- ci: bump timeout-minutes to 15 in termux_ci.yml
- ci: bump actions/setup-java from 4 to 5 (#25153)
- ci: retry vlib/v/eval/interpret_test.v 2 times
- ci: bump retry time from 10 to 15 minutes (reduce false positives for slow dependency
  installations on the CI)
- ci: change the azure mirror URL in /etc/apt/sources.list too
- ci: use `awalsh128/cache-apt-pkgs-action@v1.5.3` instead of a manual `apt update/apt install`
  step, to leverage caching more (#25256)
- ci: check if `awalsh128/cache-apt-pkgs-action@v1.5.3` works on master (#25257)
- ci: extract .github/actions/cache-apt-packages-action/action.yml, use it in puzzle_vibes_ci.yml

#### Operating System support

- docs: add section in README for compilation on OpenBSD (#24775)
- crypto.ecdsa: add support for OpenSSL on OpenBSD (#24772)
- picoev: add implementation for OpenBSD using kqueue (#24801)
- log: fix `Unhandled Exception` on windows 7 (#24803)
- ci: migrate the remaining jobs from the deprecated windows-2019 image to windows-2022 (#24825)
- os: fix windows get_error_msg() leak (#24899)
- runtime: reduce allocations done in runtime.used_memory/0 on linux (#24901)
- ci: skip checking vlib/datatypes/lockfree/ringbuffer_test.v on the gcc-windows job for now
- runtime: add used_memory() implementation for FreeBSD (#24909)
- runtime: add used_memory implementation for OpenBSD (#24918)
- ci: skip ringbuffer_test.v in the tcc-windows and msvc-windows jobs too, to avoid flakyness for
  unrelated commits/PRs.
- ci: use FreeBSD version 14.3 after the bump of cross-platform-actions/action to 0.29.0 (#24953)
- time: fix timezone test on windows
- ci: add a release build for Linux on arm64 to release_ci.yml (#25064)
- thirdparty: add `thirdparty-linux-armv7_bdwgc.sh` for building `libgc.a` on ARMv7 CPUs (#25077)
- ci: bump retry count for server_test.v to 5 (reduce false positives on windows)
- ci: use `v build-tools` without flags for the tools-windows job
- os: eliminate warning for `v -cross -o vc/v.c cmd/v` on linux (part 2, see also 037a3b4)
- os,sync: enable running `v -cross -o x.c cmd/v` on windows too (part 1, fix V errors)
- ci: run .github/workflows/disable_azure_mirror.sh before all `apt update` commands, in
  ci/linux_ci.vsh, when run in a github CI runner
- ci: retry 3 times cmd/tools/vtimeout_test.v on windows, before failing
- os,ci: use a conditional include, instead of a platform file, to include libproc.h on macos only
- ci: run input_rune_iterator_test.v only on linux for now
- builtin: fix thread naming issue on Windows by ignoring RaiseException (0x406D1388) (#25270)

#### Examples

- Fix for `v build-tools` and `v build-examples` running on a i686 (the problem was discovered by
  @tankf33der)
- Add examples/sokol/sounds/simple_keyboard_synth.v
- builtin,markused: consider println of non string to use .str() method calls too, reduce generated
  C code for `v -cc gcc examples/hello_world.v` (#24996)
- Use a sieve of Eratosthenes in primes.v, to handle bigger inputs more efficiently
- vdoc: make -run-examples compatible with all output modes, not just the plaintext one
- vdoc: extract vdoc_run_examples_test.v from vdoc_file_test.v
- vdoc: implement -unsafe-run-examples and -check-examples support, add tests and document them
- builtin,vdoc: fix the examples for the builtin methods, so that
  `v doc -check-examples -time -f ansi vlib/builtin/` pass
- builtin,vdoc: make `v doc -unsafe-run-examples -time -f ansi vlib/builtin/` pass too
- vdoc: improve failed example report
- vdoc: support `v doc -check-examples -f none vlib/builtin`
- bitfield: fix `v doc -unsafe-run-examples -f none vlib/bitfield/` too
- arrays.parallel: fix `v doc -unsafe-run-examples -f none vlib/arrays/parallel/` too
- arrays: fix `v doc -unsafe-run-examples -f none vlib/arrays/` too
- compress.deflate,compress.gzip,compress.zlib,compress.zstd: fix
  `v doc -unsafe-run-examples -f none vlib/compress/` too
- sokol.audio: fix doc comment examples
- encoding.base64: fix doc comment examples
- math: fix doc comment examples
- readline: fix doc comment example by removing it
- semver: fix doc comment examples
- vdoc: enable example lines that have explicit imports too, fixup the remaining vlib examples, so
  `v doc -v -unsafe-run-examples -f none vlib/` could be added to the CI
- Add euler.v
- examples,gg: add examples/gg/grid_of_rectangles.v; add gg.Context.draw_rect_filled_no_context/5
  and gg.Context.draw_rect_empty_no_context/5
- veb.auth: update the README.md example (#25245)
- builtin: fix `v -W -Wimpure-v examples/hello_world.v` (move ctovstring_impl to builtin.c.v)
- Fix rune casting from u32 in rune.v (#25307)

## V 0.4.11

*19 Jun 2025*

#### Improvements in the language

- Support a new CPU architecture s390x (#24107)
- Add initial support for ppc64le (#24287)
- Add initial support for loongarch64 (#24343)
- Support `js"string literal"` for JavaScript strings (#24653)
- VLS mode in the parser for the new language server in pure V

#### Breaking changes

- Remove deprecations made before 2024-11-06
- Add a deprecation note for `any` arg, prevent `any` from being used as map key,value or array
  type (#24277)

#### Checker improvements/fixes

- Fix chan element type validation with inexistent type (fix #23978) (#24008)
- Do not allow auto (de)reference in PrefixExpr *
- Fix check for pushing on an unwrapped option array (fix #24073) (#24093)
- Fix wrong type hint on predicate arg type mismatch (fix #24122) (#24123)
- Fix array generic return checking (fix #24104) (#24214)
- Fix stack var outside usage when var is a mutable param (#24249)
- Fix codegen for multi return with array fixed (fix #24280) (#24282)
- Check anon struct field valid case (partial fix of #24284) (#24286)
- Add check for recursive array init on struct (fix #21195) (#24278)
- Fix inherited var turning in auto heap (fix #24306) (#24312)
- Remove redundant callexpr `c.expr(mut node.left)` rechecks for `ast.CallExpr` (fix #24353) (
  #24380)
- Do not allow &u8(0), force nil like we do with &Type(0)
- Relax the new warning, allow for `pub const pname = &char(C.SDL_POINTER)` to fix the clean
  compilation of code using vlang/sdl3
- Fix for with mut generic value (fix #24360) (#24426)
- Add check for decomposing to interface (fix #24441) (#24453)
- Fix generic option array arg passing to `[]T` (fix #24423) (#24457)
- Fix resolver for returning struct generic (fix #24493) (#24506)
- Reallow passing closures as voidptr parameters with no warning, to enable convenient interfacing
  with C libs
- Disallow invalid expr for `filter`, `count`, `any`, `all` (fix #24508) (#24540)
- Replace warning by notice for UTF8 strings validation (fix #24538) (#24543)
- Revise logic for reporting import conflicts with module names (#24539)
- Fix struct update expr checking, when an alias is used (fix #24581) (#24582)
- Fix fn var resolver (fix #24525) (#24542)
- Fix checking for int to array of interface (fix #24624) (#24625)
- Cycle through all `ast.ParExpr` first in `prefix_expr` (fix #24584) (#24588)
- Move `arr <<` logic to `check_append()`
- Fix mutable const bug (fix #14916)
- Allow for calling main() inside _test.v files
- Fix missing type bounding to match expr on `or{}` expr (fix #24656) (#24658)
- Add error for `if mut x != none {`, when `x` is an immutable option (fix #24692) (#24694)
- Fix compound selector smartcasting/option unwrapping (fix #24662) (#24712)
- Fix mutable option (fix #18818) (fix #24622) (fix #24101) (#19100)

#### Parser improvements

- Fix parse_cflag() support other flags between allowed_flags (fix #24121) (#24146)
- Minimise allocations done for the common case in find_struct_field
- Fix orm generic struct table type parsing (fix #24049) (#24149)
- Fix mutiple imports at one line (#24241)
- Fix range expr precedence on compound logical and operator (fix #24252) (#24275)
- Fix invalid field name checking (fix #24279) (#24283)
- Fix wrong string parsing (fix #24297) (#24298)
- Fix panic for `struct Abc { pub mut: }` (fix #24404) (#24403)
- Allow `mut static counter := 0` inside `unsafe {}` blocks (prepare for removing a `-translated`
  mode quirk)
- Fix duplicate mod imports (fix #24552) (#24559)
- Reduce memory usage of ast.ScopeObject and ast.Ident instances (#24704)

#### Comptime

- comptime: fix comptime parameter resolve for `unsafe { nil }` to be `voidptr` (fix #25558) (
  #25570)
- comptime: fix codegen ptr field reading from comptimeselector (fix #25616) (#25620)
- comptime: dont emit empty blocks (#26171)
- comptime: support type interpolation in the msg argument of `$compile_warn(msg)` and
  `$compile_error(msg)` (#24992)
- comptime: fix $match with fn type (#25271)
- Support `$if T is $pointer {` and `$if T is $voidptr {`, to make it easier to implement a pure V
  dump(), without cgen specific code (#24628)
- i32 is now `$int` too (fix #24346) (#24378)
- Fix `$dbg` with `@[heap]` structs (fix #23979) (#23989)
- Check invalid comptime field name assignment (fix #24415) (#24421)
- Enable s390x + docs (#24114)

#### Compiler internals

- Remove closure usage from the compiler frontend (simplify bootstrapping/porting on more exotic
  platforms)
- markused: support orm or expr (fix #24040) (#24059)
- markused: fix for gated index range on string (fix #24187) (#24200)
- v.util.version: fix output for V full version when VCURRENTHASH not defined (#24264)
- markused: fix generic method call mark (fix #24395) (#24399)
- v.pref: add get_build_facts_and_defines/0 and set_build_flags_and_defines/2
- v.util.version: fix output for V full version (followup on issue #24263 and PR #24264) (#24478)
- v.util: use internal diff (#24495)
- v.pref: prevent overriding backend (fix #21758) (#24526)
- markused: fix for generic ptr receiver on method call (fix #24555) (#24558)
- markused: fix `x := t.wait()`, when `t := go fn () string {` (fix #24577) (#24580)
- markused: fix printing smartcasted interface values (fix #24579) (#24583)
- pref: avoid changing the backend with `.js.v` when `-backend` has already been used (fix #7840) (
  #24654)
- Remove dump() calls inside the compiler itself (make bootstrapping of dump() implemented before
  cgen easier)

#### Standard library

- builtin: string.index_after() ?int
- cli: account for initial indent on subcommands (#23985)
- Remove `strings.Builder.clear()`, fix `array.clear()` not working in the JS backend (#23992)
- gg: make draw_rect_empty/5 draw more exact borders, independent of the device, and fitting the
  draw_rect_filled/5 shapes (#24024)
- sync: fix a helgrind false positive, for a data race, on PoolProcessor (#24023)
- sync.pool: restore the parallel operation (surrounding the cb call in process_in_thread in a lock
  in 1b52538, effectively disabled parallelism)
- x.crypto.chacha20: change internal cipher to support a 64 bit counter (related to #23904) (#24039)
- os: fix swap_bytes_u64 (#24033)
- x.crypto.chacha20: fix `xor_key_stream` failing after a while (fix #24043) (#24046)
- crypto.sha3: be big-endian friendly (#24045)
- x.crypto.chacha20: makes the underlying cipher routine aware of the 64-bit counter (#24050)
- x.crypto.chacha20: enable support for 64-bit counter (fix #23904) (#24053)
- x.crypto.slhdsa: add a SLH-DSA implementation, a stateless hash-based DSA, a post quantum
  cryptographic module (#24086)
- encoding.binary: add encode_binary()/decode_binary() generic functions (#24106)
- crypto.rc4: change the return type of `new_cipher` to be `!&Cipher` (#24113)
- crypto: add a `crypto.ripemd160` module (#24119)
- encoding.iconv: fix iconv on termux (fix #23597) (#24147)
- sync: remove the call to C.pthread_rwlockattr_setpshared (not needed, since it is the default on
  POSIX) (#24166)
- pkgconfig, termios: Support NetBSD (#24176)
- encoding.binary: fix serialize map struct (fix #24190) (#24192)
- builtin,v.gen.wasm: support `-b wasm -d no_imports` (#24188)
- datatypes: add a Set.array/0 method to help get all the elements from a set as an array (#24206)
- json: fix option time (fix #24242) (fix #24175) (#24243)
- log: add local time / utc time selection support (#24268)
- json: link with libm (fix #24272) (#24273)
- rand: add uuid_v7(), session function, simplify uuid_v4() (#24313)
- toml: fix handling of multiline string with CRLF (fix #24321) (#24322)
- toml: fix crlf escape check (fix #24328) (#24329)
- x.json2: add u16(),u32() (fix #24337) (#24342)
- rand: fix uuid_v7 seperator (#24348)
- rand: check the separators for the generated UUIDs in random_identifiers_test.v
- builtin: add string.is_identifier() (#24350)
- x.crypto.chacha20: add a check counter overflow to set_counter for standard mode (#24365)
- comptime: fix `$if var.return_type == 1 {` (fix #24391) (#24393)
- comptime: enable ppc64le, add docs (#24433)
- toml: add compile error when passing `encode/1` types of T != struct (fix #24435) (#24443)
- sync.stdatomic: workaround for libatomic.a indirect symbols tcc bug (fix #23924) (#24472)
- math.big: fix the + operator for big.Integer for negative numbers, add test (#24487)
- math.big: respect the sign of the dividend in % operator, add test (#24489)
- os: add note for the availability of the debugger_present implementation (#24492)
- term: add writeln_color() (#24463)
- math.big: add missing assert for test_multiply_karatsuba_02 (#24534)
- builtin: fix mix prod and debug ucrt lib (#24498)
- math.big: fix Karatsuba's add_in_place() function, add carry handler on exit (#24541)
- math: add `exp_decay` to `interpolation.v` (#24545)
- math.big: optimize divide_array_by_digit() (#24566)
- sync.stdatomic: add atomic types (#24561)
- sync.stdatomic: turn panic() in new_atomic[T]() into a $compile_error() (#24573)
- sync: add condition support (#24574)
- builtin: flush stdout on panic (#24606)
- Document the behaviour of % for negative numbers; in V: -10 % 7 == -3 (#24604)
- math.big: remove unnecessary casting from Integer.is_power_of_2/0 (#24614)
- math.big: make is_power_of_2() be false for negatives (it now matches Julia's ispow2/1) (#24619)
- vlib: vanilla_http_server (#24202)
- os: support `dotfiles := os.walk_ext('.', '', hidden: true)` (#24617)
- builtin: remove playground related code (the current playground uses a container/sandbox) (#24632)
- comptime: fix `T.indirections` comparison (fix #24630) (#24636)
- math.big: add test for radix_str() and integer_from_radix() (#24644)
- runtime: make free_memory() and total_memory() return Result types to allow for reporting errors (
  #24651)
- math.big: improve the performance of radix_str() ~9 times (#24666)
- math.big: speed up ~10x integer_from_radix() (#24674)
- sync.stdatomic: fix bug with add() and sub() returning the new values, add voidptr support, add
  swap() and compare_and_swap() (#24685)
- sync.stdatomic: add atomic_thread_fence(), cpu_relax() (#24690)
- v: support `@DIR` (as a comptime equivalent to `os.dir(@FILE))` at runtime) (#24742)
- thirdparty: print the glGetError() code on failure too in sokol_gfx.h, to make diagnostic easier
- builtin: make array.ensure_cap/1 public
- os.font: fixes for `-os android`
- vlib: add a pool module (#24661)
- zstd: make the api more V like
- szip: fix panic on empty files (#24335)

#### Web

- net: add `read_ptr/2` (from `read/1`) to `UdpConn` for consistency with `TcpConn` (#24000)
- net: make `close/0`, `select/2` and `remote/0` methods of `UdpSocket` `pub` (#24004)
- Fix $dbg on function that uses veb comptimecall (fix #23999) (#24088)
- veb: allow route methods, that are tagged with `@[unsafe]`
- veb: support `-d veb_max_read_bytes=16384`, `-d veb_max_write_bytes=16384`,
  `-d veb_default_port=1234`, `-d veb_max_http_post_size_bytes=8388608`
- net.http: support `v -http -d http_folder=vlib/_docs` (allow customizing the folder, port, and
  index file through CLI arguments to v -http)
- thirdparty: upgrade to mbedtls v3.6.3.1, add a .patch file with the local changes (#24602)
- veb: fix handling of default CorsOptions.allowed_headers (#24703)

#### ORM

- orm: fix default value quote (fix #24052) (#24057)
- orm: fix type alias not supported in table columns (fix #15478) (#24062)
- orm: fix gen sql complex where (fix #24136) (#24138)
- orm: skip orm_complex_where_test.v for `sanitize-memory-clang` too
- orm: add function call based builder API for dynamic queries (fix #24178) (#24196)
- orm: set default value for require field if database value is null (fix #24221) (#24222)
- orm: fix option field with default null value (fix #24222) (#24228)
- orm: add or_where() method to the builder (fix #24244) (#24250)
- orm: add IN and NOT IN (#24634)
- orm: add `in` and `not in` to orm_func (fix #24639) (#24642)
- breaking,orm: add table attrs; add table/field comment support for mysql and pg (#24744)

#### Database drivers

- db.mysql: use mysql datatype for alloc string_binds_map, not orm's (#24126)
- db.mysql: fix handling of nullable timestamp (fix #24120) (#24125)
- db.mysql: add null result support (fix #24130) (#24131)
- db.mysql: use hardcoded const declare (fix #22086) (#24162)
- db: connection pool (#24161)
- db: mysql,pg,sqlite add transaction support (fix #24290) (#24352)
- db.pg: fix incompatible fn signature (#24549)
- db: add redis (#24730)

#### Native backend

- native: use builtin exit function (#24578)
- native: improve string support (#24600)
- native: implement `for in string` for amd64 (#24613)
- native: support nested structs, improve support for right expr of IndexExpr (#24627)
- native: leave only the unique paths in g.linker_include_paths, before doing lookups
- native: support C constants (#24660)
- native: add a temporary special case for `C.EOF` (#24724)

#### C backend

- Fix parallel cached_type_to_str access (fix #23980) (#23998)
- Fix codegen to make mutable sumtype working (fix #23982, part 1, needed for bootstrapping) (
  #23988)
- Fix arm64 asm operand position; fix arm64 asm imm; support arm64 dot instruction (#24017)
- Fix mutable ptr sumtype  (#24021)
- Fix asm comments of arm32 (#24025)
- Allow asserts inside fns, called in const/global initialization, in test files (fix #24029) (
  #24031)
- Fix codegen for option return unwrapping on last statement (fix #24026) (#24030)
- Fix match option with case non option (fix #24047) (fix #24048) (#24051)
- Support measuring programs, that use multiple threads in the new profiler column (turn
  `prof_measured_time` into a thread local, for the supported C compilers) (#24061)
- Fix `@[keep_args_alive]` with ptr (fix #23973) (#24058)
- Remove unused macro V64_PRINTFORMAT
- Fix option array push on unwrapped array (fix #24073) (#24079)
- Fix nested array support for the orm (fix #19327) (#24080)
- Fix `x in [...]!` operator with fixed arrays (fix #24082) (#24083)
- Fix codegen for comptime multiline attr (fix #23964) (#24087)
- Fix codegen for selector with embed field option (fix #24084) (#24085)
- Fix generic result return (fix #24097) (#24100)
- Fix showing the expression, as literal value, in case of `assert s[x..y] == "literal"` (fix
  #24103) (#24105)
- Fix codegen for option unwrapped var passed to generic option type (fix #23972) (#24096)
- Fix selector option unwrapping on infix (fix #24108) (#24115)
- Sort the paths, used in coutput_test.v
- Skip emitting mman.h and pthreads related code, for freestanding builds (#24118)
- Add s390x assembly support + test (#24129)
- Parser,checker,cgen: fix wrong auto heap deref of auto `index` loop var (fix #24117) (#24124)
- Fix non-voidptr to voidptr on `-cstrict` + notice about such usage (fix #24139) (#24143)
- Fix multi return with option type (#24144)
- Remove obfuscation (`strip` should be used instead); temporary fix for usecache + toml
- Fix zero left padding (fix #24199) (#24201)
- Fix variadic sumtype args passing (fix #24150) (#24207)
- Fix codegen for const to c string (fix #24235) (#24248)
- Fix codegen for fixed array init with init using structinit (#24269)
- Fix missing braces for const init with castexpr from option unwrapping expr (#24276)
- Fix codegen for index expr on for loop with branchstmt (fix #22760) (#24289)
- Fix codegen for assigning fixed array on defer var (fix #24300) (#24305)
- Fix codegen for multi return with aliased fixed array (fix #24280) (#24295)
- Fix codegen for nested selector unwrapping on lhs (fix #24292) (#24293)
- Add ppc64le assembly support + test (#24299)
- Fix s390x closure thunk (use floating point register) (#24258)
- Fix riscv64 closure thunk (use floating point register) (#24315)
- Fix codegen for writing on unwrapped selector (fix #24316) (#24323)
- Fix codegen for thread.call() on var auto heap (fix #24326) (#24327)
- Fix codegen for handling multiple return result type on call (fix #24341) (#24344)
- Fix codegen for nested selector option ptr (fix #24339) (#24345)
- Fix arm64 closure + remove stub in test (#24332)
- Workaround tcc aarch64 bug (fix #24331) (#24354)
- Fix riscv32 closure (#24355)
- Fix codegen for anon option fn struct field init (fix #24392) (#24400)
- Fix `if mut var != none {` for optional interface values (fix #24351) (#24410)
- Fix interface `unsafe {nil}` comparison and initialization (fix #24374) (#24411)
- Ast,cgen,parser,pref: support loongarch64 inline assembly, add test (#24440)
- Fix array init with interface element type (fix #24442) (#24454)
- Fix const declaration dependant mapping when using update_expr (fix #24437) (#24455)
- Fix comptimecall with map receiver (fix #24448) (#24449)
- Fix assign from `for mut var in arr {` to pointer (fix #24432) (#24456)
- Workaround tcc aarch64 fn call bug (fix #24473) (#24477)
- Workaround tcc aarch64 spawn call bug (fix #24482) (#24483)
- Fix map of fixed array value in if guard (fix #24488) (#24496)
- Fix codegen for assigning `nil` or `0` to option ptr field (fix #24447) (fix #24500) (#24502)
- Fix codegen for array of option element auto eq `a == [?int(none)]` (#24504)
- Fix codegen inconsistency handling `nil` param to arg expecting ptr (fix #24491) (#24503)
- Fix pattern generated by `const_init_or_block.vv` in `vlib/v/gen/c/coutput_test.v`, when
  VFLAGS=-no-parallel is used
- Fix tmp var redeclaration on const inited later (fix #24521) (fix #24517) (#24524)
- Fix generic name handling for struct generic (fix #24530) (#24565)
- Fix initialize error object in or_block (fix #24529) (#24576)
- Improve the readability of `switch() {` statements, generated by `match() {` ones (#24618)
- Reduce v.c size by ~4% by removing comments and using shorter literals
- Fix enumval str() call on stringinterliteral (fix #24702) (#24705)

#### JavaScript backend

- Fix array type checking in sum type match expressions (fix #24237 ) (#24259)
- js: fix callbacks in structure parameters (fix #24260) (#24324)
- Fix array initialization with "index" and "it" (fix #24397) (#24429)
- Cannot assign unsafe nil values (fix #24407, #24436) (#24458)
- Fix alias type initalization (fix #24475) (#24480)
- Fix casting (fix #24512) (#24519)
- Alias types are not properly resolved (fix #24486) (fix #24507) (#24514)
- Implement Map.keys() and Map.values() methods (fix #24209) (#24608)
- Fix string.runes method (fix #20500) (#24609)
- Fix direct map key access and map.len (fix #24616, fix #24605) (#24620)
- Fix map to string fails on rune keys (fix #24637) (#24638)
- Fix maps being always constructed using string keys (fix #24607) (fix #24671) (#24673)
- Fix slightly incorrect JS (esbuild was broken on master) (fix #23711) (#24676)

#### vfmt

- Convert `"hello".str` => `c"hello"` (fix #24635) (#24652)

#### Tools

- Let test_os_process.v use `unbuffer_stdout()` to make the output more reliable
- os,tools: make easier analyzing process_test.v failures on the CI
- ci: fix build conditions that had `sanitize-memory-clang?` instead of `sanitize-memory-clang`
- ci: skip running the `s390 CI` job for simple doc/yml changes (#24160)
- ci: fix shell script issues reported by actionlint (#24168)
- Remove the `src` subdir from projects, created by `v new` (#24236)
- Add support for `// vtest build: !os_id_ubuntu?` tags in the _test.v files, detected by `v test`
- ci: fix `v -o v2 -usecache cmd/v` after ad5b829
- Fix vrepl for `import mod { f }` (#24340)
- ci: debug hub_docker_ci.yml issue (try 1, disable cache, run linters)
- ci: debug hub_docker_ci.yml issue (try 2, add concurrency group, add a persistent single builder
  `gh-builder`)
- ci: debug hub_docker_ci.yml issue (try 3, restore the cache-from:/cache-to: lines)
- ci: fix hub_docker_ci.yml issue - comment out the cache-from:/cache-to: lines again
- Support vreduce timeout, vreduce custom run command (#24359)
- Rewrite `v timeout`, support killing the child process on timeout by default (#24367)
- Use breadth first search in vreduce (#24369)
- Vreduce fix var names (#24373)
- Fix `v timeout 2 sleep 5`
- Fix `./v -d network test cmd/tools/vpm`
- ci: reduce false positives for cover_test.v and vdoc_test.v
- Save the modified content more frequently in `v reduce`, fix timeout leaks (#24405)
- Reduce padding for `v doc` produced html nodes too
- ci: reduce the noise in check annotations for github PR reviews, due to the new warning in
  option_test.c.v
- Improve show_ancient_deprecations.v, by ignoring false positives for deprecation tags in //
  comments
- Check for Git repository in `v doctor` (packaged V versions often lack a .git/ folder) (fix
  #24419) (#24420)
- vlib,tools: add an `arrays.diff` module, implement a simple platform independent tool
  `v diff file1.txt file2.txt` using it (#24428)
- ci: bump creyD/prettier_action from 4.3 to 4.5 (#24439)
- ci: use `v retry` to reduce the false positives for retrieving the dependencies for vinix too
- ci: show `hg version` too, to ease the diagnosing of install_version_test.v failures
- Let cmd/tools/vpm/install_test.v use a .hg/hgrc file too
- repl: fix typeof(a) with warning (fix #24499) (#24515)
- Make `v doctor` show CFLAGS and LDFLAGS too (if set)
- Make `v search ui` work again through the vpm site (fix #23966) (#24535)
- ci: fix unused var warning in cmd/tools/vpm/common.v
- ci: prevent future changes to cmd/tools/vpm/common.v, that introduce warnings/notices to pass in
  PRs
- x.benchmark: align the output of BenchmarkResult.print/0
- Ease diagnosing CI failures of vtimeout_test.v
- ci: make sure that only one copy of native_test.v is executed at once, when run through
  `v test vlib` (fix #24505)
- Ignore .db and .sqlite files by default in `v watch` (such DB files are very likely to change
  during prototyping)
- .gitignore: ignore .db and .sesskey files as well
- ci: bump creyD/prettier_action from 4.5 to 4.6 (#24687)
- Make  `v doc -f md module` output useful by default (#24737)
- ci: fix native_backend_ci.yml concurrency group setting (prevent jobs for different commits on
  master to cancel each other)
- Fix overflow detected in the sanitized runs on the CI (#24064)
- ci: reduce code duplication in linux_ci.vsh

#### Operating System support

- os: implement Process.is_pending() on windows (fix #23990) (#23993)
- os: support .set_environment() on windows too (fix #10628) (#23996)
- thirdparty: update thirdparty-linux-amd64_tcc.sh, to also record its own full invocation command,
  and commit the changes automatically
- thirdparty: add thirdparty/build_scripts/thirdparty-freebsd-amd64_tcc.sh
- ci: reduce false positives for slow runs of the gcc-windows job
- gg: fix screen_size() on macos with multiple displays
- ci: add riscv64_linux_ci.yml (based on QEMU) as well (#24181)
- ci: use `apt update` before `apt install` in cross_ci.yml, to make the linux job more robust
- thirdparty: add thirdparty/build_scripts/thirdparty-macos-arm64_tcc.sh for compiling tcc on
  macos (first draft)
- Simplify the implementation of get_linux_os_name in `v doctor`
- os.filelock: compile without warnings with gcc on windows
- ci: use windows-2025 for the gcc-windows job (since it has gcc 14.2.0) (#24304)
- ci: skip option_ptr_unwrap_test.v on windows with msvc (#24320)
- os: fix windows rmdir GetLastError() (fix #24356) (#24357)
- Enable windows tcc_backtrace() support (#24377)
- ci: reduce false positives for init_global_test.v on windows (retry it 2 times)
- ci: reduce false positives for orm_func_test.v on windows (retry it 2 times)
- os: force using `C.CREATE_NO_WINDOW` on windows in os.raw_execute/1 (fix #24390) (#24418)
- Fix v doctor output on FreeBSD ; do not run ldd to get the glibc version (#24427)
- runtime: improve free_memory implementation for OpenBSD, by getting the stats from its UVM
  system (#24431)
- runtime: fix cast error in free_memory implementation for OpenBSD (#24445)
- Use a `.hg/hgrc` file for install_version_test.v (workaround windows failure)
- os: add debugger_present implementation for OpenBSD (fix #23603) (#24490)
- veb: reduce veb_max_write_bytes from 16KB to 2KB (fix sending large dynamic responses from veb on
  macos/freebsd) (fix #24523) (#24522)
- os: fix os.File's tell/0 method for windows (fix #24217) (#24218)
- net.openssl: replace SSL_get1_peer_certificate by SSL_get_peer_certificate for OpenBSD (#24556)
- net.mbedtls: disable AES-NI on OpenBSD with tcc (fix #22239) (#24560)
- net.mbedtls: enable MBEDTLS_THREADING_C and MBEDTLS_THREADING_PTHREAD on OpenBSD (#24572)
- thirdparty: add thirdparty/build_scripts/thirdparty-openbsd-amd64_tcc.sh for compiling tcc on
  OpenBSD (#24592)
- v.builder: enable -fwrap for C compilation on OpenBSD too (#24585)
- v.pkgconfig: add the default `/opt/local/lib/pkgconfig` for MacPorts on macos (#24626)
- sync: increase retries for vlib/sync/select_close_test.v to 3, to reduce CI false positives in the
  gcc-windows job
- ci: remove script to build tcc on FreeBSD (obsoleted by
  thirdparty/build_scripts/thirdparty-freebsd-amd64_tcc.sh) (#24681)
- encoding.iconv: add path for iconv library on FreeBSD (#24682)
- native: skip linux.vv too, for the sanitized jobs (similar to libc.vv)
- ci: migrate from windows-2019 runner to windows-2025 runner in most jobs (github deprecated the
  2019 runner) (#24672)
- runtime: fix -cstrict compilation (use usize() cast in free_memory) on OpenBSD (#24696)
- Remove specific case for FreeBSD in `cmd/tools/vtest_test.v` (#24707)
- docs: add section in README for compilation on FreeBSD (#24706)
- thirdparty: add script to build libgc on FreeBSD/amd64 (#24717)
- builtin: use local static libgc for FreeBSD with tcc (fix #24710) (fix #24683) (#24720)
- ci: update and improve FreeBSD CI (#24726)
- ci: add CI for OpenBSD (#24732)
- gg: fix .char event handling for backspace, delete, tab and enter for linux/x11 (send appropriate
  .char codes to the apps, similar to macos)
- Add aarch64 atomics support in thirdparty/stdatomic/nix/atomic.h (fix #24294) (#24296)
- v.trace_calls: now musl has gettid(), there is no need for the shim on newer Alpine etc (#24245)

#### Examples

- Fix `v -os wasm32_emscripten -o ms.html examples/gg/minesweeper.v` (use os.asset to load the font,
  avoid the implicit closures for the frame/event callbacks)'
- Update rotating_textured_quad.v with instructions on how to compile/run it with emscripten and a
  browser
- Add a small examples/gg/bouncing_balls.v simulation of falling balls
- Fetch 30 stories instead of 10 in examples/news_fetcher.v
- Add sync_pool.v for easier testing/diagnosing issues with the `sync.pool` implementation on
  different platforms
- Add a `-profile` report column, to show only the func time, *excluding* the accumulated children
  calls time (usable through `./v -profile - run a.v |sort -nk3` for example) (#24056)
- doc: improve Shared and Channels's topics, add more examples (#24155)
- orm: fix option type, convert from int to i8, add examples, etc (fix #24211) (#24213)
- Fix optional callback parameter and improve examples (fix #24325) (#24336)
- Reduce padding for code examples, to fit more examples on the same screen without scrolling
- Cleanup unsafe{} blocks that are not needed anymore in examples/sokol/08_sdf/sdf.v
- Show the number of pushes in sokoban too
- os.asset: add read_text/2 too, use it to simplify the sokoban example
- Support directly loading sokoban level files by path
- Add more Sokoban levels
- Support boxoban style collections of levels files (
  from https://github.com/google-deepmind/boxoban-levels/)
- Add a simple sudoku solver
- Add primes.v, that shows how to get command line arguments, and use loops and functions
- Add a small memory game (#24643)
- Cleanup memory.v (reduce it to 135 lines)
- builtin,os: enable no warnings for gg programs like
  `v -gc boehm_leak -cg -keepc run examples/gg/minimal.v` (part 1 - before the `gg` loop) (#24749)

## V 0.4.10

*20 Mar 2025*

#### Improvements in the language

- Implement assignable anonymous struct (fix #23855) (#23857)
- Remove ancient deprecations (#23479)

#### Breaking changes

- Make old `[attr]` syntax an error (`@[attr]` has to be used instead)
- builtin: `string.index_after()` now returns an Option (like `string.index()`), use
  `string.index_after_()` for the old behavior
- Vweb is now deprecated in favor of faster and more stable and easy to use veb

#### Checker improvements/fixes

- Allow `none` to be passed to `?T` param (fix #23381) (#23385)
- Fix `for` iterator method `.next()`, not marked as used (fix #23312) (#23321)
- Fix generic var inferring to be passed to `[]T` (fix #23315) (#23322)
- Clean up and optimise infix - reduce `as` casting (#23327)
- Fix structinit validation on nested generic Map[K]V (fix #23329) (#23332)
- Fix comptime indexexpr resolving (#23333)
- Fix comptime evaluation on infix expr (fix #23341) (#23344)
- Fix alias to fixed array w/ size defined by constant (fix #23356) (#23357)
- Fix missing option variable checking when casting using `as` operator (fix #23349) (#23358)
- Fix assign expected type on rechecking enum assigns (fix #23366) (#23367)
- Allow calling `foo(?i64(123))` for `fn foo(x ?I64) {` and `type I64 = i64` (#23373)
- Cache `node.args[0]` on `fixed_array_builtin_method_call` and `array_builtin_method_call` (#23411)
- Fix missing check for invalid prefixexpr expression `&(&var)` (fix #23365) (#23418)
- Disallow `&((&a))` and similar expressions, with innermost `ast.PrefixExpr` (enhance #23418) (
  #23419)
- Fix call with mut arg with different pointer levels (fix #23157) (#23428)
- Fix missing detection for `return` in lockexpr stmts (fix #23434) (#23435)
- Do not allow auto reference of voidptr params
- Check if unwrapped `m[key]` if m is `Option` (fix #23446) (#23459)
- Builtin,checker: remove `@[markused]` from `fn isnil()`, set
  `c.table.used_features.auto_str_ptr = true` instead (#23464)
- Fix checker generic alias type (fix #23474) (#23475)
- Fix missing check for `a := [none]` (fix #23457) (#23504)
- Fix missing check for concrete type on match branch expr (fix #23506) (#23508)
- Fix missing check for invalid argument for builtin (fix #23511) (#23515)
- Fix selector nested unwrapping (fix #23519) (#23521)
- Fix message with old attr syntax (#23529)
- Cache repeated `node.args.len`, `method.generic_names.len`, `node.concrete_types.len` and
  `node.op.str()` (#23536)
- Disallow `expr is Type` if expr is Optional (fix #23486) (#23510)
- Make `option_var.str()` an error, when done without unwrapping it first (fix #23557, fix #23558) (
  #23563)
- Fix private symbol visibility checking (fix #23518) (#23543)
- Disallow constant modification on unsafe {} (#23588)
- Fix sumtype variant option type mismatch (#23659)
- Disallow `arr = voidptr(0)` (fix #23675) (#23687)
- Allow for `module no_main` programs, that can redefine their own main function, or not define any
  of their own as well
- Fix match branch checking of nonreturn call on last expr (fix #23698) (#23699)
- Check and error for invalid utf8 string literals (#23721)
- Fix call from unknown enum (fix #23728) (#23730)
- Add checker for passing multi return as arg to func that expects less param (fix #23735) (#23744)
- Fix spreed operator ref field validation (fix #23759) (#23760)
- Fix missing check for method that returns veb.Result (fix #23647) (#23762)
- Allow generic operators to be called in fn (fix #23773) (#23774)
- Fix missing struct cast validation (fix #23748) (#23788)
- Fix map when casting to interface (fix #23790) (#23799)
- Allow for `pub type C.HINSTANCE = voidptr`, being used in
  ```
  @[export: "wWinMain"]
  fn mymain(x C.HINSTANCE, xprev C.HINSTANCE, lpcmdline &C.WCHAR, cmdshow int) int {
  ```
  in `module no_main` programs (#23812)
- Add option type inference on if expr (implement most of #23827, except the error for
  `v := if c { none } else { none }`) (#23829)
- Add missing check for IfExpr and MatchExpr with no valid type (#23832)
- Fix MatchExpr type inferring, when `none` is used (fix #23831) (#23833)
- Add missing check for generic fntype type names (fix #23453) (#23850)
- Add checking for comptime assign without comptime if checking (fix #23796) (#23848)
- Fix option ptr field assign checking (fix #23879) (#23880)
- Add missing `any` type validation on assignment (fix #23905) (#23906)
- Add fntype casting validations (#23872)
- Fix signed integer literal overflow error, when most significant bit occupies signed bit (fix
  #23782) (#23919)
- Add missing check for casting generic type to literal values (#23915)
- Check if next() method infers generic type correctly (fix #23927) (#23932)
- Disallow references to constants (fix #23935) (#23942)
- Fix typeof evaluation for generic reference (fix #23951) (fix #23952) (#23958)

#### Parser improvements

- Reduce allocations in empty_comptime_const_expr (#23324)
- Add error for array init of Results `[]!type{}` (fix #23360) (#23375)
- Allow map cast syntax `map[k]v(expr)` (#23401)
- Inline some commonly used fns (#23535)
- Fix anon fn return type option/result followed by comment parsing in vfmt mode (fix #23607) (
  #23608)
- Keep track of the number of all scanned tokens too, and show it with `-stats`
- Fix the error message position, for a `struct Abc`, that lacks a body (#23627)
- Prevent unused warning on `import mod { Sym }`, when `Sym` is later used, for more cases (fix
  #23412) (#23626)
- Add support for `-d trace_parse_file_path_and_mod`, to help diagnosing module lookup problems
- Allow for `@[has_globals]` to be used for all V programs, turn the `@[wasm_import_namespace]`
  error into a notice
- Remove table dep for script main check
- Fix enum value parsing inside array initialization (fix #23937) (#23941)
- Fix the registration of fixed arrays, when size_expr is a const (fix #23946) (#23949)
- Disallow invalid expr in comptime `$for` (fix #23953) (#23959)

#### Compiler internals

- markused: fix `-skip-unused` on a short program, that prints array (fix #23436) (#23437)
- markused: fix `eprintln(err)` on imported module on short program (related: #23498) (#23499)
- markused: fix markused auto str detection (fix #23501) (#23503)
- markused: fix option ptr printing (fix #23559) (#23562)
- checker,markused: add identification for sumtype.type_name() call (fix #23732) (#23739)
- markused: improve stability (avoid runtime crash) when processing generic functions (partial fix
  for #23927)
- markused: fix markused behavior on array / map index getter / setter / slice (#23931)
- markused: fix markused behavior on struct field's default expression (fix #23909) (#23933)
- builder: do not search for msvc when it is not needed (#23386)
- pref: stop parsing CLI options, on encountering `--` (#23470)
- util: show `unknown command` suggestions, for more misspelled variants, like `v sefl`; make
  util.new_suggestion calls parametrizable
- pref: add Preferences.vroot_file/1 (done here, without using it, to ease the bootstrapping of the
  cheaders extraction, that will follow next)
- pref: fix panic in parse_args_and_show_errors, called with no args (fix #23713) (#23794)
- pref: allow for `-os wasm32_emscripten` and filtering `_d_wasm32_emscripten.c.v` and
  `_notd_wasm32_emscripten.c.v` files. (#23797)
- v.builder: show the last line of the C compiler output, in case of errors, in addition to the
  truncated first lines (the last line is useful, since it usually has an error counter)
- os,v.transformer: fix warnings for
  `./v -os cross -o vc/v.c cmd/v && clang-18 -o v_from_vc vc/v.c -lpthread`
- util: fix stack overflow during parsing of `#flag -DName=$d(...)` (#23895)
- builder: extract Builder.show_parsed_files/0 to make it easier to debug import/parsing issues
- builder: remove forgotten b.show_parsed_files/0 call
- util.version: centralise the use of `@VCURRENTHASH`, to minimise the vlang/vc diffs for each
  commit
- builder: support `-d trace_parsed_files`
- util: shorten the V paths used in the C `#line` directives with tcc (the ../../../.. etc is no
  longer needed with newer tcc) (#23974)

#### Standard library

- json: fix default struct field initialization with long array (#23355)
- markused,builtin,strconv,vlib: reduce generated C sizes for compilers != tcc, for short programs,
  by simplifying the generation of backtraces, and reducing string interpolations in panics (#23380)
- thirdparty/sokol: allow `-cflags -D_SGL_DEFAULT_MAX_VERTICES=4194304` to customize how many
  vertices you can send through gg/sokol in a frame
- crypto.ecdsa: expand ecdsa module, to support other curves like secp384r1, secp521r1, secp256k1 (
  #23407)
- crypto.ecdsa: fix memleaks, reported by the CI sanitizer jobs (#23450)
- ci: force the checking of changed vlib/crypto/ecdsa files with the sanitizer jobs
- builtin: add a `@[markused]` tag to `isnil()`, because cgen generates calls to it in some cases (
  #23462)
- builtin: reduce a bit the generated #if defined checks for small programs (#23484)
- crypto.ecdsa: improve safety checking, unify signing (and verifying) api to accept options (
  #23463)
- regex: fix misspelled word "firts" in replace_n description (#23514)
- os: add split_path/1: `os.split_path('/usr/lib/test.so') -> ('/usr/lib','test','.so')`; fix
  platform dependent behaviour of os.dir/1, os.base/1, os.file_name/1 (#23532)
- breaking,log: set stderr as default log output, add .set_output_stream() to allow for opting in
  the old default of stdout (#23444)
- builtin: add `-prealloc -d prealloc_memset -d prealloc_memset_value=65 -d prealloc_dump`, to
  better analyze the memory patterns of running V programs
- builtin: change the default builder size used for string interpolations, from 256 bytes to 64
  bytes
- gg: mark create_image_with_size as deprecated (image resizing is done by `stbi.resize_uint8/3`,
  with a different fn signature) (#23580)
- crypto.ecdsa: split out the C wrapper to a new .c.v file (#23595)
- builtin: add &u8.free() (fix #23592) (#23598)
- crypto.ecdsa: fix bug in .with_no_hash handling (#23612)
- crypto.ecdsa: fix handling of sign() with custom_hash (#23619)
- runtime: add note for the availability of the free_memory/0 implementation (#23620)
- builtin: make public the `FnGC_WarnCB` alias (#23633)
- os: add disk_usage/1 (#23634)
- builtin: add string.split_by_space() (#23651)
- crypto.ecdsa: migrate `ecdsa.PrivateKey.new()` to use a high level API (#23640)
- gg: fix incorrect Event.mouse_x and Event.mouse_y on gg.Context.event_fn and gg.Context.on_event
  on HiDPI displays (#23668)
- crypto.ecdsa: migrate generate_key and simplify it (part 3) (#23662)
- encoding.csv: add support for multithreading to `encoding.csv.RandomAccessReader` (#23677)
- v.builder: add` os.quoted_path()` to os.system calls using v.pref.out_name, for the compress
  flag (fix #23685) (#23686)
- time: reduce chances of failures on the CI, by time_test.c.v; make the failure diagnostic easier
- time: improve the robustness of time_test.c.v (check if the diff is within ±1 second of the
  current timezone difference)
- crypto.ecdsa: migrate core routines for signing (and verifying), it now requires using OpenSSL 3 (
  #23705)
- all: use arguments() instead of os.args in some files
- math.big: fix 1/115792089237316195423570985008687907853269984665640564039457584007908834671663
  leading to panic (fix #23771)
- v.cflag: support `#flag $when_first_existing(libABC.a, /some/path/libABC.a, ...)`, without
  panicing (unlike `#flag $first_existing(...)`) (#23780)
- term: add more comments in vlib/term/README.md
- log: fix panic on mutex destroy, when exiting a program, while a thread is still logging
- log: fix valgrind_test.v failure
- math.vec: add `rotate_around_*` (cw/ccw) functions to `vec.Vec2[T]` (#23807)
- math.big: bump newton_division_limit to 1_000_000 (workaround issue #23806)
- math.big: add vlib/math/big/big_division_test.v (follow-up to 270941a)
- strconv: fix strconv.atof64() inconsistency with the other .ato functions; make it return an error
  by default, when it detects an extra non number character after a number (#23815)
- os: add File.write_u8/1 and File.read_u8/0 helper methods
- ci,os: fix bootstrapping with `-os cross -o vc/v.c` (avoid the generic calls in the new write_u8
  and read_u8)
- log: remove the notice about the stdout -> stderr migration (#23837)
- veb: fix "error parsing request: io.Eof" when expecting a request body, but the data is not ready
  yet (fix #22464) (#23842)
- json: fix json.decode autofree codegen (fix #23834) (#23839)
- time: add .week_of_year() method for time.Time instances (#23838)
- time: add documentation for remaining time-related functions and ISO 8601 parsing (#23867)
- crypto: add missing doc comments for public methods (#23864)
- builtin,os: fix warnings for `./v -os cross -o vc/v.c cmd/v && cc -o v_from_vc vc/v.c -lpthread`
- crypto.ecdsa: migrate new_key_from_seed to use high opaque, simplify the logic (#23876)
- math: fix `./v -prod -cstrict -cc gcc-11 vlib/math/math_bench_test.v` (use unions to implement
  f64_bits/1 and f64_from_bits/1 for compilers != tcc)
- crypto.ecdsa: complete the migration to the newer OpenSSL APIs (follow up to #23876) (#23877)
- x.json2: add a convenience Any.as_map_of_strings/0 method
- cli: add missing struct members to str() method and fix some comments (#23893)
- crypto.ecda: improvement the performance of `PrivateKey.new` by avoiding match+assignments (
  #23899)
- crypto.ecdsa: improves internal function of `calc_digest_with_evpkey` (#23901)
- crypto.aes: fix notices about order of operations (fix #23898) (#23902)
- Revert "math.bits: port changes from e66e996, so that `-cstrict -cc gcc-11` passes for `markdown`
  as well"
- crypto.ecdsa: improve the performance of the `.public_key` method of `PrivateKey` (#23920)
- gg: add is_key_down/1 helper method
- datatypes: optimize linkedlist (fix #23928) (#23934)
- x.json2: fix "\\" scanner bug, disallow (ch < 0x20) unescaped control characters (#23954)
- crypto.ecdsa: improve internal `sign_digest` routine (#23960)

#### Web

- veb: add `ctx.no_content()` + prevent content-type being set if the mime type is empty (#23425)
- net.ftp: use unsafe { nil }
- net.smtp: make public the Attachment fields (to be used as plain structs in initialisation) (
  #23477)
- x.vweb: remove the entire module (it's now veb)
- ci: fix failure of the docker-ubuntu-musl job (keep vlib/vweb/vweb_app_test.v in the skip_files)
- picoev: enable running veb services on Termux
- thirdparty: improve `-cstrict -cc clang-18 -prod` compatibility for programs that do
  `import net.mbedtls`
- net.http.file: use urllib decode uri, to handle urls to files that have unicode characters in
  their name (fix #23683) (#23684)
- veb.csrf: do not print anything by default, add an `verbose: true` option, to restore the old
  behavior if needed (#23725)
- net.unix: make unix_socket_test.v trace its actions more thoroughly
- veb.request_id: new middleware that implements request ID tracking (#23727)
- veb: update the blog tutorial
- net.openssl: use proper library search path for local installations of OpenSSL 3, use
  `SSL_get1_peer_certificate` instead of the deprecated `SSL_get_peer_certificate` .
- ci: fix vweb_run_at.run.out and vweb_run_at.skip_unused.run.out, ensure stable ordering of
  stdout/stderr for `v run file.v`, in case of compiling a program with warnings/notices.
- veb: handle sendfile errors, when the connection is canceled, before the file is completely
  transferred (#23891)

#### ORM

- orm: fix codegen for option fk (fix #23383) (#23400)

#### Database drivers

- db.sqlite: add tracing for more calls, when using `-d trace_sqlite`, not just for the ORM
- db.pg: add support for prepared statement, with db.prepare/3 and db.exec_prepared/2 (#23442)
- db.mysql: add SSL support; turn ConnectionFlag into `@[flag]` (#23975)

#### Native backend

- native: fix convert_int_to_string, add comments in the verbose (-v) mode (#23743)
- native: fix int prints (#23747)
- native: for statement : add support for all expressions handled by g.condition (#23752)
- native: fix inc and improve support for i32 (#23753)
- native: support negative integer literals (#23755)
- native: fix missing symbols CaptureStackBackTrace and __debugbreak (#23765)
- native: fibonacci test
- native: add support for enums of different types (#23786)
- native: fix unsigned and signed int comparison (#23808)

#### C backend

- Fix type_default for option type, when the default expr is `none` (fix #23318) (#23320)
- Remove double string cloning (#23331)
- Fix type_default for array init >= 8 items (spotted while building the vhamll project) (#23334)
- Fix codegen for alias struct embed (fix #23347) (#23353)
- Fix codegen for sumtype casting on selector on as cast with non pointer field (fix #23387) (
  #23391)
- Fix generic alias option assigning (fix #23382) (#23393)
- Fix codegen for selector on shared var with embed (fix #23378) (#23394)
- Fix codegen for nested selectorexpr on unwrapped option (fix #23406) (#23409)
- Cache return_stmt()'s node.exprs[0] and node.types[0] (#23408)
- Fix codegen for indexing generic map (fix #23376) (#23402)
- Support `-d trace_unused_by_main` and `-d trace_skip_unused_just_unused_fns`, to find out
  potentially obsolete functions that are not used at all in a project
- Fix shared array indexing (fix #23410) (#23413)
- Fix shared array fixed initializing with `-cstrict` (fix build of chip8-v project) (#23414)
- Fix codegen for array fixed comparison on MatchExpr (fix #23403) (#23415)
- Fix struct init for anon struct field on C structs (fix #23421) (#23422)
- Fix shared array slice (fix #23426) (#23427)
- Fix array of sumtype initialization with var string (fix #23429) (#23432)
- Fix codegen for ifguard indexing array of option (fix #23438) (#23439)
- Fix assigning option of array index (fix #23451) (#23455)
- Fix compilation for a project using a lot of json, threads, embeds + parallel-cc (#23467)
- Fix cgen error for `instance.t.wait()` on default 0 initialized thread field `t` (fix #23390)
  #23392
- Fix array decomposing on variadic call (found while working on solving #23474) (#23476)
- Fix option var nested unwrapping from sumtype (fix #23478) (#23485)
- Fix option unwrapping on heap var (#23489)
- Fix codegen for indexing anon_fn (fix #23493) (#23495)
- Fix nested option selector unwrapping (fix #23500) (#23497)
- Fix interface casting in anon fn (fix #23530) (#23533)
- Fix codegen for spawn with interface on submodule (fix #23471) (#23517)
- Parser,ast,cgen: support nested unions with `field union {`, to improve interoperability with C (
  similar to `field struct {`) (#23539)
- Fix unwrapping option interface field (fix #23540) (#23541)
- Fix codegen for assign from unsafe fn returning fixed array (fix #23546) (#23548)
- Fix codegen for a fixed array init with different node types (fix #23545) (#23547)
- Fix return on last statement of return IfExpr (fix #23550) (#23551)
- Fix auto str which expects ptr for ptr type (fix #23552) (#23553)
- Fix codegen for assigning from infixexpr with generic operand (fix #23560) (#23561)
- Fix codegen for array's .grow_cap and .grow_len methods for generic arrays (fix #23566) (#23568)
- Fix codegen for const fixed array initialization with another const as item (fix #23565) (#23572)
- Fix codegen for unwrapping option comptime var (fix #23590) (#23591)
- Fix hash functions for `map[Enum]Value`, and `enum Enum as u64 {` (fix #23630) (#23632)
- Fix unwrap option ptr selector (fix #23631) (#23638)
- Fix codegen for `for` or-block (fix #23625) (#23644)
- Fix codegen for option value on `map_set` (fix #23650) (#23652)
- Fix codegen for option sumtype with option variant (fix #23653) (#23656)
- Remove commented code blocks using `if true {`
- Reduce interpolations when a method is not found in Table.find_method/2; merge rand.constants back
  to rand.v (#23660)
- Fix `$if typeof[T]().idx`, `$if typeof[T]().unaliased_typ` checking (#23665)
- Fix codegen for sumtype cast from option variants on map_set (fix #23654) (#23669)
- Fix codegen for a const assigned a fixed array, initialized with unsafe exprs (fix #23674) (
  #23676)
- Fix `@[sql: serial]` and `@[serial]` are not the same (fix #23346) (#23678)
- Improve support for `v -path bootstrap_alternative_backend/ run simple.v` (#23679)
- Fix codegen for array fixed on if and match expr (fix #23577, fix #23589) (#23682)
- Add support for a `#postinclude` directive
- Fix #preinclude, add test case for #postinclude too
- Fix codegen for returning an initialised fixed array (fix #23693) (#23700)
- Use `global_g.out << g.out` instead of `global_g.out.write(g.out) or { panic(err) }`
- Fix issues found with the stricter sanitizers in clang-18 on Ubuntu 24.04 (#23710)
- Fix codegen for nested if on return (fix #23723) (#23729)
- Fix sumtype smartcasted var as inherited var (fix #23716) (#23731)
- Fix map with an Enum as key type, with size < 4 bytes on tcc (fix #23714) (#23738)
- Fix codegen for match with sumtype ptrptr (fix #23776) (#23785)
- Fix aggregate var handling on match branch (fix #23768) (#23787)
- Fix gowrapper codegen for receiver ptrptr (fix #23798) (#23800)
- Fix regression, preventing the use of `-gc none -d no_main -no-builtin -no-preludes` to compile C
  style V programs
- Fix array fixed assignment for `@[keep_args_alive]` (partial fix for #23804) (#23805)
- Fix nested option fixed array (fix #23708) (#23845)
- Fix codegen for match on return (fix #23661) (#23851)
- Fix casting primitive type to alias, where option alias is expected (fix #23859) (#23860)
- Fix interface method list ordering to make test buildable with `g++` (fix #23701) (#23870)
- Make `./v -prod -cstrict -cc gcc-11 test vlib/math/` pass cleanly (workaround a problem in V's
  cgen, that -cstrict discovered)
- Fix codegen for global array passed as mut (fix #23873) (#23881)
- Fix msvc build filename, remove temp files (#23890)
- Improve the stability of generated code for auto string methods
- Fix codegen for array of anon struct (fix #23896) (#23907)
- Make sure to call the overridden `pub fn (mut a []string) free() {` method, NOT the generic
  `fn (a &array) free() {` one. (#23911)
- Fix generic container init (fix #23910) (#23912)
- Fix codegen for generic structinit and generic array return (fix #23916) (#23943)
- Implement alias operator overloading for generic struct parent type (fix #23965) (#23967)
- Add `T.key_type`, `typeof(expr).key_type`, `T.value_type`, `typeof(expr).value_type`,
  `T.element_type`, `typeof(expr).element_type` for getting `Map[K]V` and `[]T` types (fix #23914) (
  #23962)
- Builtin,markused,pref,cgen: improve markused for small programs

#### vfmt

- Fix formatting for an option array of anon structs (fix #23841) (#23844)
- Fix comment handling on ending of struct decl (fix #23947) (#23948)

#### Tools

- ci, vc: use the full V repo commit hash, when generating vlang/vc commit messages
- Support `v should-compile-all folder/`, where `folder/` contains project subfolders (containing
  v.mod files and multiple top level .v files)
- Improve `v should-compile-all .` with support for compiling .wasm.v and .js.v files; skip
  `module name` files, compile projects that have .glsl files
- Improve `v bug` report wording
- v.help: improve message formatting (#23363)
- Restore `emcc --version` diagnostic in `v doctor`, when emcc is present
- ci: fix `v -W build-tools` (#23368)
- ci: force all tools to build without warnings/notices in tools_ci.yml (#23371)
- Fix `v buf file.v`, when run in a folder != vroot
- Improve output of `v bug file.v`, fix `v bug /long/abs/path/file.v` too
- ci: make show_manual_release_cmd.vsh use a fixed weekly.YYY.WW format for the weekly release tags
- ci: make easier the debugging of the `docker-alpine-musl-gcc` job (#23399)
- vvet: fix for `v vet folder/` + new features (track long fns, empty fns and repeated code),
  enabled by the new -F and -r flags (#23405)
- v.help: add a message for `v help crun` (#23431)
- Make cmd/tools/vretry_test.v independent from the presence of git (fix issue #23398)
- ci: add compile_herolib.sh, use it to make sure it keeps working (related #23467) (#23469)
- ci: fix toml-module-pass-external-test-suites after the CI image runner upgraded jq to version
  1.7, by downloading and using the release version of jq-1.6
- ci: fix failure of the check-markdown job
- vet: add an `-I` option to notice fns, with the potential to be inlined (#23534)
- ci: update last known good commit hash for herolib to ca8799af39228a5678a7be81128c5b0c342c9efc
- Make `v check-md .` print the actual length of lines too, when reporting errors/warnings about
  them (#23606)
- Restore previous behavior of `v download` (show progress on stdout, when it is connected to an
  interactive terminal; hide log stdout->stderr notice)
- ci: fix `CI=name ./v -d network test cmd/tools/vpm/` ; update the image runners in vpm_ci.yml (
  #23628)
- Add `v reduce program.v`, in order to make smaller reproductions (`rpdc.v` files), before filing
  cgen bugs (#23636)
- Add a small utility script `cmd/tools/vrun`, to make it easier to use .vsh scripts on systems,
  with `/usr/bin/env` still not supporting `-S`
- Describe a more direct way to use a `v run` shebang in cmd/tools/vrun
- Fix show_manual_release_cmd.vsh, use .strftime(%V) for calculating the proper default week number
- Improve the `v reduce` parser for functions, and add more loops to reduce more (#23694)
- Improve `v reduce` output; bump version, warn on failed string_reproduces/3, but continue to run (
  #23697)
- Fix warnings in `v reduce` (#23709)
- Move `cmd/tools/vdoc/doc` to `cmd/tools/vdoc/document`, so that it can be imported from other
  programs through `-path`, without conflicting with the top level `doc/` folder in the main repo (
  #23733)
- ci: avoid duplicating work by removing the remaining `-skip-unused` tasks, since that is the new
  default (#23746)
- ci: use distinct names for the jobs, for easier filtering/searching in the Github's UI
- ci: fix job names in cmd/tools/modules/testing/common.v as well
- ci: fix github job names in cmd/tools/vtest-self.v
- ci: update the remaining runners from ubuntu-20.04 to ubuntu-22.04 and ubuntu-24.04 (#23754)
- ci: rebuild V with `v -g self` in .github/workflows/native_backend_ci.yml, to improve remote
  diagnosis of panics in PRs
- ci: use `-silent` for the longer test runs (suppress most OK lines, to reduce scrolling on
  failure)
- .gitignore: ignore the project settings file for gf2 (a very nice GUI gdb frontend)
- vrepl: fix slow response for empty line input (after just pressing 'enter/return') (fix #23856) (
  #23858)
- Make `v repeat failing_cmd` show the error output *just once*, but also still measure the time it
  took to execute
- Add --check flag to `v ast` (#23938)
- Add `v timeout` to be able to later use `v timeout 5.1 git -C . fetch V_REPO` in `v doctor` and
  other tools.
- Add a custom timeout of 5s for the network using command `git -C . fetch V_REPO` in `v doctor` (it
  normally takes <1s) (fix #23955)
- Support `v doctor -skip-github` to fully skip the fetching step, in places that have limited
  connectivity (alternative fix/workaround for #23955)
- ci: use -silent in more jobs that produce a lot of OK lines normally (for test-cleancode,
  test-self, build-examples, build-tools)

#### Operating System support

- Avoid os.glob, in favour of os.walk_ext (which works consistently even on windows)
- gg: add linux support for `fn screen_size() Size` (fix #23146) (#23326)
- Define _GNU_SOURCE on Linux (#23364)
- Fix `v doctor` format, fixes for windows, tcc and others (#23361)
- picoev: fix for windows apps with veb in a thread, parallel to a webview, that opens a lot of file
  descriptors (#23492)
- v.pref: set `DYLD_FALLBACK_LIBRARY_PATH` on macos, when `-use-coroutines` is used, so that `v run`
  can work, and the executable can find the downloaded photonwrapper shared library (#23516)
- encoding.iconv: add flag for OpenBSD to find iconv include and library (fix #23573) (#23575)
- runtime: add free_memory/0 implementation for OpenBSD (fix #23579) (#23583)
- Fix `v doctor` output on OpenBSD: get gcc version from egcc; do not run ldd to get the glibc
  version (fix #23576) (#23578)
- makev.bat: add note about antivirus programs on windows and compilation slowdowns (#23586)
- runtime: add free_memory/0 implementation for FreeBSD too (fix #23581) (#23594)
- log,sync: fix macos CI failure when log.ThreadSafeLog is used explicitly in `v download` (#23613)
- Let `v test .` show the running _test.v files each minute (set by
  `VTEST_REPORT_RUNNING_PERIOD_MS`); diagnose stuck windows gcc CI jobs (#23649)
- ci: run FreeBSD on a VM in github ci, instead of on the Cirrus service (which stopped working
  today) (#23692)
- cgen,builder: fix windows 32bit dll function name mangle (fix #23689) (#23690)
- ci: update linux image runners from `ubuntu-20.04` to `ubuntu-24.04` (#23706)
- ci: do not use `VJOBS: 1` in the windows tcc job anymore
- make: use .exe only on Windows
- ci: reduce the timeouts in windows_ci.yml to 60 minutes (V is now faster, and the runners use
  faster hardware as well)
- native: allow for searching for wine system32/ .dlls, and for adding more paths for .dll lookups,
  by setting `VNATIVE_PE_DLL_PATH`, to make it easier to diagnose problems with PE generation on non
  windows platforms (#23756)
- ci: skip fibonacci_native.vv on windows for now
- sync: support x86_64-alt-linux gcc paths too when tcc is used (needed for ALT Linux)
- ci: make freebsd_ci.yml runnable on personal forked repos, that are not named `v` (#23779)
- ci: remove the VJOBS=1 restriction for test-cleancode on linux (#23801)
- os: fix buffer overflow in os.get_raw_line under Windows (#23816)
- ci: move test in pe_test.v to native_test.v (both used `-b native`, competing the creation of the
  backend executable => CI failures on the gcc-windows job)
- Make `v install` avoid using `--filter=blob:none --shallow-submodules --also-filter-submodules` on
  windows (#23840)
- os: fix get_raw_line() on windows (fix #23843) (#23846)
- ci: add a limit of 20 minutes to the test-on-freebsd-14-2-x86 CI job
- Support `// vtest build: !do_not_test ?`, `// vtest build: !windows && tinyc` to skip files during
  testing on specific platforms, without having to keep centralised skip lists (#23900)
- cgen,dl: remove workaround in `dl`, generate a DllMain() in cgen instead for `-shared` on
  windows (#23961)

#### Examples

- Allow for passing arbitrary compiler flags to `v bug`, for example: `v bug -cg -autofree file.v` (
  #23335)
- examples,builtin,cgen,live: fix windows hot reload with `-cc tcc`, improve the infrastructure, use
  a V global instead of a C one (fix #23214) (#23350)
- Fix unused db.pg import warning for examples/database/psql/customer.v
- gg,sokol,examples: add example of overriding _SGL_DEFAULT_MAX_VERTICES in code
- Mention also the RAM usage increase in many_thousands_of_circles_overriding_max_vertices.v
- gg: enable clean compilation without notices for `./v -check-unused-fn-args examples/tetris/`
- Add vascii.v showing a table of the first 128 ASCII characters with their names and codes in dec,
  oct, hex, bin formats (#23466)
- Add a solution to the "1 Billion Row Challenge" (#23458)
- examples,io: add sha256sum_with_io_cp.v, make the size of the buffer used by io.cp
  parametrisable (#23585)
- log: add `log.use_stdout()`, use it to silence the transition note for the most commonly used V
  tools/examples (#23642)
- Implement an -s option for `v ast`, to skip all nodes with default values like [], {}, 0, false;
  with it `v ast -pts examples/hello_world.v | wc -l` is 36 lines
- gg: fix `./v -gc none -autofree run examples/tetris/` (avoid `return s1 + s2 + s3`, clone the
  arrays, passed to the fontstash wrapper)
- examples,gg: modify all remaining calls to fons.add_font_mem/3 to use an array.clone()
- Add examples/hot_reload/tunnel.v
- Add minimal_c_like_program_using_puts.v showing how to produce a much smaller executable on Linux,
  using clang, mold and sstrip.
- Build examples, that start with `module no_main` as well
- ci: fix `v build-examples` failure on gcc-windows
- Support `module no_main` based examples in `v should-compile-all`
- term: make the second example in the README.md compilable as well
- Show how to use a v file server for the wasm version of 2048, instead of emrun
- sokol: allow for `v -os wasm32_emscripten -o examples/tetris/tetris.html examples/tetris/` (avoid
  using `-sMODULARIZE`) (#23814)
- Fix poll_coindesk_bitcoin_vs_usd_rate.v, use the new v2 API endpoint
- math,examples: add examples/sokol/sounds/simple_sin_tone_using_audio_push.v, cleanup math
- Add a small breakout game, supporting keyboard and touch controls (#23861)
- Cleanup snek.v, by using `math.vec`, the builtin array support, instead of `datatypes`, and by
  removing casts that are no longer needed
- Fix `v -cstrict -cc gcc-11 examples/sokol/particles` and the same but with clang-18 too
- Fix more compilation errors with `-cstrict -cc clang-18` for the sokol examples
- Fix `VFLAGS='-no-skip-unused -cstrict -cc clang-18' v should-compile-all examples/sokol/` too
- Add a small minesweeper game in examples/gg/minesweeper.v
- Add a small Sokoban puzzle game with levels (see https://en.wikipedia.org/wiki/Sokoban)
- Use textures in the sokoban game, instead of colors
- Shorten the periodic output of examples/hot_reload/message.v
- Fix (ball->side edge of brick) collision detection in breakout.v
- Add subtle light and shadow effects to the breakout game, to give it a little depth (#23885)
- Run the update method of breakout on its own frame independent rate
- gg,examples: use a timer to limit the rate of updates in breakout, instead of a separate thread,
  restore ability to run in a browser through emscripten
- Make the tetris update rate, independent from the frame rate too
- Make the 2048 game update rate, independent from the frame rate as well
- Fix panic, discovered by fuzzing examples/2048/2048.v with zzuf on the CI
- Add `vanilla_http_server` - a fast, multi-threaded, non-blocking, port and host reuse,
  thread-safe, epoll server (#23094)
- v.build_constraint: support comments too, for example `linux&&gcc // some comment`
- Make `v repeat -R 5 -r 10 "v run examples/hello_world.v"` also show the time it took for all runs
  in each repeat
- Add an asteroids game (it is currently < 400 lines of V, using gg)
- Remove the generic alias type overloaded operator workaround, after 29e60da
- Fix `v should-compile-all examples/`

## V 0.4.9

*22 Dec 2024*

#### Improvements in the language

- `-skip-unused` is now on by default resulting in much smaller cgen and binaries. 70% reduction for
  hello world.
- `-parallel-cc` for speeding up `-prod` and `-cc clang/gcc` compilation by up to 14 times!
- C functions no longer need to be manually defined. An `#include "foo.c"` is enough (behind
  `-experimental` for now).
- Fixed arrays now have `.index .any .all .map .sort .sorted` methods
- Remove inline sum types completely
- Support `in` expr with number ranges: `if var in 1..4 {` (fix #20352) (#22754)
- Optimize literal string comparison (`match`, `in` and `==`) (#22643)
- Allow `map[k]()?` and `map[k]()()` (#22740)
- Add selector option unwrapping inside `if tree.root != none {` (#22895)
- Add `array.count` as a method that accepts a predicate, similar to filter, but returning just the
  number of matches (#23054)
- Allow option array element comparison `==` and `!=` (fix #23108) (#23113)

#### Breaking changes

- time: rewrite parse_rfc3339/1 to improve performance, reject partial timestamps, that miss date
  info like `22:47:08Z` (#22585)

#### Checker improvements/fixes

- Optimize identical type checking (#22596)
- Fix `T.unaliased_typ` if branch evaluation (fix #22587) (#22598)
- Fix lambda expr with fntype params and restore fixed_array_any_all_test.v (#22625)
- Check fixed array builtin method args mismatch (#22626)
- Fix generic fn call return type resolve on var assignment (fix #22612) (#22627)
- Improve checking parameter mismatches for fixed array builtin methods (#22630)
- Add tests for checking the new errors for fixed arrays .sort() calls (#22656)
- Fix index expr that left is if expr (fix #22654) (#22661)
- Fix return type checks, when returning struct values, implementing IError in non-result fn (fix
  #22659) (fix #22658) (#22660)
- `App.method` field initialisation, for fn fields, initialised with generic methods (#22665)
- Allow for `f() or { T{} }` in a generic method, for `fn f() ?T {`, being called with `T`, being a
  container like []int etc, not just a primitive type like int (#22672)
- Allow for `f() or { T{} }` part 2, see also cc55aa5 (handle the case of an ignored result as
  well) (#22687)
- Fix selector with prefixed `&` structinit (#22689)
- Fix missing check for fn var with generic return inherited to anon fn (fix #19045) (#22683)
- Check for receiver name clashing with global var (fix #22698) (#22708)
- Fix none check for match expr with option (fix #22728) (#22732)
- Fix option map fn type and missing check for result param type (fix #22736) (#22738)
- Fix missing info about generic fn var usage without concrete types (fix #22733, #22734) (#22743)
- Fix missing check for stack pointer return (fix #22726) (#22756)
- Improve static method call resolution (fix #22773) (#22787)
- Skip redundant message for int overflows, while casting integer literals (fix #22761) (#22788)
- Fix callexpr after auto C func identification (fix #22800) (#22809)
- Fix missing auto `from_string` type restriction (related to #22783) (#22803)
- Fix match expr with empty array init expression (#22832)
- Disallow `foo[T]` as a value  (#22820)
- Fix if expr with empty array init expression (related #22832) (#22841)
- Improve the position underlining, for last statements in branches of `if` expressions  (#22845)
- Fix generic fn call with empty array argument (fix #22843) (#22846)
- Fix missing or-block check for callexpr (fix #22835) (#22840)
- Check array builtin method calls, that do need a mutable receiver, but are called on an immutable
  one (fix #22850) (#22853)
- Check alias of array op overloading and fix op overloading (fix #22851) (#22854)
- Disallow struct init with `mutable_field: const_array` (fix #22862) (#22863)
- Check struct aliased field unsign type assigning negative value (fix #22868) (#22871)
- Fix alias to struct generic type (fix #22866) (#22872)
- Fix `json.encode_pretty` with a struct init expression argument (#22897)
- Fix codegen for fixed array initialization with a fn call (fix #22887) (#22891)
- Fix or-expr check on invalid method call (fix #22949) (#22950)
- Fix mut var option unwrap with `!= none`, support `if mut x != none {` too (fix #22936) (#22943)
- Prevent a compiler panic, while running `v -check file.v` on files with parser errors (fix
  #22981) (#22982)
- Allow array sort with callexpr (#22989)
- Fix `$res()` used in `defer {}` blocks with more statements, add a test (#22998)
- Fix generec fn returning generic closure (#23047)
- Fix generic fn returning generic closure (related #23047) (#23055)
- Fix missing checker for cast from mut var to non-ptr type (fix #23017) (#23056)
- Check fn call argument mismatch (fix #23016) (#23061)
- Fix empty array append multi dims (fix #23092) (#23096)
- Fix selector generic or block (fix #23088) (#23102)
- Fix veb route method param with non ctx name (fix #23105) (#23107)
- Allow fixed array where voidptr is expected (fix #23090) (#23100)
- Fix immutable to mutable reference (fix #22653) (#22663)
- Fix missing check on range expr when high var is same iteration value var (#23130)
- Allow `[]Enum{len: 10, init: .thing}` (fix #23077) (#23165)
- Fix option unwrapping and call from option struct field (#23182)
- Add a notice for global variable redeclarations (#23162)
- Fix assign check, when rechecking for another concrete type (#23212)

#### Parser improvements

- Fix generic struct init detection `T{}` (#22682)
- Improve the assert informations (related #22668) (#22679)
- Make C struct fields public and mutable by default (fix #22695) (#22706)
- Fix enum redeclaration error (fix #22759) (#22766)
- Fix struct field name using keyword (fix #22826) (#22829)
- Optimise mark_var_as_used calls, by moving it to an ast.Scope method (#22842)
- Optimize method parameter detection in used check (#22915)
- Fix block position's last line (#22913)
- Support `@[must_use]` tag for fns/methods, and an experimental `-check-result` option (#22983)
- Allow `type` as field type on params struct construction (fix #23091) (#23098)
- Allow `type` and other keywords as plain attr value (fix #23150) (#23154)
- Support `@[tag]` for hash statements, like `#define` and `#flag` (#23210)

#### Compiler internals

- Add `:parse_text` to the paths of .v files, printed by `-print-v-files`, for parse time generated
  snippets
- v.pref: support a `_wasm32_emscripten.c.v` suffix for platform files too
- builder: fix msvc build thirdparty obj file from .cpp (fix #22772) (#22789)
- v.util: use temporary workaround for the vinix build problem (when VFLAGS is set, and `-ldflags `
  is passed at the same time)
- Allow getting notified about unused function params (#22879)
- v.scanner: remove `Scanner.is_started` field (#22918)
- v.scanner: fix string interpolation for float e format (fix #22429) (#23147)
- cbuilder: remove flto with parallel-cc, it slowed down linking 10x
- cbuilder: store split up C files in vtmp
- v.builder: integrate more compile/linker options into parallel_cc.v (#23190)
- v.builder: prevent passing `-x objective-c` with `-parallel-cc` for now
- v.builder: move filtering logic for `-parallel-cc` to parallel_cc.v
- v.pref: support `-debug` and `-cdebug`, as more explicit alternative names for `-g` and `-cg` (
  #23208)
- v.builder: fail the whole v compilation, if linking or compiling during `-parallel-cc` fails (
  #23211)
- v.pref: implement `-no-prod-options` to turn off passing `-O3 -flto`, while still keeping the
  `$if prod {` branches (passing custom flags with `-cflags -Os` already works)
- v.builder: support `-no-prod-options` with `-cc msvc` as well

#### Standard library

- builtin: improve performance of `string.starts_with/1` and `string.ends_with/1`, when compiled
  with tcc (#22620)
- builtin: improve `fixed_array_any_all_test.v` (related #22609) (#22621)
- builtin: temporary fix fixed_array_any_all_test.v (#22624)
- builtin: support `-d no_gc_threads` for turning off passing `-DGC_THREADS=1` while compiling the
  GC library
- encoding.utf8: fix is_punct func (fix #22646) (#22647)
- log,time: improve performance for writing a line to a log, add Time.format_rfc3339_micro/0 (
  #22662)
- flag: add missing short flag match in `flag.to_struct`, add test (#22696)
- bitfield: add `shift_left/1` and `shift_right/1` methods to `BitField` (#22700)
- x.json2: pre-arranging the replacement of the decoder, to
  match https://github.com/enghitalo/v/tree/decoder2_to_json2 (#22729)
- builtin: improve fixed_array_any_all_test.v (#22746)
- builtin: add `string.is_pure_ascii()` (#22748)
- os: document the various enum values in os.Signal (#22770)
- builtin: fix runes.to_upper() (fix #22742) (#22755)
- ci: use os.system to redirect output
- vlib: initial addition of `x.encoding.asn1` (#22783)
- os: work towards being able to again use `-autofree` while recompiling the V compiler several
  times
- x.encoding.asn1: fix time creation to also accommodate negative timezone offsets (#22861)
- vlib: remove modules/functions/fields, deprecated in 2023 (#22750)
- term: improve performance of repeated can_show_color_on_stdout and can_show_color_on_stderr calls,
  by caching their results (#22893)
- builtin: make int_min/2 and int_max/2 public
- json: mark json_print_pretty/1 with `@[markused]` (used by cgen)
- math.big: use `@[manualfree]` to workaround -autofree compilation issues with gitly, and other
  projects using `crypto.rand` and `math.big`
- x.encoding.asn1: improve performance (#22948)
- gg: use a larger fontstash text atlas by default (2048x2048, and customizable), instead of
  512x512 (fix #21610) (#22959)
- Revert "os: deprecate `os.getwd` in favor of `os.get_current_dir` (part 1) (#22966)"
- log: tag log.fatal with @[noreturn] (#22986)
- runtime: force runtime.nr_jobs() to return 1, while V is bootstrapping itself, from vc/ source,
  that was compiled with `-os cross` (fix #22991)
- json: fix decode codegen for []&type (fix #23007) (#23010)
- os: add os.get_trimmed_lines() too
- crypto.sha3: add support for Keccak-256 and Keccak-512 (#23058)
- rand: add missing i32 APIs, corresponding to the int ones
- math.big: fix `assert big.integer_from_int(1) == big.integer_from_bytes([u8(0), 0, 0, 0, 1])` (fix
  #23115) (#23124)
- math: use libc wrappers for math.log2/1, math.log10/1, math.log1p/1 and math.log_b/1; make
  `assert math.log10(10) == 1.0` pass in the common case (#23129)
- gg: add `icon` field to gg.Config, for easier access (fix #23135) (#23138)
- math: fix math.log10() for `-exclude @vlib/math/*.c.v` (fix #23136) (#23140)
- json: add primitive type validation (fix #23021) (#23142)
- json: fix memory leak on result messages (checked with `json_option_raw_test.v`, compiled with
  `-fsanitize=address,pointer-compare,pointer-subtract`) (#23172)
- vlib: add new `rand.cuid2` module (#23181)
- json: fix memleak on sumtype decoding (#23197)
- vlib: enable more satnitized memleak detection runs without false positives on the CI (#23200)
- json: fix argument freeing for json.encode and json.encode_pretty calls (#22781)

#### Web

- veb: translations via %translation_key
- picoev,net.http: use Time.http_header_string method, to improve performance (#22619)
- Do `import veb`, only for templates that do use functions defined in `veb`
- picoev: support `-d picoev_verbose_errors`, do not use any naked `eprintln` by default, since that
  is a low level module
- picoev: fix the incompatible pointer type cast error in the C.epoll_wait call (#22785)
- net.mbedtls: define MBEDTLS_THREADING_PTHREAD, in mbedtls_config.h; call
  C.mbedtls_ssl_conf_read_timeout explicitly in the wrapper, with a shorter timeout value of 317ms (
  determined experimentally)
- veb: fix large file transfer timeout (fix #22489) (#22924)
- net.http: send Host headers with port (when the port is != 80 or 443) (fix #22941) (#22942)
- net.mbedtls: support compiling with `-d mbedtls_client_read_timeout_ms=7000`,
  `-d mbedtls_server_read_timeout_ms=60000`, and `-d trace_mbedtls_timeouts`
- net.urllib: fix parse of url relative address (fix #21061) (#23180)
- veb: fix key value and translation file name (#23203)

#### ORM

- Fix orm.Connection only allowing immutable Connections (#22684)
- Fix order by with custom column name (#22813)
- Support plain `@[serial]` attribute for marking struct fields (#22814)
- Fix crash when working with array field (fix #22822) (#22824)
- Fix list generation and escape loose backtick (#23039)
- Fix mark as used var on insert statement (fix #23032) (#23038)
- Fix update stmt with enum value (fix #23031) (#23037)

#### C backend

- Fix codegen for fixed array contains - `[1,2]! in a` (fix #22559) (#22579)
- Improve fixed array literal in operation and index calls (#22590)
- Add codegen for auto free methods for interface type (#22555)
- Add test for #22586 (#22600)
- Parser,ast,cgen: do is_builtin sym marking during parse time just *once*, to save multiple checks
  later (#22580)
- Cache the results of g.base_type/1 (#22613)
- Add caching to contains_ptr return (#22605)
- Add .write2/2 and .writeln2/2 methods to reduce consecutive write calls (#22610)
- Optimise the generated code for returning literal values and option/result values (#22622)
- Optimize literal string comparison (string__eq -> vmemcmp) (#22614)
- Fix selector indexexpr with fntype on assignment (fix #22635) (#22637)
- Fix anon fn with `&` prefix (fix #22628) (#22638)
- Fix struct field init with fixed array using index (fix #22616) (#22641)
- Fix interface conversion codegen race issue (fix #22640, #17943) (#22655)
- Fix waiter funcs declarations (fix #22640) (#22649)
- Improve the assert informations (fix #22666) (#22668)
- Fix dump of alias to option fn type (fix #22670) (#22676)
- Fix array append map value with or expr (fix #22674) (#22678)
- Ensure proper saving/restoring of cgen `map[k] := fn ()` state, when assigning anonymous fns (fix
  #22705) (#22707)
- Implement methods sort_with_compare()/sorted_with_compare() for fixed arrays (#22702)
- Implement methods reverse()/reverse_in_place() for fixed arrays (#22712)
- Fix ptr field encoding for `json` (fix #22717) (#22720)
- Fix `[1, 2, 3]!.map(it * 2)` (#22722)
- Fix `assert [1, 2, 3]!.contains(2)` (#22725)
- Fix `assert [1, 2, 3]!.index(2) == 1` (#22727)
- Fix spawn with non-pointer receiver (fix #22718) (#22719)
- Fix `assert [1, 2, 3]!.reverse() == [3, 2, 1]!` (#22745)
- Fix codegen for `-no-builtin` flag (when used separately from `-d no_main`) (#22765)
- Apply the `a in [x,y,z]` optimisation for `ast.IndexExpr` and `ast.SelectorExpr` again (#22767)
- Fix codegen to emit callexpr one time for `in` expr optimization (#22764)
- Fix c codegen formatting for return match (#22768)
- Avoid generation of empty `or` blocks for `f() or {}` (#22775)
- Fix struct field name using c keyword `typeof` (fix #22779) (#22782)
- Remove unused code generated for unwrapping temp var from callexpr (detect unused return value
  from CallExpr), fix parser bugs (#22769)
- Enable if guard to add `err` var on else branch, after last `else if` (fix #22784) (#22786)
- Fix option struct default value init with `-cstrict` (spotted in #22783) (#22802)
- Fix codegen for fn fixed array param w/ size defined by const (fix #22811) (#22812)
- Fix wrong type resolution on infix (#22804)
- Fix default `T{}` when `T` is ref type + dereferencing issue when comparing int alias to int (fix
  #22795) (#22807)
- Fix generation of a missing return in `return if cond { x } else { return missing }` (fix
  #22838) (#22839)
- Fix generic static method call return type resolution (#22865)
- Fix array fixed code generation for more than 1 dimension (fix #22866) (#22876)
- Fix codegen for `$if` in an if expression, when compiled with `-g` (fix #22873) (#22888)
- Make errors more informative (resolve empty panics) (related: #21184) (#22898)
- Generate json array line on uniform indent lvl (#22899)
- Fix codegen for returning a fixed array as a result (fix #22894) (#22896)
- Fix codegen for alias type interface methods (fix #22901) (#22902)
- Fix codegen for assigning aliased fixed array (fix #22907) (#22909)
- Fix codegen for returning option aliased fixed array (fix #22910, fix #22911) (#22912)
- Fix aliases of fixed array infix expression (fix #22925) (#22928)
- Fix aliases of fixed array append to array (fix #22926) (#22929)
- Fix option unwrap for fields of interface type (fixes #22930) (#22931)
- Fix aliased fixed array option fn call (fix #22927) (#22934)
- Move the `msvc compiler does not support inline assembly` to cgen (so it will only get triggered,
  when ASM blocks are still present, in what is passed to cgen)
- Fix dump fixed array on array append (fix #22935) (#22940)
- Fix enum value string interpolation, like its declared enum underlying type (fix #22938) (#22945)
- Allow unwrapping of `x as string` expr, when `x` is a `?string` value (#22953)
- Fix codegen for result/option propagation out of fn context (fix #22961) (#22963)
- Fix codegen for option on concatexpr (fix #22951) (#22964)
- Reduce code for returning and extra whitespaces on `return` (#22967)
- Allow unwrapping of `foo.bar as string`, where `foo.bar` is `?string` (fix #22960) (#22973)
- Add thread timing stats too, on `-show-timings -stats` (#22990)
- Patch missing `gettid()` on glibc < 2.30 (#22987)
- Fix array fixed on update expr and alias type to multi dimension of fixed array (fix #22971) (
  #22972)
- Fix sumtype with embedded struct of option field (fix #22984) (#22996)
- Fix autostr for interface with circular type (fix #23022) (#23026)
- Fix array.delete_many() codegen (fix #23024) (#23025)
- Fix callexpr or-expr codegen on const decl (fix #23029) (#23043)
- Fix struct update embed expr for fixed arrays (fix #22999) (#23040)
- Fix update expr with embed fixed array with multiple dimensions (fix #23048) (#23049)
- Fix cast interface value in match expr (#23068)
- Prevent too long lines in array initialisations (#23074)
- Fix smartcast codegen for msvc (#23084)
- Fix option codegen for accept IError value (fix #23076) (#23085)
- Fixed for in loop with generic fixed array (fix #23075) (#23101)
- Fix printing fn call of returning c struct value (fix #23104) (#23106)
- Fix array fixed comparison from fn return (fix #23071) (#23114)
- Fix array map to fixed array (fix #23116) (#23118)
- Fix codegen for returning different option alias type (fix #23087) (#23125)
- Fix for in for interface type (fix #23119) (#23127)
- Fix codegen for generic selector expr (fix #22974) (#23132)
- Fix different option alias type as fn arg (fix #23086) (#23131)
- Fix codegen for returning option reference from indexexpr (fix #23133) (#23139)
- Fix array fixed auto str on `-cstrict` (#23144)
- Fix codegen for array append on indexexpr (fix #23156) (#23160)
- Fix assert for alias to fixed array (fix #23149) (#23161)"
- Fix auto eq for fixed array (fix #23149) (#23169)
- Fix fixed array option cast with `none` (fix #23164) (#23168)
- Fix selector call with reserved c name (fix #23170) (#23175)
- Parser,checker,cgen,fmt: fix array fixed option initialization (`none`) (complete #23164) (#23176)
- Fix option fn with voidptr arg (fix #23170 for !=tcc too) (#23179)
- Fix missing validation for selector unwrapping + fix default `return none` for unwrapping (#23183)
- Fix assign optional aliases of fixed array (fix #23185) (#23188)
- Fix struct field init with optional fixed array (fix #23193, fix #23195) (#23199)
- Reduce RAM usage, by avoiding a .str() call, for the final string builder, containing the final C
  program, used to write it to a file (#23226)

#### vfmt

- Add support for comments inside `sql db { ... }` blocks (fix #22601) (#22602)
- Fix formatting fixed array size of struct member (#22815)
- Fix formating non-unsafe blocks with break line (fix #22900) (#22903)
- Fix shared receiver formatting (fix #23151) (#23153)

#### Tools

- ci: add benchmark_footprint_json_decode.yml and benchmark_footprint_json_encode.yml (#22592)
- Use a `~same~` label, when the results in `v repeat` are not different enough
- Allow for fast exiting in compare_pr_to_master.v through Ctrl-C (or any failed command)
- ci: fix failing jobs after 4ed9d13 (#22606)
- Discard the top 7 results for each 10 runs, from `v repeat` runs, done by compare_pr_to_master.v,
  to reduce σ on machines with more varied load
- Allow for `v repeat -N ./cmd/tools/vtest_test`, by adding a -N/--no_vexe_reset option to
  `v repeat`
- Show more details in compare_pr_to_master.v
- ci: fix failing musl jobs after 2684ef9 (#22667)
- ci: run `zizmor .github/workflows/paths_ci.yml` and fix reported issues (#22681)
- Show the full test output, on known flaky test failure with `v test folder/` (#22716)
- Change `v test` to allow for `// vtest hide_retries` so that retry_test.v can hide its own (
  deliberate) retries
- ci: rename one of the duplicate `main_test.v` files, to reduce false positives (workaround)
- Fix `v doctor` output for missing `cc`. Add a diagnostic line checking for `emcc --version` too
- ci: run `v fmt -w vlib/v/pref/should_compile.v`
- ci: reduce flakyness of cmd/tools/vcover/cover_test.v (workaround for a race condition while
  updating the OK tasks counter in `v test`)
- Improve the diagnostic output of compare_pr_to_master.v
- ci: add a problem matcher support, to get error/warning/notice annotations in V CI jobs (#22790)
- Bump default `v retry` timeout to 10 minutes, clarify the usage of its `--timeout` option.
- ci: fix Build V
- ci: silence compilation warning for bench_string_key_in_map_vs_string_value_in_array.v
- ci: fix vinix_ci.yml for latest Vinix commits (#22818)
- Improve output of compare_pr_to_master.v
- Use `v retry` in more places, that do network operations that can fail temporarily (#22836)
- Allow for `v download -RD URL/script.vsh`, to download `script.vsh`, then run it locally, then
  remove it, in a single command
- v.help: add topic for `v help retry`
- v.help: add help topic for `v help repeat`
- ci,v.help: work around -autofree bugs, fix `./v -autofree -o v2 cmd/v`
- ci: add .yml file for testing compilation of Larpon's Shy library and the Puzzle Vibes game (
  #22874)
- ci: check more compile flag combinations in puzzle_vibes_ci.yml
- Fix compilation of hw with vnew -> vold, in compare_pr_to_master.v
- ci: fix for `v build-tools`
- ci: check that more apps/modules do compile with -skip-unused (#22904)
- vet: make `v vet` produce a nicer note, including the offending files, instead of `file.v` (
  #22957)
- ci: extract the VTL&VSL jobs from v_apps_and_modules_compile_ci.yml to vsl_and_vtl_compile_ci.yml
- Make oldv aware of when to pass -no-parallel when bootstrapping V from v.c (fix #22990, part 2)
- markused: only add .vtest_ functions, *when* compiling _test.v files (#23003)
- Improve oldv compatibility for using new stricter C compilers like clang-18, to compile older V
  versions from 2020 and 2019
- Use -Wno-error=incompatible-pointer-types in oldv, which is more permissive than just
  -Wno-error=incompatible-function-pointer-types, and works with gcc too, not just clang
- Describe more precisely what commands are used by `oldv`, so it can fail early, with a meaningful
  error message, if they are not present.
- ci: fix ROADMAP.md checks (#23059)
- vrepl: shrink .repl inputs, so repl_test.v runs faster
- ci: update compile_v_with_vtcc.sh, enable its CI task again (#23063)
- ci: extract .github/workflows/compile_discordv.sh, enable its CI step again
- json2.decoder2: prepare decoder in json2 to be replaced by json2.decode2 (#23078)
- Let oldv fail early, when git fails to do network operations or checkouts
- ci: fix for `-cc tcc -no-retry-compilation`, do not use more complex constants, but functions in
  vlib/math/vec/vec2_test.v
- ci: fix option_fn_voidptr_test.v after a200c45
- ci: make the CI more robust, by retrying commands and `v download` instead of wget (#23196)
- ci: use `v retry -- v setup-freetype` to make the CI more robust against random network failures
- ci: change exec name for parallel cc
- ci: speed up again sanitizer runs (#23222)

#### Operating System support

- builder: change linuxroot repo URL to https://github.com/vlang/linuxroot
- ci: test -os linux cross compilation on macOS
- ci: test the cross compilation from macos to linux sooner, show more information
- ci: move the macos->linux check even higher, to make easier testing and diagnosing linuxroot
  update failures
- orm: cross compile pg to linux; openssl: make cross compile work
- ci: use `macos-14` instead of `macos-12` because
  of https://github.com/actions/runner-images/issues/10721
- ci: macos_ci.vsh
- ci: fmt macos_ci.vsh
- ci: use thew new macos_ci.vsh (github)
- ci: improve output of macos_ci.vsh
- ci: extract `ci/common/runner.v`, use it to simplify ci/macos_ci.vsh even more
- ci: fix spurious failures for printing_struct_with_thread_field.vv on windows
- net.http: ensure that http.download_file_with_progress/3 works (in a degraded mode), on windows,
  even without passing `-d no_vschannel`
- builder: fix cross compiling from linux to windows, when passing -g/-cg
- docs: update the documentation of the @[console] tag, add advice to use `-subsystem windows`
  instead
- Make compare_pr_to_master.v use /opt/homebrew/bin/gtime on macos, and a pure V fallback, not just
  for windows
- ci,thirdparty: enable MBEDTLS_THREADING_PTHREAD and MBEDTLS_THREADING_C only on Linux for now (fix
  windows CI)
- thirdparty: enable MBEDTLS_THREADING_C and MBEDTLS_THREADING_PTHREAD on FreeBSD too
- os: use _wputenv instead of _putenv to stay in sync with _wgetenv (fix changing env variables with
  non ASCII content on windows) (#22920)
- ci: avoid false positives for the existing PRs, by comment out the task
  `V self compilation with -usecache` on macos for now (#23145)
- ci: linux_ci.vsh; cgen: parallel-cc fixes
- ci: remove extra EOL from linux_ci.yml (#23187)
- Fix profile time on windows  (#23227)

#### Comptime

- Add `typeof(var).indirections` and `T.indirections` (#22805)
- Add `typeof(expr).unaliased_typ` (#22806)
- Allow sumtype init by variant comptime var `T(v)` / `SumType(v)` (#22664)
- Fix missing bool AttributeKind.kind (#23159)
- Fix comptime `T.methods`  with generic types and interface checking with `is` operator (fix
  #22721) (#22724)

#### Examples

- Fix some of the instructions in `examples/thread_safety/` (#22571)
- builder,pref: fix `./v -os linux examples/json.v` on macos (#22651)
- Add examples/assets/v.svg and examples/assets/v_16x16.svg
- v.comptime: fix compilation of `examples/veb/veb_example.v` with V compiled with tcc on macos
- ci: ensure that all examples can still be compiled, by `v` compiled with tcc on macos
- Add poll_coindesk_bitcoin_vs_usd_rate.v
- Simplify and reorder output of poll_coindesk_bitcoin_vs_usd_rate.v
- builtin: fix `v -skip-unused -cc tcc examples/hello_world.v` on *BSD
- net.mbedtls: bump mbedtls_ssl_conf_read_timeout value to 550ms (tested with
  `v run examples/net_t.v`)
- Add a cpu_features/ folder, with several examples, using SSE and MMX assembly instructions (
  #22645)
- v.builder: fix `./v -check -stats examples/hello_world.v`
- docs: add a small sumtype match example in the Match section too
- Add TextScanner .skip_whitespace/0, .peek_u8/0, .peek_n_u8/0, add
  examples/mini_calculator_recursive_descent.v (#23001)
- Reduce completion friction, when doing the very common `v run examples/hello_world.v` in a shell

## V 0.4.8

*28 Sep 2024*

#### Improvements in the language

- A new `implements` keyword for explicit interface implementation
- Allow multi return as fn argument (#21991)
- Define a default sumtype value (based on the first variant type) (#22039)
- Remove the obsolete .code and .msg fields of IError (#22066)
- Fix generic lambda type binding and resolution (#22083)
- Comptime support for traversing the method parameters with `$for param in method.params {` (
  #22229)
- Show missing variants in the sum type error
- A much better and detailed unmatched fn arg error
- Add support for `@BUILD_DATE`, `@BUILD_TIME` and `@BUILD_TIMESTAMP`, all using
  v.util.get_build_time(), and overridable through SOURCE_DATE_EPOCH (#22213)

#### Breaking changes

- Deprecate `x.vweb` and `vweb` in favor of `veb`, a faster, easier, and more stable framework.

#### Checker improvements/fixes

- Disallow static fn call when receiver type is unknown  (#21970)
- Fix sumtype checking for voidptr variant (#21955)
- Check comptime veb.html('index.html') (#21961)
- Check if a parent generic struct has concrete types or not  (#21962)
- Add support for static methods in `@FN` and `@METHOD`  (#21990)
- Add a deprecation warning for `const ()` groups (an error after 2025-01-01) (#22019)
- Improve `-d trace_checker` and error diagnostic information on compiler panics
- Add error when initializing sumtype with struct as first type (#22067)
- Add infix checks for nil  (#22045)
- Fix map generic fn arg passing (#22071)
- Disallow using a preexisting const name in a for loop, as either a key or value ident (#22108)
- Fix generic lambda type binding resolution (fix #22109) (#22115)
- Fix array alias (#22175)
- Restrict multiple union fields initialised at once with a nicer checker error, instead of
  producing an enigmatic error at cgen time (#22196)
- Fix compilation of vlib/v/slow_tests/assembly/asm_test.amd64.v (regression after dfc0c91)
- Add missing check for ref passing to non-ref (#22194)
- Check struct implements non interface type (fix #22200) (#22218)
- Suggest using the `@[_allow_multiple_values]` attribute, when declaring enums that have duplicate
  values (#22224)
- Check for duplicate interface names in the `implements` parts of struct declarations (#22230)
- Fix missing struct field type checking for type mismatch (ref vs non-ref in
  `mt sync.Mutex = sync.new_mutex()`) (fix #18088) (#21949)
- Fix fntype var marked as auto heap (#22290)
- Check array.delete() argument mismatch (#22307)
- Add missing check for duplicated items on in expr (fix #22305) (#22308)
- Disallow infix expr on left side of assign  (#22322)
- Fix array fixed return type for interface methods (#22320)
- Check arguments mismatch of array.sorted_with_compare() (fix #22327) (#22328)
- Add an error for returning an `any` value in pure V code (prevents invalid cgen) (fix #12623) (
  #22334)
- Cleanup the checking of array method calls (#22338)
- Fix voidptr type checking  (#21923)

#### Parser improvements

- Fix lots of parser panics, discovered through fuzzing with radamsa
- Improve the error for keyword `lock`, used as a variable name (#21937)
- Improve the error message position for invalid array attr keys (#21944)
- Fix const field str() (#21998)
- Update `@include` in templates, to work with relative paths & prevent recursive calls (#21943)
- Check fn call args without comma between them (related #22021) (#22075)
- parser,scanner,ast: make the scanner and parser more robust, by implementing more limits (
  preventing panics, discovered by fuzzing)
- Protect against too deep recursion in Expr.pos() calls
- Check too many layers embedded generic type (fix #22089) (#22091)
- Cache ident lookups for consts in ast Expr str (#22101)
- Improve Type and TypeFlag related operations (#22107)
- Fix parsing map value inside or expr (fix #12164) (#22180)
- Fix const field str() (#22192)
- Fix `.${var}` used in a template, compiled by `$tmpl()` (fix #22231) (#22270)
- Check enum method duplicated (fix #20924) (#22294)

#### Compiler internals

- scanner: guard against scanner panic, discovered by fuzzing in PR#22016
- v.builder: show the thirdparty object compilation commands too, when using `-showcc` (when the
  cache is empty)
- builder: allow for `v -dump-defines - -check cmd/v`, which is faster, because it can skip code
  generation
- Reduce allocations for the most common cases (#22142)
- transformer: add support for instrumenting the V compiler with `-d trace_transformer`

#### Standard library

- encoding.base58: fix notice for slice creation (#21935)
- gg: reset ctx.mouse_d? and ctx.scroll_? at the end of each frame (fix #21945) (#21946)
- builtin: v_segmentation_fault_handler signal_number i32
- builtin: fix 'aaaa'.split('aa') (fix #21936) (#21951)
- builtin: panic on trying to grow arrays with capacity bigger than 2^31, instead of overflowing
  a.cap (partial fix for #21918) (#21947)
- gg: add a note that Context.new_streaming_image has to be called after Sokol's setup
- gg: add more documentation comments for gg.Config (the parameters of gg.start and gg.new_context)
- regex: fix regex.split() (fix #16876) (#21953)
- json: increase test cases before enabling sumtype decode in all json libraries (#21958)
- gg: change the type of gg.DrawImageConfig.rotate from `int` to `f32`
- gg: deprecate gg.DrawImageConfig.rotate, in favor of gg.DrawImageConfig.rotation, improve the
  documentation comments (#21963)
- x.crypto.chacha20: make Cipher struct public (fix #21967) (#21968)
- tmpl: fix an extra newline in @for; builtin: some i64 fixes
- gg: add an optional size: parameter to the .draw_pixels and .draw_pixel methods (defaults to 1.0)
- sokol: update to match upstream at c0e0563 (#21971)
- Add support for `Any` in `decode_struct`, `encode_struct` and `to_any` (#21972)
- crypto.cipher: make Stream.xor_key_stream implementers require a mutable receiver (#21974)
- sokol.audio: fix `./v -cc clang-18 -gc none simple_bytebeat.v` (the audio depends on threads)
- time: `d`,`c`,`dd`,`ddd`,`dddd` pattern support for parse_format() (#22003)
- flag: add optional value description to string parameters (#22024)
- flag: add custom value descriptions for bool, int, and float flags too (#22032)
- flag: fix assigning to `@[tail]` field when no fields has been matched yet in `flag.parse[T]()` (
  #22043)
- crypto: add a crypto.pbkdf2 module (#22047)
- hash: add more methods to the hash.Hash interface, to match the ones in Go (#22001)
- arrays: simplify arrays.sum and arrays.reduce (#22076)
- x.json2: support @[skip] as well (#22077)
- builtin,thirdparty: fix compilation of libgc with `-cc msvc -gc boehm` (thanks to @Ekopalypse)
- stbi: change Image.data from voidptr to &u8, to reduce casts (#21977)
- time: update parse_format comment description in parse.c.v (#22104)
- vlib: add an `arrays.parallel` module, containing `parallel.run/3` and `parallel.amap/3`
  implementations (#22090)
- builtin: support `-d builtin_print_use_fprintf`, make the C fn declarations stricter (#22137)
- builtin: fix map.clear() not resetting map's metas and keys blocks (fix #22139) (#22140)
- builtin: fix incomplete m.clear(), allowing the map to have a duplicated entry for its first key (
  fix #22143) (#22144)
- builtin: fix m.clear() having different observable behavior to `m = {}`, after multiple iterations
  of setting keys and clearing (fix #22145) (#22146)
- builtin: fix bug in .clear() caused by sizeof(u32) being 4, not 2 (fix #22148)
- flag: add support for parsing `flag.FlagParser` style flags in `to_struct[T]` (#22152)
- flag: fix parse_bool_value() (#22160)
- flag: correct bool logic, add test (#22162)
- flag: fix parsing `flag.FlagParser` style short flags in `to_struct[T]` (#22172)
- gg: change the type of PenConfig.thickness to f32
- builtin: remove remaining references to v_calloc in function comments (#22179)
- builtin: remove string interpolation from panic/1, to be able to use tools like cbmc in more
  cases (#22182)
- flag: add a relaxed parsing mode, that turn flag match errors into `no_match` entries instead (
  #22191)
- encoding.binary: add `u16`/`u32`/`u64` -> `[]u8` conversion functions  (#22193)
- crypto.sha1, crypto.sha256, crypto.sha3, crypto.sha512: improve performance for non prod builds,
  by tagging the block_generic functions with `@[direct_array_access]`
- builtin: fix string.trim() (fix #13021) (#22205)
- crypto.bcrypt: reduce runtime cost for running bcrypt_test.v, by reducing the iteration count
- crypto.scrypt: add a new `scrypt` module to vlib/crypto (#22216)
- sync.stdatomic: add OpenSUSE paths for libatomic
- crypto.scrypt: add missing comment of source for test vector (#22222)
- json: allow passing an anon struct as a decode type (#22228)
- flag: fix parse_bool_value() with different order short args (fix #22176) (#22242)
- builtin: drop C in int.v (#22245)
- strconv: fix format_fl()/format_es() (fix #13210) (#22244)
- json: fix decoding of structs with embeds (#22264)
- crypto.rand: add support for convenient generation of a random big integer in the interval
  `[0, n)` (#22266)
- json: fix json encode/decode with embed support (#22277)
- io: add a BufferedWriter and supporting methods (#22265)
- vlib: add a go like `x.benchmark` module, that estimates automatically how many iterations are
  needed, to get a statistically significant result (#22215)
- math: document q_rsqrt
- io: make buffered_writer_test.v more robust
- builtin: enable GC lib on rv64 build (#22319)
- json: support null sum types in decode()
- crypto: ecdsa module (on top of openssl)
- bench: crypto/ecdsa.v
- math.big: fix `a + b` and `a - b`, when the signs are different, add more test cases (#22330)

#### Web

- Check for using comptime $veb.html()/$vweb.html(), without importing veb or vweb (#21957)
- net: add net.Dialer and net.Connection interfaces, abstracting the different types of connections,
  already supported by the V network stack (#21657)
- net.mbedtls: support Server Name Indication (SNI) (#22012)
- veb: extract constants into consts.v (#22132)
- vweb: mark vweb as deprecated in its README, recommending using veb instead (#22131)
- veb: fix `vweb_livereload` reference to `veb_livereload` (#22171)
- veb: fix a few minor errors in the README.md (#22177)
- net.mbedtls: store the client ip (for ipv4), shutdown on handshake failure, in .accept() (#22184)
- veb: implicit context
- veb: make implicit context work with custom user types
- net.websocket: use retrying on EINTR in Client.listen() (#22279)
- net: allow ipv6 address with brackets (fix #22313) (#22316)

#### Database drivers

- db.sqlite: add instructions for installing SQLite's amalgamation or development package, if it is
  missing

#### C backend

- Fix struct ref field with no ref structinit (#21932)
- Define a flexible vint_t type (32 bit int on 32 bit systems, 64 bit otherwise)
- Fix generic sumtype with repeated concrete type (#21948)
- Fix array.map with closure var fn (#22002)
- Fix generation of closures from methods on aliases (#22004)
- Reduce indentation level for generated defer statements
- Fix selector with interface var (#22006)
- Fix free method generation for option struct (#22060)
- Fix fixed array with default init (#22059)
- Fix for loop with array fixed returned from fn (#22069)
- Fix free method for option fields (#22070)
- Fix auto free method for option map (fix #22081) (#22094)
- Return early from autofree related functions, when -autofree is not used
- Fix shared object method call (fix #22121) (#22125)
- Fix array fixed initialization from map indexing (fix #22133) (#22149)
- Fix generic options with reserved ident (#22164)
- Fix struct field with default optional value (fix #11119) (#22167)
- Fix array of fns index call with embeded array index (fix #17381) (#22198)
- Fix match with mut cond variable (#22207)
- Fix code generated for indexexpr with complex assigning (#22203)
- Fix interface type generation for generic struct (fix #22186) (#22189)
- Fix wrong type of vint_t and const riscv64 (#22251)
- Fix code for C ident when ptr is expected (#22259)
- Fix C name mangling with inherited closure vars (fix #22262) (#22263)
- Fix codegen for alias to charptr passed as ptr (fix #9679) (#22271)
- Fix codegen for option fntype used in a match (fix #22278) (#22280)
- Fix option cast from fntype (fix #22283, #22284) (#22285)
- Fix codegen for method call on rangeexpr (fix #12610) (#22291)
- Fix operation overload for type aliases of fixed arrays (fix #22297) (#22304)
- Fix codegen for assign from unsafeexpr resulting fixed array (fix #22301) (#22309)
- Fix variadic arg var passed to another call which expects variadic (fix #22315) (#22317)
- Fix aliases of array insert(...)/prepend(...) (fix #22323) (#22324)
- Fix codegen for interface method call which returns a fixed array (fix #22326) (#22331)
- Add `asm` to c_reserved, fixes compilation of `struct Abc { @asm int }` (#22340)
- Fix interface method call after smartcast (fix #17056) (#22335)
- Fix codegen for address of range (fix #18528) (#22336)

#### vfmt

- Allow align threshold to be parametrized in calls to add_new_info (#21942)
- Fix and simplify align of struct fields (#21995)
- Fix alignment of enumeration types (#21999)
- Fix enum fields with one empty line (#22007)
- Fix fmt of enum fields with empty line (#22015)
- Fix alignment of struct init fields (#22025)
- Keep empty newlines in between interface fields/methods (#22040)
- Fix interface fields or methods with empty newlines (#22046)
- Fix enum/struct_decl/struct_init fields with empty newlines (#22051)
- Fix interface fields/methods alignment (#22055)
- Remove the prefixed module name of const names, that are in the same module (related #22183) (
  #22185)
- Fix import selective with interface implements (fix formatting part of #22200) (#22209)
- Add a test for fn with c binding type args (#22212)
- Fix formating a file in an oscillating manner (fix #22223, fix #22026) (#22232)

#### Tools

- Implement a `-repeats/-R N` option to `v repeat`, to eliminate another need for platform dependent
  scripting
- ci: add hub_docker_ci.yml, for building docker images (triggered manually for now) (#22302)
- ci: use `docker compose` instead of `docker-compose` (
  see https://github.com/orgs/community/discussions/116610) (#21992)
- vrepl: suppress the welcome message, if VQUIET is set (#21941)
- Make `v where` ignore .git/ folders (they contain binary files); let `-dir .` work recursively, so
  that `-dir vlib` works
- Sort the match results in the vwhere test, to make it less flaky (#22033)
- Add an amalgamate tool and description of usage (#22034)
- Add a few missing v command entries and their flags in `v complete` (#22041)
- Colorise the output of cmd/tools/show_ancient_deprecations.v, reduce false positives (#22048)
- docs: clarify the .precision specification section for string interpolation of floats (#22061)
- docs: add a copy code function (top/right copy icon) on doc examples (#22114)
- Allow passing parameters to fuzz_v_parser_with_radamsa.sh, so that it could be run in several
  processes from the same folder
- Use separate .autofuzz.log files too for the separate invocations of fuzz_v_parser_with_radamsa.sh
- Extract .github/workflows/run_sanitizers.sh to ease local testing with different options
- parser,ast: protect against more overflows/panics, by forcing early returns on deeply nested
  expressions and scopes (#22098)
- Improve the output of `v repeat command`, by coloring the `faster/slower` label
- Add diagnostic in `v repeat` for invalid combinations of -r, -i and -a flags
- Fix `v doc` truncating code blocks, that lack a specific language (fix #22017)
- v.util: add get_build_time/0, supporting https://reproducible-builds.org/docs/source-date-epoch/
- Fix `v doc` not converting `<s>` in plain code blocks into encoded html entities in its .html
  output
- ci: run `npx prettier --write **.yml`; ensure it is run on all .yml files, not just the ones in
  the .github/workflows/ folder
- docs: add implements keyword for explicit interface implementations (#22214)
- Make fast_job.v more robust (setup a custom PATH) and informative on fast.v failures (compile it
  with -g)
- Make fast.v and fast_job.v more self sufficient
- ci: add cache and trigger for pushes, in the Hub docker action (#22314)

#### Operating System support

- docs: streamline the installation instructions and notes for Windows and Ubuntu
- v.builder: fix errors in cstrict mode on OpenBSD with clang (#22154)
- thirdparty: fix compilation of programs using miniz.h on macos
- crypto.rand: fix compilation on macos with `-cc tcc -no-retry-compilation -gc none`
- thirdparty: fix compilation of thirdparty/mbedtls with tcc on macos m1
- v.pkgconfig: fix parser, when `includedir=` lines, had trailing spaces (fix `-d use_openssl` for
  openssl 3.3.2 installed through brew on macos)
- builtin: fix compilation with tcc on OpenBSD using libgc (#22234)
- docs: add FreeBSD in cross compilation section (#22249)
- v.builder: enable LTO for clang on OpenBSD (#22247)
- thirdparty: fix compilation of programs using miniz.h on OpenBSD (#22254)
- net: fix compilation on windows (use casts to int for net.error_eintr etc)
- net: use explicit int casts for net.error_eintr etc in the unix implementation too for consistency
  with the windows one

#### Examples

- Remove drag_n_drop.v from the list of examples, that are checked for visual differences with
  vgret, since it now uses the default gg font
- docs: add more C interop notes and examples (#21965)
- cleanup obsolete unsafe{} usages in examples/sokol/sounds
- cleanup & fix the sound produced by melody.v
- add a simplified bytebeat player to show how to use sokol.audio, and that does not depend on gg
- make `rotating_textured_quad.v` compile and run on Android (#21987)
- veb: change example description, to avoid repetitive wording (ease debugging of issue#22017)
- eval: fix `./v interpret examples/hanoi.v`
- add examples/ttf_font/draw_static_text.v, to make it easier to test x.ttf with different fonts,
  and texts
- make draw_static_text.v show the font name too, for easier comparisons
- prevent cliping of long font names in draw_static_text.v
- docs: add an example on how to use Options/Results, when returning multiple values from a
  function (#22099)
- add examples/gg/draw_unicode_text_with_gg.v, for easy comparison of how different fonts and
  unicode texts will look, when rendered by gg
- add examples/veb/websocket, to show how to use http connection upgrade to a websocket, from a
  `veb` route (#22128)
- migrate vweb examples to veb
- fix type in veb_example.v
- add `gc_is_enabled()` check to `2048` to prevent crash in Android emulator (#22274)
- make `gg/rectangles.v` Android friendly (#22275)
- make `gg/stars.v` run on android (#22276)
- examples,os: add an os.asset module, use it to simplify code in examples/, by removing
  `$if android {` checks (#22281)
- add a consistent background to flappylearning, shown when the height of the view is very high (on
  Android)

## V 0.4.7

*26 Jul 2024*

#### Improvements in the language

- Add support for `-d ident=value` and retrieval in code via `$d('ident', <default value>)`
- `-warn-about-allocs` for debugging allocations when using manual memory management
- `@[freed]` attribute for assign statements (for the above mode)
- Implement `&&=` and `||=` operators  (#21678)
- Improve C var args interop, allow for `fn f(some int, ...) {` (#21812)
- A new flag `-n` for skipping notes (similar to `-w` for skipping warnings)
- Cross compilation to FreeBSD

#### Breaking changes

**none**

#### Checker improvements/fixes

- Fix unknown fixed array size for `const n = int(sizeof(u64)); _ = [n]int{}` (fix #21544) (#21548)
- Fix checking of default field initialisations, that are part of unions of structs tagged with
  `@[noinit]` (#21587)
- Disallow sum type with `Result` variants (#21620)
- Add error for `field map` (i.e. a plain untyped map), used inside a struct (#21625)
- Fix missing concrete type checking on a generic type specifier (#21614)
- Fix missing option and result wrong type return type definition (#21626)
- Turn warnings for private fields into errors (#21296)
- Support nested labeled for statements (#21658)
- Fix the return type of overloaded operators, defined on aliases of primitive types (fix #21654) (
  #21663)
- Fix match expr with auto promote number (#21696)
- Fix sorting compare fn with mut reference parameter (fix #21662) (#21706)
- Fix `$if x {` condition, using `const x = $d('ident', false)` (fix #21709) (#21713)
- Fix generic variable resolution on generic func return assignment (#21712)
- Fix result call or_block with multi-statements (fix #21504) (#21717)
- Allow `\uxxxxx` in raw strings (#21724)
- Limit recursion in Checker.ensure_type_exists/2 to 40 levels (it is usually 4 or less) (#21734)
- Add error for `field [$d('x', 2)]int = [1, 2]!` (#21741)
- Fix nested if expr method call (#21773)
- Fix generic inference in if expressions used in assignments (#21781)
- Disallow nil in non-nil arrays and vice versa  (#21786)
- Check expr evaluated but not used (fix #21436) (#21816)
- Fix wrong receiver generic resolution with embed types (#21833)
- Check mismatch of fn call mut argument (fix #21857) (#21873)
- Fix global fixed array key resolution when it is a constant ident (#21900)
- Improve checks for embed in anon struct  (#21877)
- Fix builtin fn var resolving (#21899)
- Fix spawn when calling undefined function (#21906)
- Require enum values to be declared, before using them in other enum values (#21913)
- Check enum field value duplicate (#21920)
- Allow embed of type alias anon struct  (#21928)

#### Parser improvements

- Register selective import aliases as used (#21613)
- Allow multiple flag values in enum.from() for flag enums (fix #21569) (#21615)
- Disallow duplicate operator overload  (#21675)
- Support `[$d('s', 4)]int{}`, move resolving to method on `ComptimeCall` (#21701)
- Support `$d()` in fixed size array `struct` fields (#21731)
- Suggest using type alias when defining methods on non-local types (#21803)
- Sugggest map initialization with the correct syntax  (#21817)
- Fix parameter collision for generated `@[flag]` enum methods, with modules named `flag` (#21844)
- Fix high order generic fn resolution (#21871)
- Fix recognition of `mod.Enum.val` inside fn args (#21908)

#### Compiler internals

- tools,cgen,pref: add `-coverage` support + `vcover`  tool (#21154)
- v.utils: allow to set the names of the compared items, when diffing strings (#21650)
- v.pref: fix regression of command flags not working, when there is a subfolder, named after the
  command, in the current working folder (#21647)
- transformer: handle `enum_variant = some_const + 10` (fix #21777) (#21779)
- v.builder: print the suggestion for using `v xyz` instead of `v xyz.v` just once (#21801)
- v.builder: improve the C compilation output on cgen errors (#21885)
- v.scanner: use table lookups for very frequently done character checks (#21931)
- markused: mark explicitly all used array and map methods with `-skip-unused` (fix #21907) (#21914)

#### Standard library

- builtin,v: reduce overhead and memory usage for very frequently called methods (#21540)
- builtin: reduce allocations in s.index_kmp/1 and s.replace/2 (#21561)
- os: remove mut declarions for unchanged vars in `os_nix.c.v` (#21564)
- os: make minior improvement to C function semantics and related code (#21565)
- builtin: simplify splint_nth methods (#21563)
- toml: fix `@[toml: ]`, support `@[skip]` (#21571)
- builtin:  update `last_index_u8`, deprecate `index_u8_last` string methods, make consistent with
  `last_index` (#21604)
- builtin: implement a JS version of `string.split_any` (#21612)
- crypto: add a `crypto.sha3` hash and extended output functions (#21664)
- crypto.sha3: remove unnecessary return at the end of the write function (#21669)
- builtin: fix string.find_between(), when not found end string return '' (#21670)
- builtin: add string.camel_to_snake/0 and string.snake_to_camel/0 methods (#21679)
- cgen,x.json2: fix generic map decoding (#21704)
- encoding.base32: fix warning of implicit clone of array, by using an explicit unsafe block (
  #21728)
- vlib: simplify byte character conditions by using methods like is_capital, is_lower, is_letter
  etc (#21725)
- gg: add Context.draw_cubic_bezier_recursive/2 and Context.draw_cubic_bezier_recursive_scalar/9 (
  #21749)
- ci: fix deprecations_consts.out (the warning for math.max_i8 is now an error; it was deprecated
  since 2023-12-31)
- math: add divide_truncated/2, divide_euclid/2, divide_floored/2 and modulo_truncated/2,
  modulo_euclid/2, modulo_floored/2 (#21759)
- math: avoid unused calculations for math.modulo_floored/2 and math.modulo_euclid/2
- crypto.blowfish: apply `@[direct_array_access]` to very commonly used functions (#21771)
- encoding.binary: little_endian_f32_at
- arrays: add arrays.chunk_while/2, where
  `arrays.chunk_while([0,9,2,2,3,2],fn(x int,y int)bool{return x<=y})==[[0,9],[2,2,3],[2]]`
- sokol: reduce _SGL_DEFAULT_MAX_VERTICES back to 1<<17 (1<<22 in 811ac12, leads to ~140MB of memory
  usage for gg/minimal.v, instead of just ~38MB)
- vrepl: fix os.input() (#21811)
- Improve consistency and behavior regarding explicit mutability (#21566)
- builtin: add `pub fn arguments() []string {`; make `os.args` use it, remove edge case in cgen (
  #21852)
- builtin: support `-d use_bundled_libgc` to make it easier to debug/upgrade reliably libgc cloned
  from ivmai/bdwgc (#21869)
- time: increase http_header_string performance (#21894)
- builtin: add s.trim_space_left/0 and s.trim_space_right/0 methods (#21903)
- strconv,math.bits: eliminate bounds checking in commonly used routines
- arrays: fix arrays.fold, when the `init` value in the call, is an array (#21921)
- string: fix leak in replace_once

#### Web

- net.http: change default http.Server listening address to :9009, to avoid conflicts with tools,
  that start their own http servers on 8080 like bytehound (#21570)
- net.urllib: update parse host to allow for better error handling (#21602)
- net.html: quick workaround for a cgen problem for `const x = int(0x80000000)`
- net.http:  implement http.download_file_with_progress/2, saving each chunk, as it is received,
  without growing the memory usage (#21633)
- veb: update import name in docs (#21668)
- Add `m3u8` MIME type `application/vnd.apple.mpegurl` for multimedia playlists (#21688)
- veb.auth: use constant time comparison in compare_password_with_hash (#21693)
- net.http: correct `Response.status()` method comment, to indicate returning of a `Status` enum
  field, instead of struct (#21735)
- net: fix TcpConn.peer_ip/0 to only return the ip address, without the port number (#21831)
- Add mime type `text/x-vlang`, for `.v` and `.vsh` file extensions (#21851)
- net.conv: add conv.reverse_bytes_u64/u32/u16 (#21917)

#### ORM

- orm: fix subquery without where expr (#21598)
- orm: ilike for case insensitive text search
- orm: update readme with more specifics (#21697)

#### Database drivers

#### Native backend

#### C backend

- Fix printing of floating point values in asserts (#21538)
- Fix array fixed initialization on struct from call (#21568)
- Put the `Interface(unsafe{nil})` change for now behind -experimental (#21593)
- Fix indexexpr with orexpr (fix #21591) (#21592)
- Fix generic struct init when it is a reference &T (fix #21594) (#21596)
- Fix generated code for handling fn call with result/option return on match conditional (#21608)
- Fix missing call to a function returning option, when called inside a print (fix #21616) (#21623)
- Support a `-d no_bool` option, for cgen compatibility with the C23 language standard (since `bool`
  is a builtin type and a keyword in it) (#21637)
- Fix or expr with non option fn call return (fix #21660) (#21661)
- Generate pragmas for gcc-14, to make it more relaxed by default. Support `-no-relaxed-gcc14` for
  turning them off. (#21680)
- Fix spawn code generated when calling conditional function (fix #19352) (#21681)
- Fix comptime generic arg resolution (allow several different struct fields in generic functions
  using comptime) (fix #18110) (#21682)
- Fix dumping array of reference (#21694)
- Implement g.trace_last_lines/2 to help debugging cgen problems
- Support inc cond for c style for loop with alias types  (#21708)
- Fix fn call with mut reference args (fix #21265) (#21719)
- Fix auto dereference mut variable in if expr (fix #21309) (#21720)
- Fix smartcasting a reference to a sumtype value (#21730)
- Fix assert checking fn option ret with `none` (#21726)
- Fix generics map with the reference argument (#21737)
- Fix shortcircuiting of infix and/or expressions (#21740)
- Simplify in infix_expr_and_or_op() (#21745)
- Fix reference variable str() method call (#21753)
- Fix scope command when `$dbg` breakpoint is on or-expr (fix #21772) (#21747)
- Fix array fixed empty struct code generated on clang (fix #21761) (#21764)
- Allow alias to array fixed to be initialized like `[n]int{}` (#21785)
- Fix comptime call argument auto conversion for indexexpr (fix #15232) (#21796)
- Fix const name without main prefix in `-translated` mode (#21789)
- Fix closure variable with optional reference params (fix #21827) (#21829)
- Fix auto str for fn struct member (#21825)
- Fix option string struct member init with autofree (#21859)
- Fix fn mut argument of sumtype reference (#21874)
- Fix generic type init syntax for primitive types  (#21872)
- Fix missing `&` in string representation of `map[X]&Y` (#21890)
- Fix optional closure direct call (#21892)
- Fix wrong missing unsafe block checking when calling generic functions with @[unsafe] attr (
  #21898)
- Fix typeof(var.typ) with comptime $for variables (#21901)
- Fix enum with const value (#21919)
- Fix generic option/result reference return (#21922)

#### vfmt

- Allow single line `defer {}`, just like `or {}`
- Don't break `it` variable name in match expression function calls (#21600)
- Exit with error code if encountering diffs with `-diff` flag (#21603)
- Add fn_with_mut_ref_params_keep.vv (#21711)
- Implement wrapping function's super long arguments  (fix #15545, fix #21643) (#21782)
- Keep manual newlines after fn parameters in fn declarations, do not auto wrap (#21795)

#### Tools

- Fix spurious ending quote in the output of show_manual_release_cmd.vsh
- Dockerfile.alpine: update to alpine:3.20, add more tools like gdb, libunwind, gc, to ease
  producing and debugging static executable in more situations (#21583)
- Add `v download URL` for downloading single files, to avoid curl/wget etc, which are not available
  uniformly. (#21597)
- ci: use shebang with better portability in shell scripts, format shell scripts (#21605)
- Don't write vpm logfiles in CI runs (#21649)
- ci: make vmodules_overrides_test.v failures more informative
- Fix measurements for `./v repeat "./vold -o x project/" "./vnew -o x project/"`
- Make the summary output of `v repeat` more informative
- Disallow self referencing function alias types like `type FnType = fn(string) FnType` and
  `type FnType = fn (FnType) string` (#21733)
- vrepl: fix method call (fix #21788) (#21792)
- ci: restore v_apps_and_modules_compile_ci.yml (#21791)
- vrepl: fix output of the fn call (related #21792) (#21800)
- vrepl: fix variable name starts with print (#21806)
- v.pref: make pref_test.v be less sensitive on the specific C compiler used as a backend (#21813)
- vrepl: fix arbitrary script execute (#21818)
- ci: disable c2v_ci.yml temporarily, until it is fixed
- vrepl: lots of fixes in REPL
- Add a TOTAL line, to the output of -show-timings, to minimise the need for external tools on
  windows (#21847)

#### Operating System support

- veb: support sendfile() syscall on FreeBSD (#21541)
- os: use 1 instead of C.SW_SHOWNORMAL to workaround a cross compilation issue from linux to windows
- v.builder: minimise the amount of linked libs for cross compilation to FreeBSD
- v.builder: support downloading the FreeBSD cross compilation files on first use
- Add a test for crosscompiling hw, on linux and macos, to FreeBSD (#21553)
- vlib: make `./v -Wimpure-v -W test vlib/` pass on Linux (#21554)
- os: fix debugger_present() for non Windows OSes (#21573)
- ci: extend coverage, move app test from macos_ci to v_apps_and_modules_ci (#21584)
- gc: fix tcc on macos
- os.font: return the "segoeui.ttf" font, if its file exists on Windows (#21655)
- readline: fix s := read_line('Message\nName:') on unix/linux (#21930)

## V 0.4.6

*20 May 2024*

#### Improvements in the language

- Experimental `x.vweb` is now `veb`, the official and recommended way to build web apps in V. Built
  on top of pico.v.
- autofree: -print_autofree_vars command line flag for printing variables autofree couldn't free
- Add `@VMODHASH` comptime variable to store the commit sha of a V module (#21091)
- Fix sumtype support for option variant types (#21101)
- Utilize new diff functions in errors (expected/found) (#21431)
- Add @[_linker_section] for global variables

#### Breaking changes

- checker: disallow initializing private struct fields outside structs module (#21183)

#### Checker improvements/fixes

- Ambiguous expression notice for `& << >>`, similar to `&& ||`
- Disallow using aliases of ?Type as !Type (#21128)
- Fix option checker arg validation for ptr passing on non expected ptr (#21087)
- Optimize option and result type check, add more typinfo to error details (#21105)
- Move error handling for `any` type to the checker to resolve parsing issues (#21146)
- Move error handling for user defined type duplicates to the checker to resolve parsing issues (
  #21147)
- Detect redundant ref when assigning call expr with ref return (#21141)
- Fix multi return using nil and voidptrfix (fix #17343) (#21144)
- Fix C struct embedded init fields checking (#21137)
- Remove resolved vfmt workaround and TODO (#21175)
- Move more match validation from the parser into the checker, add error for match without
  branches (#21181)
- Improve the error message for an unknown type (#21207)
- Allow passing `none` to `fn f(arg ?&Type) {` (fix #21213) (#21231)
- Fix -parallel-cc regression (part 1, workaround .filter(fn[c]) used in checker/orm.v) (#21238)
- Detect and error on unreachable code in loops, after `continue` and `break` statements (#21294)
- Disallow `Result` callbacks functions like `map/filter/all/any` (#21055)
- Fix missing check for or expr on string interpolation (#17566)
- Allow pass array as mut param to spawn fn (#21283)
- Turn array assign warning into error (#21341)
- Ignore last semicolon on or-expr (#21361)
- Disallow structs with `@[params]` attribute as mutable function parameters (#21206)
- Set auto Return pos correctly; cgen: autofree fix for optional returns
- Disallow invalid ptr operations  (#21515)
- Fix wrong checking for heap struct (#21511)
- Allow alias enum flagged to have bit operations  (#21532)
- Simplify, utilize pref.vroot (#21096)
- Fix option interface member checking when `none` is passed (#21509)

#### Parser improvements

- Fix option as possible match case for sumtype (#21079)
- orm: disallow invalid infix for where clause in `delete` and `update`  (#21113)
- Fix case of falsely registering imports as used, remove unused imports (#21156)
- Remove redundant comments_mode field (#21198)
- Update file path fields; use more expressive name for file path, remove obsolete `file_name_dir`
  field (#21202)
- Add missing docstrings for vlib/v/ast/comptime_const_values.v functions (#21219)
- Allow struct init on `for in Iterator{} {` (fix #21179) (#21282)
- Fix `for x in Iterator{} {`, when there are no field initialisations (#21333)
- Add check for result type on chan init (#21363)
- Fix comptime panic for `$tmpl("x.html")`, when the template file contained % at the end (#21402)
- Parse string and array typ idx of `ScopeVar` and `Ident` (#21523)

#### Compiler internals

- v.util: use tmp instead of cache dir for temporary diff files (#21075)
- v.util: fix module lookup if module import parts end with the word `modules` (#21083)
- v.util: update `githash` to be able to get the githash of every passed project (#21178)
- v.util: improve detection for opendiff when automatically searching difftools (#21241)
- v.util: improve color_compare_files (#21247)
- v.util: improve find_diff_cmd: don't add spaces to result without env opts (#21242)
- v.util: fix diff coloring, add test (#21260)
- v.util: polish off diff utils after recent updates and fixes, add doc comments to pub fns (#21275)
- v.builder: suggest using `v wipe-cache`, when the object files are not recognized
- pref: be more conservative when generating code using `-cross`, allow for `$if cross ? {`
- builder: use cc enum in CcompilerOptions, fix cc detection, enable cc guessing without prod flag (
  #21370)
- pref: fix version flag handling (#21377)
- pref: make minor performance related changes / simplify (#21379)
- builder: simplify generic cc detection (#21380)
- pref: extract architecture related code into `arch.c.v`; rename `pref.c.v` to `pref.v` (#21387)
- pref: update `os_from_string`, add missing `qnx`, remove deprecated wasm options that used `-`
  instead of `_` (#21390)
- v.util: rewrite diff module, deprecate old functions (#21403)
- v.util: fix color when auto tool is `diff` (#21435)
- v.util: make diff_test.v more robust to the color settings for the chosen local diff tool
- v.util: fix performance with `v test-cleancode`, when a slower diff tool is installed (#21447)
- v.util: remove fast path in `diff.compare_text` (#21458)
- v.pref: error for `v file.v --unknown-option` (#21391)

#### Standard library

- builtin,dlmalloc: fixes for `v vlib/v/gen/c/coutput_test.v` for gcc14.1, which is stricter
- Min window width and height
- builtin: str.last_index(); pref: hide-auto-str;
- toml: update the alexcrichton and BurntSushi repos to their successors toml-rs, and toml-test,
  record new exceptions (#21152)
- breaking,vlib: update handling of imports whose symbols are not directly used in imported file,
  remove `pub const is_used = 1` workarounds (#21160)
- json: allow `i32` decoding and encoding (#21162)
- json2: add ability to decode arrays (#21163)
- json2,checker,toml: allow field.typ compile-time checking with MatchExpr and add array of option
  checking (#21171)
- gg: draw_text with custom fonts
- x.json2: add a way to decode an array (#21186)
- os: clarify some doc comments (#21209)
- os: fix double free in os.get_raw_line() (used by os.input), with `-autofree` (#21204)
- time: extract Duration related code into duration.v (#21229)
- builtin: implement an `at_exit(cb)` wrapper for C.atexit (part 1) (#21254)
- os: format readme, fix markdown inside html (#21286)
- time: update unix time acces, fix issues related to deviating unix times (#21293)
- vlib: refactor empty string checks to use `s == ''` or `s != ''`, instead of `s.len == 0` (#21300)
- cli: update `command_test.v` (#21307)
- cli: extend control over defaults (#21308)
- thirdparty/sokol: bump _SGL_DEFAULT_MAX_VERTICES and _SGL_DEFAULT_MAX_COMMANDS again; mark them
  with `__v_ start` and `__v_ end`
- sync: add Gentoo paths for libatomic
- sync.stdatomic: add flag lines for gcc 14 too
- gg: make `PenConfig` fields public (#21353)
- builtin: fix undefined read s[0], from ''.is_lower() and ''.is_upper() in c7af2c2
- builtin: fix empty string lower / upper assert (#21358)
- cli: simplify flag parsing (#21392)
- os,runtime: workaround for v.c generation instability
- datatypes: fix for set `-` operator, union and intersection, now they no longer change the
  receiver (fix #21315) (#21362)
- sync.stdatomic: add paths for compilation with musl on Gentoo (#21400)
- os: fix os.execute stderr redirection (fix #20986) (#21404)
- time: fix the string representation of a negative Duration (#21407)
- cli: make program outputs using the cli module testable in `cli/testdata` (#21456)
- math.unsigned: permit _ separators in Uint128 decimal strings passed to uint128_from_dec_str (
  #21461)
- cli: fix default flags when their command equivalents are disabled (#21469)
- toml: simplify `decode_quoted_escapes` (#21472)
- os: fix join-path (#21425)
- builtin: simplify MessageError.msg() (#21524)
- all: replace usages of C.atexit(cb) with `at_exit(cb) or {}` (part 2) (#21263)
- math.unsigned: fix some Uint256 bugs and add tests (#21528)

#### Web

- Update `mbedtls` to latest compatible version v3.3.0 (#21118)
- veb.auth: a minor find_token fix
- Improve descriptions (#21155)
- ci: change listen ports in vweb_should_listen_on_both_ipv4_and_ipv6_by_default_test.v for both
  vweb and x.vweb, to reduce probability of network errors
- ci: mark both vweb and x.vweb versions of
  vweb_should_listen_on_both_ipv4_and_ipv6_by_default_test.v as flaky
- breaking,net.ftp: allow to choose a different port than port 21 (change FTP.connect to accept
  `host:port`, not just a `host` address) (#21185)
- x.vweb: accept query params as method arguments (#21201)
- net.http.file: support index_file (`index.html` by default), and auto_index (true by default)
  parameters to file.serve()
- veb: copy x.vweb to veb, and make it work with comptime
- ci: fix the ubuntu-docker-musl job by skipping veb_app_test.v
- pref: support a shortcut: `v -http` for `v -e "import net.http.file; file.serve()"` .
- net: add a .port()! method for net.Addr (#21412)
- net: improve error message in .port()
- picoev: handle `EAGAIN` or `EWOULDBLOCK` quietly (#21480)
- net.unix: remove debug/trace eprintln (#21517)

#### ORM

- Add error for unchecked option multi return types, fix undefined behavior (#21106)

#### Database drivers

- db.mysql: fix invalid memory access in exec_one for returned rows with NULL fields (#21317)

#### C backend

- Enable autofree for option (#21051)
- Force C struct types which does not implement str() to be passed as ptr (#21054)
- Improve diagnostic information for ORM queries with invalid types
- Allow static call on generic type (#21071)
- Fix code generation for a struct field, having a type of fixed array of options `field [5]?Type` (
  #21082)
- Add the `_M_ARM64` macro to endianness check (#21109)
- Fix return code when returning interface result type (fix #21115) (#21130)
- Fix const initialized with array (#21131)
- Fix infix array heap comparison (#21145)