Releases: odin-lang/Odin
dev-2026-04
New Language Features
- Fixed Capacity Dynamic Arrays, adds
[dynamic; N]T
New Compiler Improvements
- Limit maximum exponent of integer literals to avoid unnecessary work
- Add
-in-source-orderoption toodin docto show docs in source order within each file - Support clang-style
+/-prefixes in target features - Fix #6396: handle full-width
bit_fieldliteral masks - Fix #6401: generic cycle deadlock in struct layout
- Add support for other Android architectures
- Fix #5602: "Internal Compiler Error: Type_Info for 'x' could not be found" for poly procs with named parameters
- Continuous Compiler Improvements
- Add initial LLVM 22 support on non-Windows platforms
- More accurate
-march:nativefeature selection - Allow pointers to types which have subtype fields at offset 0 to be assignable in proc parameters.
offset_of(some_bit_field)now raises a proper error- Add
intrinsics.type_field_bit_offset(typeid, string)to get a compile-timebit_fieldfield offset in bits - Add
intrinsics.type_field_bit_size(typeid, string)to get a compile-timebit_fieldfield size in bits (the value after|) - Fix #6407: Global unions do not get initialized correctly
- Fix
>=comparisonbase:runtimedependencies forstringandcstringtypes - Fix
GB_PANICformat string inlb_emit_convinvalid subtype cast - Fix
[^]u16tocstring16transmute condition inlb_emit_conv - Remove
Tildebackend - Fix #6484: Two
whenblocks which evaluate totruein aforeignblock misses following decls - Fix declaration order bug #6506: False-positive
where-clause failures in recursive polymorphic subtype cases - Fix declaration order bugs #5572 and #5961: Incorrectly rejecting valid in-progress/forward union references
New Packages
core:crypto/argon2idinitial importvendor:windows/wasapivendor:sdl3/mixer
Package Improvements
- Add more JS to
examples/all - Update Unicode database to newer version
- Fix modular exponentiation in
core:math/big - Fix
assign_atdocumentation core:fmtnow formatstime.Durationwith a space between duration and unit when using% v- Correct SIMD
shrexample documention - Fix
sync.Auto_Reset_Eventsignal deadlock core:sys/darwin/Foundation: fixNSTimerbinding- Partial 1.619.x d3d12 bindings
core:mem/virtual: Fix for virtual arena overcommit bug #5821core:crypto: Add ARM AES hardware accelerationcore:crypto: Add ARM SHA256 hardware accelerationcore:fmt: Improvecore:container/small_arrayformattingvendor:stb/vorbis: Add WASM supportcore:encoding/cbor: Fix order-dependent partial unmarshalscore:encoding/json: Fix user unmarshaler example- Fix possible OOM in
core:os.get_working_directory()on Linux - Fix #6455:
core:mem/virtual.map_file_from_pathignores flags - Fix for corner case in the
core:memscratch allocator. - Minor cleanup in
base:runtimeandcore:mem - Fix #6495: Handle starting separator during name comparison in
core:os - Improved
delete_keydocumentation to mention it's safe to delete keys while iterating a map as long as no resizes take place - Fix source size check in
core:crypto/aesECB encrypt/decrypt
Full Change Log
Full Changelog: dev-2026-03...dev-2026-04
dev-2026-03
BREAKING Changes
-
core:oshas been replaced with our newly improved and rewritten v2, previously available atcore:os/os2. The oldcore:osimplementation will remain available atcore:os/olduntil sometime in Q3 of 2026.- Article on Moving Towards a New
"core:os"
- Article on Moving Towards a New
-
core:sys/infopreviously retrieved all information beforemainwas entered, using@(init), and exposed everything via globals. It now gathers more information on demand, and returns everything via accessors for a consistent API. Where practical - like cpu name + features - those values will be cached.
New Language Features
for init; x in y {}style loops
New Compiler Improvements
- Stop silently ignoring unknown directives on an inline
asmexpression - Do not allow duplicated
#partialdirectives on switch statements - Add broadcasting to strings (Fix #1837)
- Improve LLVM version picking
- Fix name canonicalization for typed ranges in
bit_set - Fix
bit_setparapoly specialization - Fix separating of diverging procedure types from block statements
- Update
Type_Info_Bit_Setto always record underlying type. Addruntime.type_info_underlying - Fix #6347
- Fix #6270
New Packages
core:crypto/ecdsa: Add ECDSA support
Package Improvements
- [BREAKING]
core:os/os2->core:osintegration - [BREAKING]
core:sys/info: Change API from globals to calls. Do as little work in@(init)as practical. - Allow test names to be specified as a command line option for tests executable
vendor:x11/xlib: Fix signature of XChangeWindowAttributesvendor:directx/d3d12: AddedIGraphicsCommandList7and fix access violation errors- Minimize some internal depencies in the
corepackages, e.g. don't importcore:memjust formem.Allocator_Error vendor:box2d: Fix and try Git LFScore:log: Add support forjs/wasmcore:container/xar: Fixes and improvementscore:container/pool: Fix parapoly type inference around address sanitization when using multiple Pool typescore:container/handle_map: Improvementdemo.odinFixcross_3dtypocore:encoding/hex: Add uppercase encodingcore:bytes: Update comment oncompare; add additional caller location propagationcore:math/big: Clean upcore:os: Fix silent failure inos.replace_path_separatorsif the separator was multi-byte- Add additional tests
core:sys/es: Fix build errorscore:unicode/utf8: Fix utf-8 validation- Vendor Wycheproof cryptographic tests under
tests/core/ - Propagate allocator errors from certain unicode functions
- Fix some tools and examples after
core:osupdate andusing-stmtfeature - Fix typo in
atomic.odindocumentation core:os: Removeprocess_closeand addprocess_terminatecore:time: Correct 12-hour clock string- Update Unicode specification
vendor:curl: Fixwhatargument forurl_set- Small optimization for dynamic arrays
vendor:miniaudio: Upgrade to 0.11.24core:container/priority_queue: Add example and testscore:text/regex: Fix\bhandling in iteratorvendor:sdl3: Update to 3.4.2- Add bindings to allow custom hardware cursors
core:nbio: Fix op reusecore:strings: Fixsubstringnot returning end of rangecore:sys/windows: Add morewin32API bindingscore:sys/windows: Fix incorrectPVOID/VOIDuse in some signaturescore:sys/windows: Tighten upMultiByteToWideCharusage inutf8_to_wstring_bufvendor:stb/vorbis: Remove unnecessarycore:c/libcimportvendor:wasm/WebGL: Add bindings, fixTex*Image*Dcore:os: Return.Permission_Deniedfor.EACCESin Posix and Linuxcore:crypto/_blake2: Fix final blocks call with partial block- Kill deprecated file tags and fix assignment of package docs
Full Change Log
Full Changelog: dev-2026-02...dev-2026-03
dev-2026-02
New Language Features
#+feature using-stmtusingas a statement and procedure parameter modifier is now an opt-in feature on a per-file basis rather than on by defaultusingon struct fields still works
struct #simple- force a struct to use simple comparison if all of the fields "nearly simply comparable"
- This is a niche solution to a niche problem
- "simply comparable" are types which can be compared with the equivalent of C's
memcmpdirectly (e.g. integers, booleans, aggregates of them) - "nearly simply comparable" include the simply comparable types and floats, since floats have different rules for
+0,-0, andNaN, and are NEARLY simply comparable if you don't care about those edge cases - This struct directive will force a struct to be "simply comparable" even if its fields would make it "nearly simply comparable"
New Compiler Improvements
- Link-Time Optimization Support
-lto:thinand-lto:thin-files
#must_taildirective andpreserve/none/preserve/most/preserve/allcalling conventions- Enables the ability to state how optimize for tail calls
-disable-unwind- Improvements to the constant conversion checks
intrinsics.count_leading_onesandintrinsics.count_trailing_ones- Show
-targetflag usage example in help - Numerous debug info fixes
- Static linking on non-Windows platforms
- Add warning for
size_of(&x)as it will always besize_of(rawptr)and probably a typo -target:freestanding_amd64_mingw- Allowing for linking to MinGW on Windows but for freestanding purposes (not general)
- Fix
string16issues on Mac and Linux - Fix
in/not_inon constantbit_sets - Allow
#+vettags always work in addition to command line flag - General fixes to
-vet - Type assertions now use the same
context.assertion_failure_procasassertandpanicwhere possible #+feature force-type-assertwhich overrides-no-type-asserton a per-file basis- Fix numerous data races in the compiler frontend
- Fix numerous threading bugs in the compiler frontend
New Packages
core:nbio- Non-Blocking IO
core:container/handle_map- Utilizing
core:container/xarfor stable backing data
- Utilizing
Package Improvements
core:thread- Add
initandfinicallback procedures to thread pools
- Add
core:crypto- Add initial support for short Weierstrass curves
- General improvements and additions
core:testing- Use Windows API for SIG handling on Windows
core:image- Fix TGA header detections
.do_not_expand_grayscalefor TGA
core:os/core:os/os2- Fix
lookup_env_buf - Fix truncate-clamp op order when determining to_read size
- Fix
core:encoding/base64- Add support URL variant
core:encoding/entity- Update handling of 2-codepoint based entities
core:encoding/xml- Correct how comment handling and entities
core:strings- Add
loc := #caller_locationto allocating procedures that would benefit for it
- Add
core:sys/windows- add a few procedure bindings
- sync barriers
- procedure-based "macros" for RawInput
core:text/regex- Pass given allocator on in
create_iterator
- Pass given allocator on in
vendor:x11/xlib- Binding fixes, correcting incorrect signatures
vendor:directx- Improve string type uses in DirectX bindings
vendor:compress/lz4- Fix linking on non-Windows platforms
vendor:curl- Fix linking on all unix-like OSes
vendor:sdl3- Add missing procedures
GetGpueDeviceProperties - Fix signature of
RenderTextureRotated
- Add missing procedures
vendor:sdl3/image- Update to 3.4.0
- Move
vendor:libctovendor:libc-shim- This is to clarify that it exists as a "shim" rather than a proper replacement
- Update Orca bindings
- General additions and improvements to
core:sys/linux - Bulk-write to a slice in xoshiro/pcg_random_generator_proc
- Fixes to darwin/Foundation bindings
Full Change Log
Full Changelog: dev-2026-01...dev-2026-02
dev-2026-01
New Language Features
New Compiler Improvements
- Undetected type declaration cycles work-around
- Fix misleading error messages for
init,finiandtestattributes - Fix automatic
objc_msgSendon static methods via selector expression not resolving aliased types - Fix
#packed #all_or_none - Fix auto
objc_msgSendincorrectly treating certain class methods as instance methods. - Fix handling of
#force_inline - Fix literal endianness
New Packages
core:container/xar, an Odin-native implementation of an Exponential Array
Package Improvements
- Fix duplicate
jpeg.loadon JS - Added more
NSApplicationandNSWindowbindings - Update
kb_text_shapeto v2.03 - Fix default temp allocator underflow bug
- SDL2: Use multi-pointer so you can pass array
- Fix function signature for memmove in
vendor:libc - Freebsd: Fixed 'write' syscall to cause 'ESPIPE' on the pipe fd
- Update
Box2dto 3.1.1 - Fix
core:debug/traceexample - Make
linux.IO_Vec.basea multipointer - Ensure libc is linked on Windows for
vendor:compress/lz4 - Change Return Type of
sdl2.GetWindowFlagsfromu32to ExistingWindowFlagsbit_set - Fix minor issues within
curlbindings core:time/timezoneadded additional search paths to match musl- More bindings for Darwin
- Add
@builtinto missing builtin procedure group procs - os/os2: fix stale errors on windows when reading from console
- os/os2: better fix for the stale errors
- Fix
runtime.print_i64using an OOB index whenmin(i64)is given. - os/os2: use ReadFile for Console reads too, at least for now
- core:sys/linux Add timerfd syscall wrappers
- Fix
nfds_talias for Linux core:io/utils: fix buffer size inwrite_*procscore:netdocs: recv of 0 bytes with no error is a graceful closecore:math/randsmall documentation fix- Address issue identifying CDATA in XML file
- encoding/base32: Fix padding validation for malformed input
- Fix standard json parsing / unmarshalling issue for pure arrays
- Add user32 scroll bar related bindings, and FrameRect
- Add missing 'caller_location' to several procedures in 'slice' package
- Update
letter.odin - WebGL binding additions
- Add JSON5/SJSON Comments When Marshalling
- Fix Unicode Output When Marshalling JSON
- Allow Unmarshalling to rune
- Custom json (un)marshalling, similar to
core:fmt's custom formatters - Fix
net.map_to_ip6offset - [vendor/sdl3] update to sdl 3.4.0
Other
Full Changelog: dev-2025-12a...dev-2026-01
dev-2025-12a
New Language Features
New Compiler Improvements
- Fix duplicate code emission in type assertions.
New Packages
Package Improvements
core:os/os2: Fix #5873- Replace cURL library for Windows with one built against msvcrt
- Update cURL bindings to 8.17
Full Changelog: dev-2025-12...dev-2025-12a
dev-2025-12
Breaking changes
- BREAKING: Use
chacha8randas the default RNG.
The old default generator is available under core:math/rand in rand_pcg.odin in case you require a seed to return the same sequence as before.
New Language Features
- Introduce
#all_or_nonefor structs, which requires that struct literals have all or none of the fields set
New Compiler Improvements
- Use SIP hash as name canonicalization hash
- Moved checking of
-vet-unused-proceduresand-vet-packagesflags to after all flags are parsed - Fixes for 32 bit with regards to typeid
- Fix #5894
- Remove
#no_copy - Don't check proc signature similarity for imported Objective-C methods
- Ubuntu arm ci and posix fixes
- Fix allocation of anonymous globals
- Fix #5967: Incorrect stack overflow warning for by ref switches over unions
- Skip collision panic when package names aren't unique
New Packages
- Add
vendor:curl
Package Improvements
- Improve docs for stable sort procedures
- Fix:
linalg.quaternion_from_forward_and_up - Clone unquoted strings in
encoding/json - Add missing
SetLayeredWindowAttributes - Add io uring API
- Add
FreeLibraryAndExitThreadin kernel32. AddEnumProcessModulesin psapi - Fix typo in
NS.String_initWithCString - Remove the Darwin-specific paths from
thread_unix - Fix
thread_act_tsize - Fix: make
choice_bit_setrespectbit_setdomain math/rand: Add range-based number generation procedures- Fix
is_pointer_internallynot handling Named Types - Faster
big.itoa - Add Xoshiro256 RNG
- Add
LockFileEx/UnlockFileExand related flags - Fix
vendor:stb/imageresizealpha_channelparameter type toc.int - Move some OS
General_Errorvalues toio.Error - Fix out of bounds access when parsing end_pos
- Add
WSASendToandWSARecvFrom - Update
d3d12bindings forD3D12_FEATURE_D3D12_TIGHT_ALIGNMENT - Add
NSWindowcoordinate space conversion bindings - Don't build log allocator file on freestanding targets
- Adjust docs links for satellite SDL libraries
- Increase
base64decoding table size to 256, preventing out of bounds reads vendor/xlib: a few more IM-related procedures and constants- add
math.signandmath.sign_bitoverloads for int types - Implement more Linux syscalls
- Add
SIO_UDP_CONNRESETwinsock constant os2.File_Stream
Other
- Fix up macOS CI
Full Changelog: dev-2025-11...dev-2025-12
dev-2025-11
Licensing Changes
- Change Odin's LICENSE to zlib from BSD 3-clause
New Language Features
intrinsics.concatenate- Concatentation of constant slices, strings, and some arrays at compile time
intrinsics.objc_super&@(objc_superclass=<type>)
New Compiler Improvements
- Objective-C interface improvements
intrinsics.objc_superand automatically emitobjc_msgSendcalls where necessary for@(objc_superclass)attribute- Fix block symbols naming conflict across modules
- LLVM backend fixes
#simdvector only uses bit cast when elements are not pointers- Fix bitcasting
contextpointer to prevent compilation errors on LLVM-14 - Numerous constant union improvements
- Prefer the
Type *verLLVMTypeRefwhen looking upstruct_field_remappingdue to lack of uniqueness
- Default parameter exclusion counting improvement for procedure groups
- Improved
-target-featuresflag by allow the user to disable a target feature-target-features:-sse,-sse2,-avx
-export-linked-libs-file:<string>flag to export the linked libraries to a file- Fix a few compiler hangs on macOS.
- LLVM 21 support for non-Windows platforms
- Fix:
#loadalignment bug- set minimum alignment to 16-bytes
- Fix orca linking path
- Add
#subtype/usingto name canonicalization rules - Numerous frontend bugs fixed
New Packages
Package Improvements
- More documentation improvements across the core library
- General improvements and more documentation for
core:os/os2 - Add
inject_at_soaandappend_nothing_soa vendor:wgpuupdate to 27.0.2.0core:unicode/utf8: AddGrapheme_Iterator- New
slice.sortimplementation to allow for better code generation and general API - Deprecate the C style procedures in
strconv(e.g.iota,atoi, etc`) - WASM: Fix odin.js undefined
this.mem - Fix sRGB <-> linear RGB conversion
core:encoding/jsonfixes- Fix
nullparsing in certain cases
- Fix
core:encoding/cbor: Fix epoch tag with small valuescore:container/rbtreeaddfind_or_insert- Fix bindings generator for
vendor:vulkanfor extensions and~0style constants - Disable bounds checking where appropriate for Unicode and UTF-8 procedures
vendor:fontstash: Fix crash with.TTCfilescore:simd: Fix incorrectly named calls inbit_notvendor:sdl3: AddPointInRectFloatvendor/egl- add a few more procedures and constants
- Fix
GetPlatformDisplayandCreatePlatformWindowSurfaceto useintinstead ofi32
vendor:box2d- fixes to bindings mismatches
- Add
targetAngletoRevoluteJointstruct/procs
core:odin/parser- fixes for
end_pos - parse empty identifiers after selector as a selector expression with an empty field
- fixes for
core:hash: add CCITT CRC-16- Make packed conditional on
EPoll_Eventto match kernel core:math/linalg/hlsl: supporthalftypescore:math/ease: Add inverse ease proceduresvendor:raylib: addMAX_MATERIAL_MAPSconstantcore:sys/darwin/Foundation: add additional AppKit bindingscore:text/scannerallow for octal prefix style parsing for C-style ints
Full Changelog: dev-2025-10...dev-2025-11
dev-2025-10
New Language Features
New Compiler Improvements
- Improve type inferencing of literals when calling proc groups
- Windows i386 support
- Fix Darwin
addObservermethods and add support for newObjc_Block - Fix segfault involving
string_to_string16on Linux - Improve OSX threading performance
- Basic support for constant union literals
- Add
-build-diagnostics - Prevent returning a struct containing compound literal slice
- Relax
signature_parameter_similar_enoughon struct params and fix various foreign signatures - Preempt field checking on
signature_parameter_similar_enoughwith a type ptr equality check - Remove stray debug printf
New Packages
- [core/image]: Add baseline JPEG support
Package Improvements
- Use
.Image_Dimensions_Too_Largeincore:image tick_now: Usef64(wasf32) as a return type ofodin_env.tick_now()- Allow missing trailing comma with proc groups in
core:odinparser - Fix incorrect json encoding for control characters < 32
- Initializing
big.Intconstants is now"contextless" - Add
CancelIoExand other overlapped I/O functions. - Add missing caller location param to append in
strings.Builder - Add "contextless" to small_array
get_safeandget_ptr_safe - Zero
small_arrayresize - Unify
filepath.joinreturn between Unix/Windows - Fix out-of-band allocations in dynamic arenas by
- Fix for
temp_filename prefix being deallocated before being used - Add
runtime.conditional_mem_zeroto improveheap_allocatorperformance on non-Windows systems - Add
digit_to_inttocore:strconv - Remove inaccurate tprint comment
Full Changelog: dev-2025-09...dev-2025-10
dev-2025-09
New Language Features
- Native support for UTF-16 strings:
string16andcstring16- Mostly for interfacing with Windows code, and other foreign code
- Define Integer Division By Zero #5556
New Compiler Improvements
@(init)and@(fini)must beproc "contextless" ()- Implement
intrinsics.objc_block@harold-b in #5547- Implements the Apple block ABI.2010.3.16 natively
- Improve deference missing suggestion message
- Do not check for explicit allocators when determining proc in proc group by @janga-perlind in #5564
- Skip errors on polymorphic procs when in a proc group with other options
- Fix compiler segfault when trying to use proc at type level or trying to use
()as a type
New Packages
Package Improvements
- Fixes to
vendor:darwin/Metal - Numerous minor fixes to
base:runtime - Improvements to
base:runtimedocs - Fixes to
vendor:wasm/WebGLbindings - Cleanup in
math/randandruntime/random_generator - Add missing xlib functions for getting and setting text properties
vendor:OpenGLfix misnamed parameter by- Make D3D12_FEATURE_DATA_D3D12_OPTIONS.MinPrecisionSupport a bitset
- Fix buddy allocator assert
- Check for EOF when scanning file tags
- Fix stride in
memory_equal/compare_zerogiving false positves - Split SDL_ttf bindings to group with and without require_results
- Propogate
#caller_locationto core:container/queue procs - Support using allocator resize in
_reserve_soa - Zero existing memory when using
resize_soa - Add
add/remove_document_event_listener()tocore:sys/wasm/js - Fixed and added obj-c methods for
NSWindow - fix typo in
CLSIDFromProgIDExsignature - Fix broken
wglUseFontBitmapsbinding - Add
LPFN_GETACCEPTEXSOCKADDRSto ws2_32.odin - Specify
%mand%Mas verbs for integer formatting incore:fmt - Add
@(require_results)attribute to procs returning an allocator - Handle allocator error when appending in
read_entire_file_from_file vendor:box2dfixCreateMotorJointprocedure signature- Add build tags to
posix/spawn.odin
Full Changelog: dev-2025-08...dev-2025-09
dev-2025-08
New Language Features
New Compiler Improvements
- General compiler bug fixes
intrinsics.type_enum_is_contiguousintrinsics.simd_runtime_swizzle- Add iOS and iPhoneSimulator subtargets for
-target:darwin - Fix
@(objc_implement)methods not respecting@(objc_is_class_method) @(objc_name)attribute be inferrable- Add
Did you mean?forcard/len #+vet explicit-allocators- Saner stack linker flags for WASM
- Fix macos amd64 builds
- amd64 ABI fixes regarding certain types of SIMD vectors
New Packages
Package Improvements
- Update
core:prof/spallto version 3- Adds @(no_instrumentation) to spall buffer and SCOPED operations
core:hash/xxhash: Static SIMD Support for XXH3- Minor fixes to
core:mem/virtualedge cases - Unix build script for
kb_text_shape - Add
IUnknownUUID for win32 related code crypto/hash: hash_bytes_to_buffer slice result to digest size- Minor fix to
-default-to-nil-allocator - Disable filepath/match.odin and filepath/walk.odin compilation on js targets
- Minor fixes to
SDL_imagesave procedure that should return a boolean - Mach Process Control
- Fix amd64 no-crt entry assembly
- Add cgltf filter type and wrap mode enums
- SDL2 - AudioAllowChangeFlags bit_set
core:thread- set stack size to rlimit for *nix platforms
Full Changelog: dev-2025-07...dev-2025-08