Skip to content

Releases: odin-lang/Odin

dev-2026-04

03 Apr 10:04
a896fb2

Choose a tag to compare

New Language Features

New Compiler Improvements

  • Limit maximum exponent of integer literals to avoid unnecessary work
  • Add -in-source-order option to odin doc to show docs in source order within each file
  • Support clang-style +/- prefixes in target features
  • Fix #6396: handle full-width bit_field literal 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:native feature 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-time bit_field field offset in bits
  • Add intrinsics.type_field_bit_size(typeid, string) to get a compile-time bit_field field size in bits (the value after |)
  • Fix #6407: Global unions do not get initialized correctly
  • Fix >= comparison base:runtime dependencies for string and cstring types
  • Fix GB_PANIC format string in lb_emit_conv invalid subtype cast
  • Fix [^]u16 to cstring16 transmute condition in lb_emit_conv
  • Remove Tilde backend
  • Fix #6484: Two when blocks which evaluate to true in a foreign block 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/argon2id initial import
  • vendor:windows/wasapi
  • vendor: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_at documentation
  • core:fmt now formats time.Duration with a space between duration and unit when using % v
  • Correct SIMD shr example documention
  • Fix sync.Auto_Reset_Event signal deadlock
  • core:sys/darwin/Foundation: fix NSTimer binding
  • Partial 1.619.x d3d12 bindings
  • core:mem/virtual: Fix for virtual arena overcommit bug #5821
  • core:crypto: Add ARM AES hardware acceleration
  • core:crypto: Add ARM SHA256 hardware acceleration
  • core:fmt: Improve core:container/small_array formatting
  • vendor:stb/vorbis: Add WASM support
  • core:encoding/cbor: Fix order-dependent partial unmarshals
  • core: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_path ignores flags
  • Fix for corner case in the core:mem scratch allocator.
  • Minor cleanup in base:runtime and core:mem
  • Fix #6495: Handle starting separator during name comparison in core:os
  • Improved delete_key documentation 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/aes ECB encrypt/decrypt

Full Change Log

Full Changelog: dev-2026-03...dev-2026-04

dev-2026-03

04 Mar 12:58

Choose a tag to compare

BREAKING Changes

  • core:os has been replaced with our newly improved and rewritten v2, previously available at core:os/os2. The old core:os implementation will remain available at core:os/old until sometime in Q3 of 2026.

  • core:sys/info previously retrieved all information before main was 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 asm expression
  • Do not allow duplicated #partial directives on switch statements
  • Add broadcasting to strings (Fix #1837)
  • Improve LLVM version picking
  • Fix name canonicalization for typed ranges in bit_set
  • Fix bit_set parapoly specialization
  • Fix separating of diverging procedure types from block statements
  • Update Type_Info_Bit_Set to always record underlying type. Add runtime.type_info_underlying
  • Fix #6347
  • Fix #6270

New Packages

  • core:crypto/ecdsa: Add ECDSA support

Package Improvements

  • [BREAKING] core:os/os2 -> core:os integration
  • [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 XChangeWindowAttributes
  • vendor:directx/d3d12: Added IGraphicsCommandList7 and fix access violation errors
  • Minimize some internal depencies in the core packages, e.g. don't import core:mem just for mem.Allocator_Error
  • vendor:box2d: Fix and try Git LFS
  • core:log: Add support for js/wasm
  • core:container/xar: Fixes and improvements
  • core:container/pool: Fix parapoly type inference around address sanitization when using multiple Pool types
  • core:container/handle_map: Improvement
  • demo.odin Fix cross_3d typo
  • core:encoding/hex: Add uppercase encoding
  • core:bytes: Update comment on compare; add additional caller location propagation
  • core:math/big: Clean up
  • core:os: Fix silent failure in os.replace_path_separators if the separator was multi-byte
  • Add additional tests
  • core:sys/es: Fix build errors
  • core: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:os update and using-stmt feature
  • Fix typo in atomic.odin documentation
  • core:os: Remove process_close and add process_terminate
  • core:time: Correct 12-hour clock string
  • Update Unicode specification
  • vendor:curl: Fix what argument for url_set
  • Small optimization for dynamic arrays
  • vendor:miniaudio: Upgrade to 0.11.24
  • core:container/priority_queue: Add example and tests
  • core:text/regex: Fix \b handling in iterator
  • vendor:sdl3: Update to 3.4.2
  • Add bindings to allow custom hardware cursors
  • core:nbio: Fix op reuse
  • core:strings: Fix substring not returning end of range
  • core:sys/windows: Add more win32 API bindings
  • core:sys/windows: Fix incorrect PVOID/VOID use in some signatures
  • core:sys/windows: Tighten up MultiByteToWideChar usage in utf8_to_wstring_buf
  • vendor:stb/vorbis: Remove unnecessary core:c/libc import
  • vendor:wasm/WebGL: Add bindings, fix Tex*Image*D
  • core:os: Return .Permission_Denied for .EACCES in Posix and Linux
  • core: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

04 Feb 13:23

Choose a tag to compare

New Language Features

  • #+feature using-stmt
    • using as a statement and procedure parameter modifier is now an opt-in feature on a per-file basis rather than on by default
    • using on 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 memcmp directly (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, and NaN, 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:thin and -lto:thin-files
  • #must_tail directive and preserve/none/preserve/most/preserve/all calling conventions
    • Enables the ability to state how optimize for tail calls
  • -disable-unwind
  • Improvements to the constant conversion checks
  • intrinsics.count_leading_ones and intrinsics.count_trailing_ones
  • Show -target flag usage example in help
  • Numerous debug info fixes
  • Static linking on non-Windows platforms
  • Add warning for size_of(&x) as it will always be size_of(rawptr) and probably a typo
  • -target:freestanding_amd64_mingw
    • Allowing for linking to MinGW on Windows but for freestanding purposes (not general)
  • Fix string16 issues on Mac and Linux
  • Fix in/not_in on constant bit_sets
  • Allow #+vet tags always work in addition to command line flag
  • General fixes to -vet
  • Type assertions now use the same context.assertion_failure_proc as assert and panic where possible
  • #+feature force-type-assert which overrides -no-type-assert on 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/xar for stable backing data

Package Improvements

  • core:thread
    • Add init and fini callback procedures to thread pools
  • 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_grayscale for TGA
  • core:os/core:os/os2
    • Fix lookup_env_buf
    • Fix truncate-clamp op order when determining to_read size
  • 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_location to allocating procedures that would benefit for it
  • 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
  • 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
  • vendor:sdl3/image
    • Update to 3.4.0
  • Move vendor:libc to vendor: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

05 Jan 15:48

Choose a tag to compare

New Language Features

New Compiler Improvements

  • Undetected type declaration cycles work-around
  • Fix misleading error messages for init, fini and test attributes
  • Fix automatic objc_msgSend on static methods via selector expression not resolving aliased types
  • Fix #packed #all_or_none
  • Fix auto objc_msgSend incorrectly treating certain class methods as instance methods.
  • Fix handling of #force_inline
  • Fix literal endianness

New Packages

Package Improvements

  • Fix duplicate jpeg.load on JS
  • Added more NSApplication and NSWindow bindings
  • Update kb_text_shape to 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 Box2d to 3.1.1
  • Fix core:debug/trace example
  • Make linux.IO_Vec.base a multipointer
  • Ensure libc is linked on Windows for vendor:compress/lz4
  • Change Return Type of sdl2.GetWindowFlags from u32 to Existing WindowFlags bit_set
  • Fix minor issues within curl bindings
  • core:time/timezone added additional search paths to match musl
  • More bindings for Darwin
  • Add @builtin to 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_i64 using an OOB index when min(i64) is given.
  • os/os2: use ReadFile for Console reads too, at least for now
  • core:sys/linux Add timerfd syscall wrappers
  • Fix nfds_t alias for Linux
  • core:io/utils: fix buffer size in write_* procs
  • core:net docs: recv of 0 bytes with no error is a graceful close
  • core:math/rand small 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_ip6 offset
  • [vendor/sdl3] update to sdl 3.4.0

Other

Full Changelog: dev-2025-12a...dev-2026-01

dev-2025-12a

04 Dec 14:30

Choose a tag to compare

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

02 Dec 11:15
b277d66

Choose a tag to compare

Breaking changes

  • BREAKING: Use chacha8rand as 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_none for 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-procedures and -vet-packages flags 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 FreeLibraryAndExitThread in kernel32. Add EnumProcessModules in psapi
  • Fix typo in NS.String_initWithCString
  • Remove the Darwin-specific paths from thread_unix
  • Fix thread_act_t size
  • Fix: make choice_bit_set respect bit_set domain
  • math/rand: Add range-based number generation procedures
  • Fix is_pointer_internally not handling Named Types
  • Faster big.itoa
  • Add Xoshiro256 RNG
  • Add LockFileEx/UnlockFileEx and related flags
  • Fix vendor:stb/image resize alpha_channel parameter type to c.int
  • Move some OS General_Error values to io.Error
  • Fix out of bounds access when parsing end_pos
  • Add WSASendTo and WSARecvFrom
  • Update d3d12 bindings for D3D12_FEATURE_D3D12_TIGHT_ALIGNMENT
  • Add NSWindow coordinate space conversion bindings
  • Don't build log allocator file on freestanding targets
  • Adjust docs links for satellite SDL libraries
  • Increase base64 decoding table size to 256, preventing out of bounds reads
  • vendor/xlib: a few more IM-related procedures and constants
  • add math.sign and math.sign_bit overloads for int types
  • Implement more Linux syscalls
  • Add SIO_UDP_CONNRESET winsock constant
  • os2.File_Stream

Other

  • Fix up macOS CI

Full Changelog: dev-2025-11...dev-2025-12

dev-2025-11

04 Nov 14:28
e5153a9

Choose a tag to compare

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_super and automatically emit objc_msgSend calls where necessary for @(objc_superclass) attribute
    • Fix block symbols naming conflict across modules
  • LLVM backend fixes
    • #simd vector only uses bit cast when elements are not pointers
    • Fix bitcasting context pointer to prevent compilation errors on LLVM-14
    • Numerous constant union improvements
    • Prefer the Type * ver LLVMTypeRef when looking up struct_field_remapping due to lack of uniqueness
  • Default parameter exclusion counting improvement for procedure groups
  • Improved -target-features flag 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: #load alignment bug
    • set minimum alignment to 16-bytes
  • Fix orca linking path
  • Add #subtype/using to 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_soa and append_nothing_soa
  • vendor:wgpu update to 27.0.2.0
  • core:unicode/utf8: Add Grapheme_Iterator
  • New slice.sort implementation 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/json fixes
    • Fix null parsing in certain cases
  • core:encoding/cbor: Fix epoch tag with small values
  • core:container/rbtree add find_or_insert
  • Fix bindings generator for vendor:vulkan for extensions and ~0 style constants
  • Disable bounds checking where appropriate for Unicode and UTF-8 procedures
  • vendor:fontstash: Fix crash with .TTC files
  • core:simd : Fix incorrectly named calls in bit_not
  • vendor:sdl3: Add PointInRectFloat
  • vendor/egl
    • add a few more procedures and constants
    • Fix GetPlatformDisplay and CreatePlatformWindowSurface to use int instead of i32
  • vendor:box2d
    • fixes to bindings mismatches
    • Add targetAngle to RevoluteJoint struct/procs
  • core:odin/parser
    • fixes for end_pos
    • parse empty identifiers after selector as a selector expression with an empty field
  • core:hash: add CCITT CRC-16
  • Make packed conditional on EPoll_Event to match kernel
  • core:math/linalg/hlsl: support half types
  • core:math/ease: Add inverse ease procedures
  • vendor:raylib: add MAX_MATERIAL_MAPS constant
  • core:sys/darwin/Foundation: add additional AppKit bindings
  • core:text/scanner allow for octal prefix style parsing for C-style ints

Full Changelog: dev-2025-10...dev-2025-11

dev-2025-10

05 Oct 11:22
3ad7240

Choose a tag to compare

New Language Features

New Compiler Improvements

  • Improve type inferencing of literals when calling proc groups
  • Windows i386 support
  • Fix Darwin addObserver methods and add support for new Objc_Block
  • Fix segfault involving string_to_string16 on 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_enough on struct params and fix various foreign signatures
  • Preempt field checking on signature_parameter_similar_enough with a type ptr equality check
  • Remove stray debug printf

New Packages

  • [core/image]: Add baseline JPEG support

Package Improvements

  • Use .Image_Dimensions_Too_Large in core:image
  • tick_now: Use f64 (was f32) as a return type of odin_env.tick_now()
  • Allow missing trailing comma with proc groups in core:odin parser
  • Fix incorrect json encoding for control characters < 32
  • Initializing big.Int constants is now "contextless"
  • Add CancelIoEx and other overlapped I/O functions.
  • Add missing caller location param to append in strings.Builder
  • Add "contextless" to small_array get_safe and get_ptr_safe
  • Zero small_array resize
  • Unify filepath.join return between Unix/Windows
  • Fix out-of-band allocations in dynamic arenas by
  • Fix for temp_file name prefix being deallocated before being used
  • Add runtime.conditional_mem_zero to improve heap_allocator performance on non-Windows systems
  • Add digit_to_int to core:strconv
  • Remove inaccurate tprint comment

Full Changelog: dev-2025-09...dev-2025-10

dev-2025-09

08 Sep 12:15
42c2cb8

Choose a tag to compare

New Language Features

  • Native support for UTF-16 strings: string16 and cstring16
    • Mostly for interfacing with Windows code, and other foreign code
  • Define Integer Division By Zero #5556

New Compiler Improvements

  • @(init) and @(fini) must be proc "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:runtime docs
  • Fixes to vendor:wasm/WebGL bindings
  • Cleanup in math/rand and runtime/random_generator
  • Add missing xlib functions for getting and setting text properties
  • vendor:OpenGL fix 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_zero giving false positves
  • Split SDL_ttf bindings to group with and without require_results
  • Propogate #caller_location to core:container/queue procs
  • Support using allocator resize in _reserve_soa
  • Zero existing memory when using resize_soa
  • Add add/remove_document_event_listener() to core:sys/wasm/js
  • Fixed and added obj-c methods for NSWindow
  • fix typo in CLSIDFromProgIDEx signature
  • Fix broken wglUseFontBitmaps binding
  • Add LPFN_GETACCEPTEXSOCKADDRS to ws2_32.odin
  • Specify %m and %M as verbs for integer formatting in core:fmt
  • Add @(require_results) attribute to procs returning an allocator
  • Handle allocator error when appending in read_entire_file_from_file
  • vendor:box2d fix CreateMotorJoint procedure signature
  • Add build tags to posix/spawn.odin

Full Changelog: dev-2025-08...dev-2025-09

dev-2025-08

05 Aug 13:02

Choose a tag to compare

New Language Features

New Compiler Improvements

  • General compiler bug fixes
  • intrinsics.type_enum_is_contiguous
  • intrinsics.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? for card/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/spall to version 3
    • Adds @(no_instrumentation) to spall buffer and SCOPED operations
  • core:hash/xxhash: Static SIMD Support for XXH3
  • Minor fixes to core:mem/virtual edge cases
  • Unix build script for kb_text_shape
  • Add IUnknown UUID 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_image save 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