{
    "archive_path": "archive/1790978741.216204",
    "base_url": "ziglang.org/download/0.17.0/release-notes.html",
    "basename": "release-notes.html",
    "bookmarked_date": "2026-10-02 22:05",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/ziglang.org/download/0.17.0/release-notes.html",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=ziglang.org",
        "headers_path": "headers.json",
        "htmltotext_path": "htmltotext.txt",
        "index_path": "index.html",
        "media_path": "media/",
        "mercury_path": "mercury/content.html",
        "pdf_path": "output.pdf",
        "readability_path": "readability/content.html",
        "screenshot_path": "screenshot.png",
        "singlefile_path": "singlefile.html",
        "warc_path": "warc/",
        "wget_path": "ziglang.org/download/0.17.0/release-notes.html"
    },
    "domain": "ziglang.org",
    "extension": "html",
    "hash": "1M54V3X594SE6160GXHT",
    "history": {
        "archive_org": [],
        "dom": [],
        "favicon": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=ziglang.org"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-02T22:05:42.547121+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-02T22:05:41.764050+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=ziglang.org"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-03T01:41:53.039131+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-03T01:41:52.480503+00:00",
                "status": "succeeded"
            }
        ],
        "git": [],
        "headers": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-02T22:05:43.412263+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-02T22:05:42.562921+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-03T01:41:53.894159+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-03T01:41:53.049819+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [],
        "media": [],
        "mercury": [
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-02T22:05:57.463707+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-02T22:05:50.352396+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-03T01:42:07.427384+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-03T01:42:00.839284+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmptliiql_5",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-02T22:05:50.337935+00:00",
                "index_texts": [
                    "0.17.0 Release Notes\n    \n    Download & Documentation\n    \n    \n    Zig is a general-purpose programming language and toolchain for maintaining\n    robust, optimal, and reusable software.\n    \n    Zig development is funded via Zig Software Foundation,\n    a 501(c)(3) non-profit organization. Please consider a recurring donation\n    so that we can offer more billable hours to our core team members. This is\n    the most straightforward way to accelerate the project along the\n    Roadmap to 1.0. If you need donation receipts or are\n    looking to migrate away from GitHub Sponsors, we recommend\n    donating via Every.org.\n    \n\n    This release features 5 months of work: changes from 206 different\n    contributors, spread among 925 commits.\n\n    Originally predicted to be shorter, this release cycle ended up substantial, with\n    the Build System reworked, including the introduction of the\n    Build Server Protocol, and the ELF Linker enhanced to the point where we\n    expect Incremental Compilation to work for everyone on x86_64-linux.\n    \n\n    Table of Contents \u00a7\n\n    \n\n    \n        Table of Contents\n        Target Support\n        \n            Tier System\n            \n                Tier 1\n                Tier 2\n                Tier 3\n                Tier 4\n            \n            Support Table\n            OS Version Requirements\n            Additional Platforms\n        \n        Language Changes\n        \n            Language Stability Progress\n            @bitCast changes\n            Formally Specified and Fuzzed Grammar\n            C Translation Moving to External Package\n            Added @backingInt and @fromBackingInt\n            Added @SpirvType\n            Array Multiplication Syntax Removed\n            Added @divCeil\n            @hasDecl Returns true Only for Public Declarations\n            Allow Dereference and Coercion to Array Pointer of comptime Length Slices\n            void{} Syntax Removed\n            errdefer Capture Removed\n            i0 Removed\n            internal and link_once Global Linkage Removed\n        \n        Standard Library\n        \n            Deprecations\n            StackFallbackAllocator Reworked\n            SafeAllocator Introduced\n            ArrayList\n            \n                ArrayList Pointer Stability\n            \n            debug.SafetyLock Gains Support for Shared Locking\n            fmt.allocPrint moved to mem.Allocator\n            Formatted Printing Enhancements\n            std.zon.parse Reworked\n            Rename bit_set Variants and Deprecate the Managed One\n            Struct-Of-Arrays Style for std.lang.Type\n            Rename lang.OptimizeMode to lang.Optimize\n            lang.Optimize.runtimeSafety\n            @import(\"builtin\") Deprecations\n            Handle Floats Correctly in mem.eql and mem.findDiff\n            Decouple Uri and net.HostName\n        \n        Build System\n        \n            Separate the Maker Process from the Configurer Process\n            Cache System Reworked\n            Introduce the Concept of Configure Cache Poisoning\n            findProgram\n            findProgramLazy\n            Run Step: Passthru Args\n            Fmt Step: Options\n            Step.Options: add addOptionPathDirectory\n            Lazy Dependency Ergonomic Enhancements\n            Removed Ability to Override Build Runner\n            Package Management\n            \n                Ability to Override Package Path\n                Global vs Local Fetching\n            \n            Slight Difference in PATH for DLL Arguments\n            Build Server Protocol\n        \n        Compiler\n        \n            Incremental Compilation\n            SPIR-V Backend\n            aarch64 Backend\n            loongarch Backend\n            WebAssembly Backend\n        \n        Linker\n        \n            ELF\n            COFF\n            New Linker Testing Framework\n            SPIR-V\n        \n        Fuzzer\n        Bug Fixes\n        \n            This Release Contains Bugs\n            \n                Notable Regressions\n            \n        \n        Toolchain\n        \n            LLVM 22\n            \n                Loop Vectorization Disabled to Work Around Regression\n            \n            musl 1.2.5\n            glibc 2.44\n            Linux 7.2 Headers\n            macOS 27.0 Headers\n            MinGW-w64\n            NetBSD 11.0 libc\n            OpenBSD 7.9 libc\n            WASI libc\n            zig libc\n            zig cc\n            zig objdump\n            resinator\n            \n                Windows Resource Compilation Moving to an External Package\n            \n            zig fmt\n            \n                Added --complexity Flag\n            \n        \n        Roadmap\n        Thank You Contributors!\n        Thank You Sponsors!\n    \n\n    \n\n    Target Support \u00a7\n\n    \n      Zig supports a wide range of architectures and operating systems. The\n      Support Table and Additional Platforms sections cover\n      the targets that Zig can build programs for, while the\n      zig-bootstrap README\n      covers the targets that the Zig Compiler itself can be easily\n      cross-compiled to run on.\n    \n    Notable changes:\n    \n      aarch64-openbsd is now tested natively in Zig's CI, ensuring high-quality\n      support going forward.\n      aarch64-freebsd and aarch64-netbsd CI jobs now run on pull\n      requests too, in addition to master pushes.\n      An LLVM bug that broke\n      most aarch64-windows binaries, including the Zig Compiler, has been\n      worked around.\n      The Zig Compiler now applies mandatory code hardening techniques when targeting\n      aarch64-openbsd so that the resulting binaries actually work.\n      Zig now provides stack traces on crashes and failed assertions on 32-bit ARM. Some work\n      still remains for Thumb-only\n      targets.\n      Zig now provides stack traces on crashes and failed assertions on SPARC.\n      Zig now handles pointer authentication opcodes when doing stack unwinding on AArch64.\n      Support for the loongarch32-linux-gnu[sf] targets has been added.\n      Zig now has generally usable support for 64-bit SPARC, and especially\n      sparc64-linux. This is largely thanks to Zig's new ELF linker which now has better\n      support for this target than LLD.\n      The Zig Standard Library has been ported to the x32 and N32 ABIs on x86-64 and\n      64-bit MIPS, respectively. These are niche ILP32 ABIs that allow using the 64-bit instruction set\n      while only having 32-bit pointers - the idea being to trade available address space for lower\n      memory usage and better cache utilization.\n      Target information has been added for some game consoles: aarch64-switch,\n      arm-gba, mipsel-psx, and powerpc-wiiu\n      Very early xtensa-linux support has been added to Zig. Note that, for now,\n      this support can only be exercised via the C backend or the experimental LLVM\n      backend.\n      The Zig Standard Library now has support for arc[eb]-linux,\n      csky-linux, and m88k-openbsd when using the C backend.\n      The Zig Standard Library now has support for no-libc microblaze[el]-linux,\n      sh[eb]-linux, and sparc-linux.\n      Zig now enforces -mabi=ieeelongdouble for all PowerPC targets. This is just a\n      formalization of what was already reality; Zig has never supported the IBM \"double-double\"\n      format for long double and likely never will. As a result, this release drops\n      support for powerpc-linux-gnueabi[hf] because glibc only supports the \"double-double\"\n      format on these targets. The powerpc-linux-musleabi[hf] targets remain supported as\n      they use the IEEE format.\n      This release drops support for powerpc64-linux-gnu. Zig has only ever\n      supported linking ELFv2 binaries for 64-bit PowerPC, and glibc does not officially support\n      ELFv2 on big endian - nor IEEE long double, as above.\n      Zig's ability to detect the native CPU model and features has been greatly enhanced across\n      the board; this affects almost every architecture on every supported OS.\n      \n        The baseline CPU model has been changed for some targets:\n        \n          aarch64-haiku: cortex_a55\n          m68k-*: M68030\n          mips64-openbsd: octeon\n          powerpc-netbsd: 750\n          powerpc64-freebsd: pwr8\n          powerpc64-linux: pwr8\n          powerpc64-openbsd: pwr9\n          s390x-*: arch11\n          sparc-*: generic\n          sparc-linux: v9\n          sparc64-*: ultrasparc\n          xtensa-*: esp32\n        \n      \n      In Zig's target query syntax, native libc version detection now only happens if the triple\n      actually uses native libc (i.e. the ABI component is omitted). We expect this new behavior to\n      better match people's mental model for how target queries work, particularly when considering\n      how the OS component works.\n    \n\n    Tier System \u00a7\n\n    \n      Zig's level of support for various targets is broadly categorized into\n      four tiers with Tier 1 being the highest. The goal is for Tier 1 targets\n      to have zero disabled tests - this will become a requirement for\n      post-1.0.0 Zig releases.\n    \n\n    Tier 1 \u00a7\n\n    \n      All non-experimental language features are known to work correctly.\n      The Compiler can generate machine code for this target without relying on LLVM.\n      The integrated fuzzer works on this target (if applicable).\n    \n    \n\n    Tier 2 \u00a7\n\n    \n      The Standard Library cross-platform abstractions have implementations for this target.\n      Failed assertions and crashes produce stack traces on this target.\n      libc is available for this target even when cross-compiling (if applicable).\n      Continuous integration machines build the module tests for this target on every push.\n    \n    \n\n    Tier 3 \u00a7\n\n    \n      The Compiler can generate machine code for this target by relying on an external backend such as LLVM.\n      The Linker can produce object files, libraries, and executables for this target.\n    \n    \n\n    Tier 4 \u00a7\n\n    \n      The Compiler can generate assembly or C source code for this target.\n    \n    \n\n    \n\n    Support Table \u00a7\n\n    \n      In the following table, \u2705 indicates full support, \u274c indicates no\n      support, and \u26a0\ufe0f indicates that there is partial support, e.g. only for some\n      sub-targets, or with some notable known issues. \u2754 indicates that the\n      status is largely unknown, typically because the target is rarely\n      exercised. Hover over other icons for details.\n    \n    \n      Targets marked with \ud83e\udea6 are obsolescent; the Zig compiler and standard\n      library maintain best-effort support for them, but that support is\n      expected to be removed eventually.\n    \n\n    \n      \n        \n          Tier \n          Target \n          Code Gen. \n          Linker \n          Lang. Feat. \n          Std. Lib. \n          Stack Traces \n          Fuzzer \n          libc \n          CI \n        \n      \n\n      \n        \n          1 \n          x86_64-linux \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n\n        \n          \n            \n          \n        \n\n        \n          2 \n          aarch64-freebsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64[_be]-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-maccatalyst \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-macos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64[_be]-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-windows \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          arm-freebsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          arm[eb]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          arm[eb]-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          arm-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          hexagon-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          loongarch32-linux \n          \ud83d\udda5\ud83d\udee0 \n          \u2705 \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          loongarch64-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          mips[el]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          mips[el]-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          mips64[el]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          mips64[el]-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc64[le]-freebsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc64[le]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          powerpc64-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv32-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          riscv32-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv64-freebsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv64-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          riscv64-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          s390x-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          sparc64-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          thumb[eb]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          wasm32-wasi \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \ud83e\udea6 \n          x86-windows \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86_64-freebsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \ud83e\udea6 \n          x86_64-maccatalyst \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \ud83e\udea6 \n          x86_64-macos \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          x86_64-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86_64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86_64-windows \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n\n        \n          \n            \n          \n        \n\n        \n          3 \n          aarch64-haiku \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-ios \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-serenity \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-tvos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-visionos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-watchos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          arm-haiku \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          mips64[el]-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n          \u2705 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          riscv64-haiku \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          riscv64-serenity \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \ud83e\udea6 \n          thumb-windows \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          3 \n          wasm64-wasi \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u26a0\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \ud83e\udea6 \n          x86-freebsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c \n        \n        \n          3 \n          x86-haiku \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \ud83e\udea6 \n          x86-illumos \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-dragonfly \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-haiku \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-illumos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-serenity \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n\n        \n          \n            \n          \n        \n\n        \n          4 \n          alpha-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          alpha-netbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          alpha-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          arc[eb]-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          csky-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa-netbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa64-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          m68k-linux \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          m68k-netbsd \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          m88k-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          microblaze[el]-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          or1k-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sh[eb]-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sh[eb]-netbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sh-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc-linux \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc-netbsd \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc64-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u26a0\ufe0f \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u26a0\ufe0f \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          xtensa[eb]-linux \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n      \n    \n    \n\n    OS Version Requirements \u00a7\n\n    \n      The Zig standard library has minimum version requirements for some\n      supported operating systems, which in turn affect the Zig compiler itself:\n    \n\n    \n      \n        \n          OS\n          Version\n        \n      \n\n      \n        \n          Darwin\n          15.0+\n        \n        \n          DragonFly BSD\n          6.4+\n        \n        \n          FreeBSD\n          14.0+\n        \n        \n          Linux\n          5.10+\n        \n        \n          NetBSD\n          10.1+\n        \n        \n          OpenBSD\n          7.8+\n        \n        \n          Windows\n          10+\n        \n      \n    \n    \n\n    Additional Platforms \u00a7\n\n    \n      Zig also has varying levels of support for these targets, for which the\n      tier system does not quite apply:\n    \n\n    \n      aarch64-driverkit\n      aarch64[_be]-freestanding\n      aarch64-fuchsia\n      aarch64-hurd\n      aarch64-switch\n      aarch64-uefi\n      alpha-freestanding\n      amdgcn-amdhsa\n      amdgcn-amdpal\n      amdgcn-mesa3d\n      arc[eb]-freestanding\n      arm[eb]-freestanding\n      arm-3ds\n      arm-fuchsia\n      arm-gba\n      arm-uefi\n      arm-vita\n      avr-freestanding\n      bpf(eb,el)-freestanding\n      csky-freestanding\n      ez80-freestanding\n      ez80-tios\n      hexagon-freestanding\n      hppa[64]-freestanding\n      kalimba-freestanding\n      kvx-freestanding\n      lanai-freestanding\n      loongarch(32,64)-freestanding\n      loongarch(32,64)-uefi\n      m68k-freestanding\n      m88k-freestanding\n      microblaze[el]-freestanding\n      mips[64][el]-freestanding\n      mipsel-psx\n      mipsel-psp\n      msp430-freestanding\n      nvptx[64]-cuda\n      nvptx[64]-nvcl\n      or1k-freestanding\n      powerpc-wiiu\n      powerpc[64][le]-freestanding\n      powerpc64-ps3\n      propeller-freestanding\n      riscv(32,64)[be]-freestanding\n      riscv(32,64)-uefi\n      riscv64-fuchsia\n      riscv64-hurd\n      s390x-freestanding\n      sh[eb]-freestanding\n      sparc[64]-freestanding\n      spirv(32,64)-opencl\n      spirv(32,64)-opengl\n      spirv(32,64)-vulkan\n      spork8-freestanding\n      thumb[eb]-freestanding\n      thumb-fuchsia\n      thumb-gba\n      thumb-vita\n      ve-freestanding\n      wasm(32,64)-emscripten\n      wasm(32,64)-freestanding\n      x86[_16,_64]-freestanding\n      x86[_64]-hurd\n      x86[_64]-uefi\n      x86_64-driverkit\n      x86_64-fuchsia\n      x86_64-plan9\n      x86_64-ps4\n      x86_64-ps5\n      xcore-freestanding\n      xtensa[eb]-freestanding\n    \n    \n    \n\n    Language Changes \u00a7\n\n\n    Language Stability Progress \u00a7\n\n    Since the release of Zig 0.16.0, a lot of progress has been made towards stabilizing the\n    language. This is a key step in our roadmap, and a requirement before tagging\n    Zig 1.0.\n    In particular, since the last release, we have discussed and made decisions on many language\n    proposals\u2014accepting around 25 and rejecting around 125. At the time of writing, 23 undecided\n    language proposals remain open on the Codeberg issue tracker, and 61 undecided language\n    proposals remain open on the legacy GitHub issue tracker. Therefore, this effort represents a\n    significant step towards finalizing the language design (although\n    some\n    major\n    decisions\n    remain).\n    \n\n    @bitCast changes \u00a7\n\n    Zig 0.17.0 changes the definition of the @bitCast builtin.\n    In many cases, the new behavior is equivalent to the old: in particular, casting between an integer type and another integer type is unaffected, as is casting between an integer type and a packed struct or packed union.\n    However, the semantics of @bitCast calls involving array or vector types have changed. Unfortunately, this change has the potential to break existing code without triggering a compile error.. Therefore, it may be useful when upgrading to audit any @bitCast uses which involve array or vector types.\n    The new definition of @bitCast is that it reinterprets the logical bit representation of a value as a different type. The following types are considered to have logical bit representations:\n    \n      void\n      bool\n      integer types, except for comptime_int\n      floating-point types, except for comptime_float\n      integer-backed types enum(T), packed struct(T), and packed union(T)\n      arrays or vectors of any of these types\n    \n    For integer and floating-point types, the logical bit representation starts with the least-significant bit and ends with the most-significant bit. For array and vector types, all elements' logical bit representations are concatenated in order starting with the first element.\n    In practice, this means that the new @bitCast definition largely aligns with the old behavior on little-endian targets. Unlike the old behavior, the new behavior is fully endian-agnostic, i.e. the operation behaves the same regardless of the target endian.\n    The new @bitCast definition disallows casts between some types which were previously allowed. In particular, casts involving extern struct or extern union types are no longer permitted. In most cases, code which was using such casts is aiming to reinterpret the value's in-memory representation (sometimes called \"type punning\")\u2014to achieve this, use @ptrCast or an extern union.\n    bitcast_extern_struct.zigconst TwoBytes = extern struct {\n    b0: u8,\n    b1: u8,\n};\ntest \"type pun extern struct\" {\n    const bytes: TwoBytes = .{ .b0 = 0x12, .b1 = 0xAB };\n    const int: u16 = @bitCast(bytes);\n    switch (std.lang.Endian.native) {\n        .little => try expectEqual(0xAB_12, int),\n        .big => try expectEqual(0x12_AB, int),\n    }\n}\nconst std = @import(\"std\");\nconst expectEqual = std.testing.expectEqual;Shell$ zig test bitcast_extern_struct.zig\n/home/ci/.cache/act/4d2db5a0202099f4/hostexecutor/src/download/0.17.0/release-notes/bitcast_extern_struct.zig:7:31: error: cannot @bitCast from 'bitcast_extern_struct.TwoBytes'\n    const int: u16 = @bitCast(bytes);\n                              ^~~~~\n/home/ci/.cache/act/4d2db5a0202099f4/hostexecutor/src/download/0.17.0/release-notes/bitcast_extern_struct.zig:1:25: note: struct declared here\nconst TwoBytes = extern struct {\n                 ~~~~~~~^~~~~~\n\n\n    \u2b07\ufe0f\n    ptrcast_extern_struct.zigconst TwoBytes = extern struct {\n    b0: u8,\n    b1: u8,\n};\ntest \"type pun extern struct\" {\n    const bytes: TwoBytes = .{ .b0 = 0x12, .b1 = 0xAB };\n    const int_ptr: *align(1) const u16 = @ptrCast(&bytes);\n    switch (std.lang.Endian.native) {\n        .little => try expectEqual(0xAB_12, int_ptr.*),\n        .big => try expectEqual(0x12_AB, int_ptr.*),\n    }\n}\nconst std = @import(\"std\");\nconst expectEqual = std.testing.expectEqual;Shell$ zig test ptrcast_extern_struct.zig\n1/1 ptrcast_extern_struct.test.type pun extern struct...OK\nAll 1 tests passed.\n\n    \n\n    Formally Specified and Fuzzed Grammar \u00a7\n\n    Zig's formal grammar.peg and the actual language implementation did not agree in many places. Probably,\n    the formal grammar has never actually 100% matched the actual handwritten tokenizer and parser.\n\n    This problem is now fixed and unblocks future grammar changes and language specification work.\n\n    At a high level, the approach was to write a tool that accepts Zig's grammar.peg as input and outputs a\n    simple recursive descent parser. This generated parser is then used as an oracle for fuzz testing and the\n    handwritten std.zig.Ast.parse() is compared against it. This approach ensures a\n    single source of truth and allows for easy iteration as the grammar changes.\n\n    More details: #36094\n    \n\n    C Translation Moving to External Package \u00a7\n\n    @cImport\n    was deprecated in Zig 0.16.0 and is now removed. Furthermore, in this release\n    std.Build.Step.TranslateC is deprecated in favor of an explicit package dependency on\n    official ZSF translate-c package, which is the same\n    implementation the build step provides, but offers\n    more configuration options for the\n    translated code, and has an independent release cadence from the main Zig toolchain.\n\n    Upgrade guide:\n\n    zig fetch --save git+https://codeberg.org/ziglang/translate-c\n\n    --- a/build.zig\n+++ b/build.zig\n@@ -1,16 +1,19 @@\n const std = @import(\"std\");\n+const Translator = @import(\"translate_c\").Translator;\n \n pub fn build(b: *std.Build) void {\n     const target = b.standardTargetOptions(.{});\n     const optimize = b.standardOptimizeOption(.{});\n \n-    const translate_c = b.addTranslateC(.{\n-        .root_source_file = b.path(\"src/c.h\"),\n+    const translate_c = b.dependency(\"translate_c\", .{});\n+\n+    const translator: Translator = .init(translate_c, .{\n+        .c_source_file = b.path(\"src/c.h\"),\n         .target = target,\n         .optimize = optimize,\n+ // additional options now available that go here:\n+ // https://codeberg.org/ziglang/translate-c#options\n     });\n-    translate_c.linkSystemLibrary(\"glfw\", .{});\n-    translate_c.linkSystemLibrary(\"epoxy\", .{});\n+    translator.linkSystemLibrary(\"glfw3\", .{});\n+    translator.linkSystemLibrary(\"epoxy\", .{});\n \n     const exe = b.addExecutable(.{\n         .name = \"tetris\",\n@@ -21,7 +24,7 @@ pub fn build(b: *std.Build) void {\n             .imports = &.{\n                 .{\n                     .name = \"c\",\n-                    .module = translate_c.createModule(),\n+                    .module = translator.mod,\n                 },\n             },\n         }),\n\n\n    \n\n    Added @backingInt and @fromBackingInt \u00a7\n\n    The @backingInt and @fromBackingInt builtins are new.\n    These builtins replace the now-deprecated @intFromEnum and\n    @enumFromInt builtins (#35966).\n\n    @backingInt works with all enums and with bitpacks with explicit backing\n    integer types only. It also works with tagged unions, returning the backing\n    integer of the active tag value.\n    An undefined enum or bitpack yields an undefined backing integer.\n    \n\n    @fromBackingInt infers its result type, which may be any enum or a bitpack with an\n    explicit backing integer type. It takes a parameter of exactly that backing integer type. For enums,\n    passing a backing integer that is either undefined or would yield an invalid tag\n    value results in safety-checked Illegal Behavior. For bitpacks, passing an undefined\n    backing integer yields an undefined bitpack.\n\n    @bitCast now also performs a safety check for invalid tag values if its\n    destination type is an enum.\n\n    Also adds a std.meta.BackingInt function to get the result\n    type of @backingInt.\n\n    Zig now requires empty enums to have noreturn as their backing integer because\n    they are uninstantiable.\n\n    Upgrade example:\n\n    --- a/lib/std/Build.zig\n+++ b/lib/std/Build.zig\n@@ -145,7 +145,7 @@ pub const Graph = struct {\n \n     pub fn addGeneratedFile(graph: *Graph, owner: *Step) Configuration.GeneratedFileIndex {\n         graph.generated_files.append(graph.arena, owner) catch @panic(\"OOM\");\n-        return @enumFromInt(graph.generated_files.items.len - 1);\n+        return @fromBackingInt(@intCast(graph.generated_files.items.len - 1));\n     }\n \n     pub fn dupeString(graph: *const Graph, bytes: []const u8) []const u8 {\n@@ -2607,7 +2607,7 @@ pub const LazyPath = union(enum) {\n             .src_path, .cwd_relative, .relative, .dependency => {},\n             .generated => |gen| {\n                 const graph = other_step.owner.graph;\n-                const generated_owner_step = graph.generated_files.items[@intFromEnum(gen.index)];\n+                const generated_owner_step = graph.generated_files.items[@backingInt(gen.index)];\n                 other_step.dependOn(generated_owner_step);\n             },\n         }\n\n\n    zig fmt automatically performs this upgrade.\n    \n\n    Added @SpirvType \u00a7\n\n    SPIR-V has a number of types, such as images and samplers, that have no equivalent in Zig's type\n    system. Previously, the only way to refer to one of them was through inline assembly, which made it\n    impossible to declare a texture or a storage buffer as an ordinary global variable. Zig 0.17.0\n    implements accepted proposal #35240,\n    adding the @SpirvType builtin alongside the other type-creating builtins:\n    sample_code@SpirvType(comptime options: std.lang.Type.Spirv) type\n    \n      .sampler creates an OpTypeSampler.\n      .image creates an OpTypeImage.\n      .sampled_image creates an OpTypeSampledImage from an image\n      type whose usage is .sampled.\n      .runtime_array creates an OpTypeRuntimeArray.\n      It supports indexing and exposes a len field just like the array type.\n    \n    Using this builtin when not targeting SPIR-V is a compile error. The options are also validated\n    against the target OS.\n    spirv_type.zigconst std = @import(\"std\");\n\nconst Image = @SpirvType(.{ .image = .{\n    .usage = .{ .sampled = f32 },\n    .format = .unknown,\n    .dim = .@\"2d\",\n    .depth = .not_depth,\n    .arrayed = false,\n    .multisampled = false,\n    .access = .unknown,\n} });\nconst SampledImage = @SpirvType(.{ .sampled_image = Image });\n\nconst texture = @extern(*addrspace(.constant) const SampledImage, .{\n    .name = \"texture\",\n    .decoration = .{ .descriptor = .{ .set = 0, .binding = 0 } },\n});\nconst uv_in = @extern(*addrspace(.input) const @Vector(2, f32), .{\n    .name = \"uv\",\n    .decoration = .{ .location = 0 },\n});\nconst color_out = @extern(*addrspace(.output) @Vector(4, f32), .{\n    .name = \"color\",\n    .decoration = .{ .location = 0 },\n});\n\nexport fn main() callconv(.{ .spirv_fragment = .{} }) void {\n    color_out.* = std.spirv.imageSampleImplicitLod(texture, uv_in.*);\n}Shell$ zig build-obj spirv_type.zig -target spirv32-vulkan\n\n    \n\n    Array Multiplication Syntax Removed \u00a7\n\n    Array multiplication syntax (a ** b) has been removed in favor of\n    @splat.\n    Migration:\n    --- a/player/chromaprint.zig\n+++ b/player/chromaprint.zig\n@@ -35,7 +35,7 @@ pub const Chroma = struct {\n     const max_index = @min(window_size / 2, freqToIndex(max_freq));\n     const notes: [window_size]u8 = n: {\n         @setEvalBranchQuota(window_size);\n-        var result = [1]u8{0} ** window_size;\n+        var result: [window_size]u8 = @splat(0);\n         for (min_index..max_index) |i| {\n             const freq = indexToFreq(i);\n             const octave = freqToOctave(freq);\n@@ -123,7 +123,7 @@ const RollingIntegralImage = struct {\n     num_rows: u32,\n \n     pub const init: RollingIntegralImage = .{\n-        .data = [1]Float{0} ** data_size,\n+        .data = @splat(0),\n         .num_rows = 0,\n     };\n\n    \n\n    Added @divCeil \u00a7\n\n    The new @divCeil builtin performs integer division rounded toward positive\n    infinity, complementing the existing @divTrunc, @divFloor,\n    and @divExact builtins.\n\n    sample_code@divCeil(5, 3) == 2\n@divCeil(-5, 3) == -1\n\n    As with the other division builtins, caller guarantees that denominator != 0 and\n    that result does not overflow.\n\n    No more std.math.divCeil(a, b) catch unreachable!\n    \n\n    @hasDecl Returns true Only for Public Declarations \u00a7\n\n    Previously, @hasDecl returned true for public declarations\n    and declarations in the same file. Now, the behavior is the same independently of which file\n    @hasDecl is in.\n    hasdecl.zigconst std = @import(\"std\");\n\nconst Foo = struct {\n    bar: i32,\n\n    const baz = 1;\n    pub var quux = \"xxx\";\n};\n\ntest \"@hasDecl example\" {\n    try std.testing.expect(!@hasDecl(Foo, \"bar\"));\n    try std.testing.expect(!@hasDecl(Foo, \"baz\")); // different in 0.17.0\n    try std.testing.expect(@hasDecl(Foo, \"quux\"));\n}Shell$ zig test hasdecl.zig\n1/1 hasdecl.test.@hasDecl example...OK\nAll 1 tests passed.\n\n    \n\n    Allow Dereference and Coercion to Array Pointer of comptime Length Slices \u00a7\n\n    Now allowed:\n    sample_codeconst slice: []const u16 = &.{ 1, 2, 3 };\nconst array: [3]u16 = slice.*;\nconst array_ptr: *const [3]u16 = slice;\n    \n\n    void{} Syntax Removed \u00a7\n\n    void{} is no longer valid syntax. Use {} instead (#15213).\n    \n\n    errdefer Capture Removed \u00a7\n\n    sample_codeerrdefer |err| {\n    // `err` was the error being returned; you could do stuff with it!\n    // Like a normal `defer/`errdefer`, you can't `return` or `try` in this block, so you can't change\n    // which error is returned; but you can e.g. log it\n}\n    The capture (|err|) is no longer allowed (#23734).\n    To migrate, split the function into two:\n    fn processOneTarget(job: Job) void {\n-    errdefer |err| std.debug.panic(\"panic: {s}\", .{@errorName(err)});\n+    processOneTargetInner(job) catch |err| std.debug.panic(\"panic: {s}\", .{@errorName(err)});\n+}\n+fn processOneTargetInner(job: Job) !void {\n     const target = job.target;\n\n    \n\n    i0 Removed \u00a7\n\n    i0 is no longer an allowed primitive integer type.\n    This type was nonsensical, so does not have a direct alternative. However, any uses of it can almost certainly be transparently replaced with u0.\n    \n\n    internal and link_once Global Linkage Removed \u00a7\n\n    The internal and link_once tags of\n    std.lang.GlobalLinkage have been removed as they had unclear semantics and\n    incomplete support in codegen and linking (#36956). Any use of link_once is likely served by\n    weak, while the replacement for internal is to simply not\n    @export the symbol in the first place.\n    \n\n    \n\n    Standard Library \u00a7\n\n    \n      Added f128 support for @exp and\n      @exp2 based on \"Table-Driven Implementation of the Exponential Function in IEEE\n      Floating-Point Arithmetic\" by Ping Tak Peter Tang, adapted to work with 128-bit numbers (#31846).\n      Added std.Io.Semaphore.waitTimeout (#31924).\n      Added std.spirv helpers for sampling, querying, and writing images\n      (#36187).\n\n      ArrayHashMap.setKey no longer recomputes the entire index (#32136).\n      std.Target.parseCpuModel now returns optional rather than error.\n      std.debug.Pdb: deduplicate inline source locations (#35438).\n      hash.crc full namespace audit (#35952).\n      std.fs.path add appending variants for relative and\n      resolve (#36784).\n    \n\n    Deprecations \u00a7\n\n    \n      std.heap.memory_pool.AlignedManaged removed in favor of\n      std.heap.memory_pool.Aligned.\n      std.heap.memory_pool.ExtraManaged removed in favor of\n      std.heap.memory_pool.Extra.\n      Deprecated std.builtin in favor of std.lang.\n      Deprecated std.meta.fieldInfo in favor of @typeInfo.\n      Deprecated std.meta.fieldNames in favor of @typeInfo.\n      Deprecated std.meta.fieldTypes in favor of @typeInfo.\n      Deprecated std.DoublyLinkedList.pop in favor of\n      std.DoublyLinkedList.popLast.\n      Renamed std.gpu to std.spirv.\n      Removed std.ascii.indexOfIgnoreCase in favor of std.ascii.findIgnoreCase.\n      Removed std.ascii.indexOfIgnoreCasePos in favor of std.ascii.findIgnoreCasePos.\n      Removed std.ascii.indexOfIgnoreCasePosLinear in favor of std.ascii.findIgnoreCasePosLinear.\n      Removed std.bit_set.Integer.initEmpty in favor of std.bit_set.Integer.empty.\n      Removed std.bit_set.Integer.initFull in favor of std.bit_set.Integer.full.\n      Removed std.bit_set.Array.initEmpty in favor of std.bit_set.Array.empty.\n      Removed std.bit_set.Array.initFull in favor of std.bit_set.Array.full.\n      Removed std.enums.EnumSet.initEmpty in favor of std.enums.EnumSet.empty.\n      Removed std.enums.EnumSet.initFull in favor of std.enums.EnumSet.full.\n      Removed std.mem.containsAtLeastScalar2 in favor of std.mem.containsAtLeastScalar.\n      Removed std.mem.readPackedIntNative in favor of std.mem.readPackedInt.\n      Removed std.mem.readPackedIntForeign in favor of std.mem.readPackedInt.\n      Removed std.mem.writePackedIntNative in favor of std.mem.writePackedInt.\n      Removed std.mem.writePackedIntForeign in favor of std.mem.writePackedInt.\n    \n    \n\n    StackFallbackAllocator Reworked \u00a7\n\n    StackFallbackAllocator is an abstraction that is useful for the \"small\n    vec\" optimization, in which common cases can fit on a pre-allocated stack buffer, but rare cases\n    need dynamic heap allocation. The previous design had a few problems:\n    \n    There was no way to specify the alignment of the buffer.\n    It was generic over the size of the buffer.\n    Calling .allocator().get() mutated the type, unlike all other allocators,\n    requiring a runtime safety check.\n    \n    Now, the buffer is provided as an argument, like most other std APIs that need a buffer.\n    Migration guide:\n    sample_codevar stack align(@max(\n    @alignOf(std.heap.StackFallbackAllocator(0)),\n    @alignOf(Item)),\n) = std.heap.stackFallback(@sizeOf(Item), self.gpa);\nconst allocator = stack.get();\n    \u2b07\ufe0f\n    sample_codevar stack_buf: [1]Item = undefined;\nvar stack: std.heap.StackFallbackAllocator = .init(@ptrCast(&stack_buf), gpa);\nconst allocator = stack.allocator();\n    \n\n    SafeAllocator Introduced \u00a7\n\n    std.heap.DebugAllocator is replaced by a thread-safe allocator with the following\n    guarantees:\n    \n    deinit reports all leaks and frees all backing memory.\n    All allocation mismatches result in either a panic or segmentation fault.\n    Allocations from other SafeAllocator instances cause a panic (if\n    Options.canary differ).\n    Double frees and operation (resize, remap, and free) races panic or segmentation fault.\n    \n    Given the backing allocator does not reuse memory, it does not reuse memory either and\n    most writes after free will segmentation fault or are eventually detected and panic.\n    std.heap.DebugAllocator and std.heap.Check are\n    deprecated.\n\n    Every allocation is trailed by an AllocFooter which contains metadata for the\n    allocation and stack traces. It is protected by a checksum to catch corruption from allocation overwrites\n    and report canary mismatches. An allocation's memory has a minimum alignment of\n    AllocFooter so that the footer is at a fixed offset determined from the allocation\n    size. An allocation's memory is stored either:\n    \n    Inside linearly-filled buckets for small allocations.\n    Inside an allocation directly from the backing allocator.\n    \n    To track allocations, each thread maintains a table of backing allocations. The table may be modified by\n    other threads in the case of a producer-consumer operation, so the table is a linked list only expanded by\n    creating new segments. Each thread maintains a linked list of free entries, which may contain entries from\n    other threads' tables.\n    In the case of producer-consumer operations, acquire/release ordering is assumed to be provided\n    externally. This is also assumed by all other thread-safe allocators that reuse memory as otherwise there\n    would be data races on reuse of allocated memory.\n\n    Two fuzz tests have also been added for the allocator. They check that there is no memory reuse, that\n    returned memory is writable, and that it is not overwritten. The multi-threaded fuzz test spawns a number\n    of worker threads which are used for all the test runs. I have run these tests extensively under TSAN.\n\n    Building the standard library tests with an -Osafe compiler build and\n    -Ddebug-allocator:\nBenchmark 1 (3 runs): ./master-out/bin/zig test --zig-lib-dir lib lib/std/std.zig -femit-bin=test --test-no-exec\n  measurement          mean \u00b1 \u03c3            min \u2026 max           outliers         delta\n  wall_time          29.4s  \u00b1  157ms    29.2s  \u2026 29.5s           0 ( 0%)        0%\n  peak_rss           2.24GB \u00b1 3.49MB    2.23GB \u2026 2.24GB          0 ( 0%)        0%\n  cpu_cycles          143G  \u00b1  999M      142G  \u2026  144G           0 ( 0%)        0%\n  instructions        268G  \u00b1 5.22M      268G  \u2026  268G           0 ( 0%)        0%\n  cache_references   13.1G  \u00b1 88.8M     13.0G  \u2026 13.2G           0 ( 0%)        0%\n  cache_misses       2.38G  \u00b1 30.7M     2.35G  \u2026 2.41G           0 ( 0%)        0%\n  branch_misses       634M  \u00b1 6.22M      629M  \u2026  641M           0 ( 0%)        0%\nBenchmark 2 (3 runs): ./branch-out/bin/zig test --zig-lib-dir lib lib/std/std.zig -femit-bin=test --test-no-exec\n  measurement          mean \u00b1 \u03c3            min \u2026 max           outliers         delta\n  wall_time          22.1s  \u00b1 88.6ms    22.0s  \u2026 22.2s           0 ( 0%)        \u26a1- 24.7% \u00b1  1.0%\n  peak_rss           1.11GB \u00b1  799KB    1.11GB \u2026 1.11GB          0 ( 0%)        \u26a1- 50.3% \u00b1  0.3%\n  cpu_cycles          136G  \u00b1  480M      136G  \u2026  137G           0 ( 0%)        \u26a1-  4.4% \u00b1  1.2%\n  instructions        273G  \u00b1 2.07M      273G  \u2026  273G           0 ( 0%)        \ud83d\udca9+  1.6% \u00b1  0.0%\n  cache_references   12.3G  \u00b1 71.3M     12.2G  \u2026 12.4G           0 ( 0%)        \u26a1-  6.0% \u00b1  1.4%\n  cache_misses       2.02G  \u00b1 11.5M     2.01G  \u2026 2.03G           0 ( 0%)        \u26a1- 14.9% \u00b1  2.2%\n  branch_misses       569M  \u00b1 2.65M      567M  \u2026  572M           0 ( 0%)        \u26a1- 10.2% \u00b1  1.7%\n    \n\n    ArrayList \u00a7\n\n    \n    getLastOrNull has been deprecated and renamed to last\n    getLast has been deprecated in favor of last combined\n    with .?\n    lastPtr has been added which returns ?*T\n    \n    Upgrade guide:\n    sample_codeif (list.getLastOrNull()) |foo| {\n    // ...\n}\nconst foo = list.getLast();\n    \u2b07\ufe0f\n    sample_codeif (list.last()) |foo| {\n    // ...\n}\nconst foo = list.last().?;\n\n    ArrayList Pointer Stability \u00a7\n\n    \n    This is an enhancement that can help track down ArrayList usage bugs faster (#36239).\n    \n    Devlog Entry\n    \n    \n    \n\n    debug.SafetyLock Gains Support for Shared Locking \u00a7\n\n    The existing lock and unlock methods continue to act\n    exclusively. They should be used when data may be mutated. New methods, lockShared\n    and unlockShared, may be used for shared locking in situations where multiple\n    independent users are reading but not mutating data.\n    \n\n    fmt.allocPrint moved to mem.Allocator \u00a7\n\n    sample_codetry std.fmt.allocPrint(arena, \"{s}={d}\", .{ x, y });\n    \u2b07\ufe0f\n    sample_codetry arena.print(\"{s}={d}\", .{ x, y });\n    \n\n    Formatted Printing Enhancements \u00a7\n\n    The \"{q}\" specifier which escapes strings so that they can appear in\n    double-quoted string literals has relaxed escaping rules such that UTF-8 encoded data can pass through\n    unmangled.\n\n    \"{qf}\" is introduced for double-quote escaping the output of\n    a format().\n    \n\n    std.zon.parse Reworked \u00a7\n\n    std.zon.parse now takes struct args and allocates its result from an arena.\n    Migration guide:\n    sample_codevar diag: Diagnostics = .{};\ndefer diag.deinit(gpa);\nconst result = std.zon.fromSlice(\n    MyZonType,\n    gpa,\n    source,\n    &diag,\n    .{},\n) catch |err| switch (err) {\n    error.ParseZon => std.process.fatal(\"input.zon: {f}\", .{diag}),\n    error.OutOfMemory => |e| return e,\n};\ndefer std.zon.parse.free(result);\n    \u2b07\ufe0f\n    sample_codevar diag: Diagnostics = undefined;\nconst result = std.zon.fromSlice(MyZonType, .{\n    .gpa = gpa,\n    .arena = arena,\n    .source = source,\n    .diagnostics = &diag,\n}) catch |err| switch (err) {\n    error.ParseZon => diag.fatal(\"input.zon\"),\n    error.OutOfMemory => |e| return e,\n}\n\n    Some methods were renamed:\n\n    \n    fromSliceAlloc \u27a1\ufe0f fromSlice\n    fromSlice \u27a1\ufe0f fromSliceNoAlloc\n    The other \"from\" methods were renamed following this same scheme.\n    \n    \"updateFrom\" variants such as updateFromSlice were added. These update an in\n    memory value, overwriting the value's fields with fields specified in the ZON source. This can be useful\n    when using ZON to load configuration files with varying precedence, for example a text editor that has a\n    global config file and a per-project config file.\n    \n\n    Rename bit_set Variants and Deprecate the Managed One \u00a7\n\n    Renames the types for consistency, deprecating the previous names and the managed variant.\n    \n    std.bit_set.IntegerBitSet \u27a1\ufe0f std.bit_set.Integer\n    std.bit_set.ArrayBitSet \u27a1\ufe0f std.bit_set.Array\n    std.StaticBitset, std.bit_set.StaticBitSet \u27a1\ufe0f\n    std.bit_set.Static\n    std.DynamicBitSetUnmanaged,\n    std.bit_set.DynamicBitSetUnmanaged \u27a1\ufe0f std.bit_set.Dynamic\n    std.DynamicBitSet, std.bit_set.DynamicBitSet \u27a1\ufe0f\n    std.bit_set.DynamicManaged (deprecated)\n    \n    \n\n    Struct-Of-Arrays Style for std.lang.Type \u00a7\n\n    When doing type reflection, structs and unions return their information in struct-of-arrays style\n    (#35234).\n    --- a/lib/compiler/Maker/ScannedConfig.zig\n+++ b/lib/compiler/Maker/ScannedConfig.zig\n@@ -49,9 +49,10 @@ pub fn print(sc: *const ScannedConfig, w: *Writer) Writer.Error!void {\n }\n \n fn printStruct(sc: *const ScannedConfig, s: *Serializer.Struct, comptime S: type, v: S) !void {\n-    inline for (@typeInfo(S).@\"struct\".fields) |field| {\n-        try s.fieldPrefix(field.name);\n-        try printValue(sc, s.container.serializer, field.type, @field(v, field.name));\n+    const info = @typeInfo(S).@\"struct\";\n+    inline for (info.field_names, info.field_types) |field_name, field_type| {\n+        try s.fieldPrefix(field_name);\n+        try printValue(sc, s.container.serializer, field_type, @field(v, field_name));\n     }\n }\n\n    \n\n    Rename lang.OptimizeMode to lang.Optimize \u00a7\n\n    And remove \"release\" from the enum tag names.\n    No functional change, however, despite the addition of backwards-compatibile declarations in this patch,\n    it is breaking because expressions that use == or !=\n    operators will not able to use the deprecated names.\n    \n    std.lang: OptimizeMode \u27a1\ufe0f  Optimize\n      \n      Debug \u27a1\ufe0f- debug\n      ReleaseSafe \u27a1\ufe0f- safe\n      ReleaseFast \u27a1\ufe0f- fast\n      ReleaseSmall \u27a1\ufe0f- small\n      \n    \n    \n\n    lang.Optimize.runtimeSafety \u00a7\n\n    std.lang.Optimize.runtimeSafety is preferred as an alternative to\n    std.debug.runtime_safety since it will offer callsites knowledge about their own\n    module rather than standard library module.\n    \n\n    @import(\"builtin\") Deprecations \u00a7\n\n    The redundant constants cpu, os,\n    abi, and object_format in\n    @import(\"builtin\") have been\n    deprecated and will be removed in 0.18.0. Please replace any usage with the corresponding fields on the\n    target constant:\n    \n    @import(\"builtin\").cpu \u27a1\ufe0f @import(\"builtin\").target.cpu\n    @import(\"builtin\").os \u27a1\ufe0f @import(\"builtin\").target.os\n    @import(\"builtin\").abi \u27a1\ufe0f @import(\"builtin\").target.abi\n    @import(\"builtin\").object_format \u27a1\ufe0f @import(\"builtin\").target.ofmt\n    \n    \n    Handle Floats Correctly in mem.eql and mem.findDiff \u00a7\n\n    The functions std.mem.eql and std.mem.findDiff\n    short-circuit when their two inputs are slices to the same memory. This short-circuiting is only correct\n    when the == operator, for the given type, is reflexive. This isn't the case for\n    floats, as for example std.math.nan(f64) != std.math.nan(f64). The change in this PR\n    disables that optimisation when working on float slices.\n\n    Previously-failing, now-succeeding tests:\n    sample_codeconst x: [3]f64 = .{ 42.0, std.math.nan(f64), 3.1415 };\ntry std.testing.expect(!std.mem.eql(f64, &x, &x));\ntry std.testing.expectEqual(1, std.mem.findDiff(f64, &x, &x));\n    \n\n    Decouple Uri and net.HostName \u00a7\n\n    Uri was sometimes using HostName.validate for host (in resolveInPlace) and sometimes not (in\n    parseAfterScheme). On its own, this was a problem, but the bigger problem is that RFC3986 (Uri) has a much\n    different idea of what a valid host name is than RFC1123 (HostName), and so just making Uri consistently\n    use HostName.validate would make Uri less useful overall.\n\n    Instead, all HostName-related stuff has been removed from\n    Uri. Uri.getHost has been moved to\n    HostName.fromUri (without a graceful deprecation, since the semantics are different enough for users to\n    need to evaluate usage sites), while Uri.getHostAlloc has been removed entirely.\n\n    Migration guide:\n\n    sample_codevar host_buf: [HostName.max_len]u8 = undefined;\nconst host = try uri.getHost(&host_buf);\n    \u2b07\ufe0f \n    sample_codevar host_buf: [HostName.max_len]u8 = undefined;\n// note: the error set is different than it was before since fromUri does validation\nconst host = try HostName.fromUri(uri, &host_buf);\n    #36036\n    \n\n    \n\n    Build System \u00a7\n\n    \n    b.build_root (Directory) \u27a1\ufe0f b.root (Path)\n    ConfigHeader.Options: include_guard_override \u27a1\ufe0f\n    include_guard\n    LazyPath: getDisplayName \u27a1\ufe0f format\n    (\"{f}\")\n    LazyPath.basename: removed since the value is not known until make phase\n    b.findProgram divided into findProgram and\n    findProgramLazy and API future-proofed.\n    ConfigHeader fixed; now reports unused values for all styles\n    addArtifactArg, addPrefixedArtifactArg \u27a1\ufe0f  addArtifactArg2\n    addOutputFileArg, addPrefixedOutputFileArg \u27a1\ufe0f addOutputFileArg2\n    addFileContentArg, addPrefixedFileContentArg \u27a1\ufe0f addFileContentArg2\n    addOutputDirectoryArg, addPrefixedOutputDirectoryArg \u27a1\ufe0f addOutputDirectoryArg2\n    addDirectoryArg, addPrefixedDirectoryArg, addDecoratedDirectoryArg \u27a1\ufe0f addDirectoryArg2\n    addDepFileOutputArg, addPrefixedDepFileOutputArg \u27a1\ufe0f addDepFileOutputArg2\n    addFileArg, addPrefixedFileArg \u27a1\ufe0f addFileArg2\n    \n\n    Separate the Maker Process from the Configurer Process \u00a7\n\n    zig build now runs projects' build.zig code in a separate executable than the\n    one that performs Package Management and executes the build graph, making \n    zig build faster for several reasons\n    (#35428):\n    \n    The maker executable remains unmodified when build.zig script is edited,\n    and therefore only needs to be built exactly once (\"first time setup\") after installing Zig.\n    The maker executable is built with optimizations enabled, which is starting to become\n    more valuable now that we have introduced --watch and --fuzz.\n    build.zig logic can be skipped sometimes depending on what CLI flags are used with\n    zig build.\n    \n    Furthermore, configuration is now serialized into a compact binary format that can be\n    consumed by third party tooling and is part of the new Build Server Protocol. The prior\n    way of satisfying this use case by forking the build runner is\n    no longer supported.\n    To render configuration as .zon to stdout, pass --print-configuration.\n    \n\n    Cache System Reworked \u00a7\n\n    New features:\n    \n    Directory support. Ability for entries added, removed, or renamed in directories to cause a cache\n    miss.\n    Metadata mode. Normally, only changed contents causes a cache miss. In metadata mode, when size, inode,\n    or mtime changes, it always causes a cache miss independent of contents.\n    \n    All four combinations are possible (is_directory=true/false, metadata_mode=true/false). These features\n    are exposed as new API in the Build System.\n    Since the Zig toolchain is heavily reliant on the caching system, this release also switches to a\n    binary format, saving roughly 25% on file size, which eases a bit of pressure on the file system cache\n    while also simplifying the work the computer needs to do - directly copy bytes from disk rather than\n    parsing text files. The new zig cache-cat subcommand is available for troubleshooting or\n    tinkering with files inside a zig-cache directory.\n    The cache system also now has the capability to explain why a \"miss\" happened. The public-facing API of\n    std.Build.Cache has many breaking changes, but outside of compiler tooling, this is\n    an uncommon API to be used, and all the changes make it harder to misuse.\n    This change has been observed to speed up cache hits by 5-10% (#36822).\n    \n\n    Introduce the Concept of Configure Cache Poisoning \u00a7\n\n    If the cache is poisoned means that the configure logic had side effects, or otherwise\n    did something that could not be tracked by the cache system.\n\n    This is not to be confused with whether individual steps may have side effects when being evaluated; it\n    has to do with the logic inside build.zig itself. For example, a Run step that\n    prints \"hello world\" has side effects at make time and therefore does not warrant setting this flag,\n    while checking for the existence of scdoc at configure time in order to choose the default\n    value for a configuration option does.\n\n    Keeping the cache pure will make zig build faster, bypassing the configurer process when\n    identical configuration would be generated.\n\n    When the cache is poisoned, the maker process will delete the build configuration file upon ingesting it\n    since it cannot be reused.\n\n    Ways to poison the cache include calling findProgram, or more directly\n    std.Build.Graph.poisonCache. A better alternative than cache poisoning is to\n    explicitly declare the configuration dependencies with these new functions:\n    \n      std.Build.dependOnFileContents - indicates that the build.zig logic depends on a particular file's contents.\n      std.Build.dependOnFileMetadata - indicates that the build.zig logic depends on a particular file's size, inode, mtime, and contents.\n      std.Build.dependOnDirectoryContents - indicates that the build.zig logic depends on a particular directory's entries.\n      std.Build.dependOnDirectoryMetadata - indicates that the build.zig logic\n      depends on a particular directory's last modification date.\n    \n\n    Advanced users can override the cache poisoning behavior with a new CLI option:\n\n      --cache-poison[=mode]        Override configuration caching behavior\n      pure                     (default) Avoid false positive cache hits\n      poisoned                 Don't cache the configuration\n      disallowed               Panics when cache would be poisoned\n      ignored                  A little poison never hurt anybody\n    \n\n    findProgram \u00a7\n\n    Immediately (in the configure phase), searches for an executable on the host that has more than one\n    possible name.\n    Names are searched in order, observing search prefixes first and then PATH environment variable.\n    Calling this function poisons the configuration cache, so it is only appropriate when the existence of\n    the program or its output needs to be observed by configuration logic. That's why there is also\n    findProgramLazy now.\n    \n\n    findProgramLazy \u00a7\n\n    Creates an anonymous Step that searches for an executable on the host that\n    has more than one possible name.\n\n    Unlike findProgram, this function does not\n    poison the configuration cache, however\n    the result cannot be used in the configuration phase, hence the return type being\n    LazyPath.\n\n    Returns the LazyPath of the found executable. The search only takes place\n    if the LazyPath will be used by a depending Step.\n\n    This API is useful in the following cases:\n    \n     The binary is not named the same across all systems (for example \"python\"\n      vs \"python3\").\n     The binary may be produced by building from source rather than being\n      globally installed and will therefore be possibly found in one of the\n      search prefix paths.\n    \n    \n\n    Run Step: Passthru Args \u00a7\n\n    In the Run step, passthru args are all together now, not observable in\n    configure phase whether run args are provided.\n    --- build.zig\n+++ build.zig\n@\n-if (b.args) |args| {\n-    run_cmd.addArgs(args);\n-}\n+run_cmd.addPassthruArgs();\n\n    This removes a capability from build scripts since they can no longer observe those arguments. In\n    exchange, it means that when changing those arguments, build scripts no longer must be rebuilt from\n    source.\n    \n\n    Fmt Step: Options \u00a7\n\n    paths and exclude_paths are now\n    LazyPath lists. There is a convenience method to create them:\n    b.pathList.\n    --- build.zig\n+++ build.zig\n@\n-    const fmt_include_paths = &.{ \"lib\", \"src\", \"test\", \"tools\", \"build.zig\", \"build.zig.zon\" };\n-    const fmt_exclude_paths = &.{ \"test/cases\", \"test/behavior/zon\" };\n+    const fmt_include_paths = b.pathList(&.{ \"lib\", \"src\", \"test\", \"tools\", \"build.zig\", \"build.zig.zon\" });\n+    const fmt_exclude_paths = b.pathList(&.{ \"test/cases\", \"test/behavior/zon\" });\n\n    \n\n    Step.Options: add addOptionPathDirectory \u00a7\n\n    Now, when adding an option that is a file path, one must explicitly choose between (#36876):\n    \n    addOptionPath (must be a file)\n    addOptionPathDirectory (must be a directory)\n    addOptionPathUntracked (opt out of dependency tracking)\n    \n    \n\n    Lazy Dependency Ergonomic Enhancements \u00a7\n\n    \n    Log when lazy dependencies are fetched.\n    std.Build.dependency: support lazy dependencies\n    Introduce std.Build.dependencyLazy which possibly returns\n    error.LazyDependencyNeeded instead of null, so that you can\n    use try\n    When user build functions return\n    error.LazyDependencyNeeded, build system proceeds to fetch them rather than failing\n    configuration.\n    \n    \n\n    Removed Ability to Override Build Runner \u00a7\n\n    There is no concept of a \"build runner\" any more; it has been\n    split into: configurer and maker\n    This use case is now handled by the Build Server Protocol.\n    \n\n    Package Management \u00a7\n\n    All package management functionality has been moved out of the Compiler and into the\n    Build System. This includes the following sub-commands:\n    \n      zig build\n      zig fetch\n      zig init\n      zig libc \n      zig cache-cat \n    \n    This means that large parts of what used to be included in the compiler executable are now shipped in\n    source form instead, including:\n    \n    package fetching logic\n    http client and networking\n    TLS (Transport Layer Security) and associated crypto\n    git protocol\n    xz, gzip, zstd, flate, zip\n    parsing, validation, and otherwise dealing with build.zig.zon files\n    \n    All of this functionality is now compiled in -Osafe\n    optimization mode rather than -Ofast due to being in the compiler. When hacking on\n    the build system itself, the environment variable ZIG_DEBUG_CMD=1 may be used to\n    compile the build system in debug mode instead.\n\n    Miscellaneous changes:\n    \n    Bug fix: reject path deps that escape the parent package root.\n    \n    Ability to Override Package Path \u00a7\n\n    --pkg-path CLI arg and ZIG_LOCAL_PKG_DIR env var are now observed for both\n    fetch and build commands.\n    \n\n    Global vs Local Fetching \u00a7\n\n    Now zig fetch only fetches into the global cache, just like it used to. However, if\n    --save (or any variant) is used, then it also fetches into the local package path. When\n    fetching globally, does not require build.zig to be present. zig build always\n    fetches locally (in addition to globally).\n    Notably, this fixes the regressed use case zig fetch .\n    When fetching by path, the hash is always computed, recompressed tarball is always created, always\n    overwrites any existing global cache entry.\n    \n    \n\n    Slight Difference in PATH for DLL Arguments \u00a7\n\n    It used to be the case that, when targeting Windows or Wine, artifact args added to Run steps modified\n    PATH based on the set of directories containing the recursive set of DLL dependencies. Now this is only\n    done for argv[0]. The motivation for also doing this for the other command line arguments is unclear, since\n    those DLLs don't need to be loaded in order to execute argv[0].\n    \n\n    Build Server Protocol \u00a7\n\n    Now, when --listen=- is passed, the build system serves a protocol that allows connected\n    clients to monitor and control the build graph as it executes. This is intended to be consumed by\n    third-party tooling such as IDEs.\n    Current things you can do:\n    \n      Get full access to the entire build graph's static, post-configuration information, such as\n          which build steps are available, which options are set, dependencies, etc. There are a couple\n          things yet to be included, such as the exposed set of module names.\n      Get notified when a build step starts and completes, including information about errors and\n          which files were generated.\n      Request specific steps to build.\n    \n    In particular, the\n    separation of maker process and configurer process\n    is a breaking change that prevents the ZLS project from working\n    with 0.17.0. Although some progress was made to restore functionality in this release cycle, Zig team and\n    ZLS team are still working together to enhance the build server protocol further to the\n    point that ZLS can not only restore functionality, but surpass the power and capabilities compared to\n    before.\n    In the future it is expected for much of Zig's own first-party build system tooling to become a client\n    of the build server protocol, dogfooding it to ensure that third-party tooling enjoys equivalent\n    capabilities (#36497).\n    It is also planned for the build server to multiplex compiler server protocol for the compilation steps,\n    providing type-system information, refactoring, and other advanced editing capabilities (#615).\n    \n    \n\n    Compiler \u00a7\n\n    Incremental Compilation \u00a7\n\n    The Zig compiler's implementation of incremental compilation\u2014a feature allowing\n    near-instant rebuilds of projects after changing the code\u2014has been significantly improved\n    in Zig 0.17.0. Many bugs have been fixed, and the new ELF Linker introduced in the\n    previous release has gained good support for the feature.\n    Thanks to these enhancements, it is now possible for most projects targeting\n      x86_64-linux to take advantage of incremental compilation. To do so, add\n    the arguments -fincremental --watch to your zig build command (e.g.\n    zig build -fincremental --watch)\u2014this will cause the Zig build system to\n    listen for changes to source files, and react to them by performing an incremental rebuild.\n    For more information on ways to use incremental compilation in your own projects, or to learn\n    more about how this feature works under the hood, consider checking out\n    this blog post by a\n    Zig core team member.\n    Future releases will continue to focus on improving this feature, including introducing a new\n    Mach-O linker and self-hosted aarch64 Backend with good support for incremental\n    compilation; adding support for using incremental compilation without --watch; and\n    fixing any remaining bugs.\n    \n\n    SPIR-V Backend \u00a7\n\n    The self-hosted SPIR-V backend is now multi-threaded like the other backends.\n    Execution modes such as LocalSize and OriginUpperLeft are now derived\n    from the function's calling convention instead of being set through inline assembly, and the new\n    spirv_task and spirv_mesh calling conventions add\n    support for task and mesh shaders (#35676).\n    Declaring capabilities and extensions in inline assembly with OpCapability and\n    OpExtension is no longer allowed. They are enabled through target CPU features\n    instead, i.e. the -mcpu option.\n    \n    22 bugs were fixed in the SPIR-V backend during this release cycle.\n    \n\n    aarch64 Backend \u00a7\n\n    Progress towards this is blocked on Linker enhancements, many of which were completed\n    during this release cycle.\n    \n\n    loongarch Backend \u00a7\n\n    Initial implementation of self-hosted backend for loongarch64 has been contributed (#36418). It is still experimental\n    and not yet usable. There are two ways to contribute to this backend: working on it directly, and\n    contributing to AIR Legalization Features,\n    which helps all unfinished backends reach the finish line quicker.\n    \n\n    WebAssembly Backend \u00a7\n\n    Zig's WebAssembly backend is now passing 2060/2054 (100%) behavior tests compared to the LLVM\n    backend. However, it is not yet the default when compiling in debug optimization mode due to\n    lack of debug info support (#37032).\n    \n    \n\n    Linker \u00a7\n\n\n    ELF \u00a7\n\n    This release makes significant progress towards replacing Zig's legacy self-hosted ELF linker\n    with its new implementation introduced in the previous release. Specific enhancements include:\n    \n      Full x86_64 support\n      Full SPARC64 support\n      Partial Loongarch support\n      Static library generation\n      Shared library generation\n      Errors for undefined symbols in executables\n      GOT generation\n      Copy relocations\n      GNU symbol versioning\n      DWARF debug information\n      Symbol hash table generation\n      Mostly-reproducible binaries\n      Arbitrary section alignment\n      Support for small host file system block sizes\n    \n    While this linker has not quite reached feature parity with our old self-hosted ELF linker\n    yet\u2014and so remains disabled by default\u2014it is already capable in practice of building\n    the vast majority of Zig projects targeting x86_64-linux. This unlocks the ability\n    to use Incremental Compilation for these projects\u2014like in Zig 0.16.0, the new\n    linker is enabled by default in this case.\n    In the next release of Zig, we hope to fully eliminate the legacy ELF linker in favour of\n    this implementation.\n    \n\n    COFF \u00a7\n\n    COFF support in the linker is enhanced with the following features (#35674):\n    \n    Outputing objects (.obj) and archives (.lib)\n    Outputing implibs alongside images\n    Outputing the TLS and Exports data directories for images\n    Consuming objects, archives, and import libraries as inputs\n    Only links in objects from archives as required, ie. if they contain a symbol needed to satisfy a\n    reference\n    COMDAT rules (enough support for linking compiler_rt and libc, some COMDAT types are not supported\n    yet)\n    Supports linking against both -gnu and -msvc libc\n    TLS support\n    __dllimport support: Indirect calls / loads from the IAT directly\n    Detects which entrypoint to choose based on exported symbols\n    -gnu: Constructor / destructor support (ie. merge .ctor and .dtor, and set up the\n      __CTOR_LIST__, __DTOR_LIST__ symbols)\n    Support for several .drectve arguments (these are required to correctly link\n    msvc libc):\n      /INCLUDE: Forcing a symbol to be referenced\n      /ALTERNATENAME: Adding symbol aliases\n      /MERGE: Section merging. This functionality is also used to direct certain sections into the right\n      place (like .ctor / .dtor into .rdata)\n      /DEFAULTLIB: Adding new inputs\n    \n    \n\n    New Linker Testing Framework \u00a7\n\n    Zig is moving towards snapshot-based testing for its linkers.\n    Tests are a combination of comparing objdump snapshot output, actually running the artifacts, and\n    checking for linker errors.\n    zig build -Dlink-snapshot-update causes tests to run in a mode that outputs snapshots\n    instead of checking against them.\n    A typical workflow for adding a new test:\n    \n    Add the test\n    zig-debug build test-link -Dtest-filter=my-test -Dlink-snapshot-update\n      This will output a .dmp file for all the snapshot combinations defined in any\n      verifyObjdump calls.\n      A single snapshot intentionally aliases between many targets to reduce noise in the snapshot folder,\n      so snapshot updates are made by whichever test runs first for that snapshot name. If differences between\n      targets do exist, they will be revealed in step 4.\n    Inspect the snapshot output for correctness.\n    zig-debug build test-link -Dtest-filter=my-test\n        This will now run all targets against the newly added snapshots\n    If there are now snapshot failures, that means different targets had different snapshot outputs. The\n    output should be inspected to see if these results are indeed valid differences. If they are, then the\n    scope parameter should be used to cause -Dlink-snapshot-update to output snapshot\n    to different filenames, scoped on the diference.\n    Re-run -Dlink-snapshot-update to update the new set of snapshots.\n    \n    \n\n    SPIR-V \u00a7\n\n    The SPIR-V linker has been rewritten (#36828).\n    It now supports incremental compilation and can link external .spv object files.\n    \n    \n\n    Fuzzer \u00a7\n\n    Although this release's Build System changes are loosely related to Zig's integrated\n    fuzzer and its interaction with the build system, no changes were made to the fuzzer itself.\n    We expect to focus on improving the fuzzer in a future release cycle.\n    \n\n    Bug Fixes \u00a7\n\n    Full list of the 329 bug reports closed during this release cycle:\n    Tracked on GitHub\n    Tracked on Codeberg\n    Many bugs were both introduced and resolved within this release cycle. Most bug fixes are omitted from\n    these release notes for the sake of brevity.\n\n    This Release Contains Bugs \u00a7\n\n    \n    Zig has known\n    bugs,\n    miscompilations, and\n    regressions.\n    \n    Even with Zig 0.17.x, working on a non-trivial project using Zig may require participating in the\n    development process.\n    When Zig reaches 1.0.0, Tier 1 support will gain a bug policy as an additional requirement.\n\n    Notable Regressions \u00a7\n\n    We are aware of these notable regressions in 0.17.0:\n    \n      #37006: compiler-rt fails to compile for soft float on x86\n      #36986: std.debug.simple_panic fails to compile\n      #36986: Weak Zig libc symbols cannot be reliably overridden\n      #36444: The separation of maker process and configurer process breaks response file use cases for std.Build.Step.Run\n      #37050: SPIR-V backend regressions\n    \n    \n    \n    \n\n    \n\n\n    LLVM 22 \u00a7\n\n    This release of Zig upgrades to\n    LLVM 22.1.8. This\n    covers Clang (zig cc), libc++, libc++abi, libunwind, and\n    libtsan as well.\n    Loop Vectorization Disabled to Work Around Regression \u00a7\n\n    In the previous release of Zig, we were forced to disable a key LLVM optimization\n    pass\u2014loop vectorization\u2014to work around a\n    miscompilation which affected\n    the Zig compiler.\n    Since we first introduced that workaround, a\n    fix has been merged into LLVM's\n    main branch. However, the fix is not available in LLVM 22, the LLVM version used by Zig\n    0.17.0. Therefore, this workaround remains enabled for now.\n    Zig 0.18.0 will upgrade to LLVM 23, so will allow us to re-enable this optimization pass.\n    \n    \n\n    musl 1.2.5 \u00a7\n\n    Zig 0.17.0 distributes musl 1.2.5 plus backported security and portability fixes. Meanwhile,\n    upstream has tagged 1.2.6. Zig 0.18.0 will update to musl 1.2.6.\n    When targeting musl statically, many functions are now provided by zig libc rather\n    than source files copied from musl. Therefore, if you encounter bugs with musl libc provided by Zig, please\n    respect upstream by reporting them to Zig's issue tracker rather than musl's.\n    \n\n    glibc 2.44 \u00a7\n\n    glibc version 2.44 is now available when cross-compiling.\n    \n\n    \n\n    This release includes Linux kernel headers for version 7.2.\n    \n\n    \n\n    This release includes macOS system headers for version 27.0.\n    \n\n    MinGW-w64 \u00a7\n\n    Zig 0.17.distributes MinGW-w64 commit 31bd54ab7d5fe03c67ed2bb1a57e531b9c7f8cc4.\n    However, many functions are now provided by zig libc rather\n    than source files copied from MinGW-w64. Therefore, if you encounter bugs with MinGW-w64 libc provided by Zig,\n    please respect upstream by reporting them to Zig's issue tracker rather than MinGW-w64's.\n    \n\n    NetBSD 11.0 libc \u00a7\n\n    NetBSD libc version 11.0 is now available when cross-compiling.\n    \n\n    OpenBSD 7.9 libc \u00a7\n\n    OpenBSD libc version 7.9 is now available when cross-compiling.\n    \n\n    WASI libc \u00a7\n\n    Zig 0.17.0 continues to distribute WASI libc\n    commit c89896107d7b57aef69dcadede47409ee4f702ee.\n    However, many functions are now provided by zig libc rather than source files copied from WASI\n    libc.\n    Furthermore, starting with Zig 0.18.0, instead of distributing third party WASI libc code, Zig will\n    provide libc for WASI targets via zig libc. For more information, see:\n    \n    Define a distinct Zig libc ABI\n    remove support for wasi-libc\n    \n    \n\n    zig libc \u00a7\n\n    In libc.txt files, the gcc_dir field has been renamed to cc_dir\n    to reflect the reality that it is not specific to GCC. The old name will still be accepted for now, but\n    users are encouraged to migrate their libc.txt to the new name (#36951).\n\n    Additionally, cc_dir is now required on Linux targets. Note that, because Android and OpenHarmony\n    store the relevant object files in an unusual location, users of these targets will likely want to set\n    cc_dir to the same path as crt_dir.\n    \n\n    zig cc \u00a7\n\n    zig cc and zig c++ are now based on Clang 22.1.8.\n    \n\n    zig objdump \u00a7\n\n    This was a requirement for snapshot testing, as well as aiding in developing the COFF\n    Linker.\n    Supported features:\n    Usage: zig objdump [options] file\n\nOptions:\n  -h, --help                         Print this help and exit\n  --all-headers                      Alias for --file-headers --linker-member=2 --member-headers --section-headers --relocs --symbols\n  --exports[=sort]                   Display exported symbols.\n                                     In the case of COFF import libraries, displays the symbol list and import headers.\n                                     Specify =sort to optionally sort the import headers by symbol name.\n  --file-headers                     Display file-format specific headers\n  --imports                          Display imported symbols\n  --linker-member[=1|2|longnames]    (Coff) Display contents of the specified archive linker member (default 2)\n  --member-headers                   Display archive member headers\n  --elements=[e1],[e2],-[e3],...     Select which formatting elements are displayed. Intended for snapshot testing.\n      file-type                      File type summary\n      header-name                    Name that precedes a header block\n      member-path                    Display full member paths. If removed, only basenames will be used.\n      newlines                       Newlines between output sections\n      table-header                   Table headers with column names\n      all                            (default) All of the above\n  --only-member=[name]               Only consider archive members names that contain [name]. Can be specified multiple times.\n  --only-section=[name]              Only consider section names that contain [name]. Can be specified multiple times.\n  --only-symbol=[name]               Only consider symbol names that contain [name]. Can be specified multiple times.\n  --redact=[kind]                    Redact the specified field kind. Intended for snapshot testing.\n      rva                            Relative virtual addresses\n      va                             Virtual addresses and file offsets\n      ord                            Symbol ordinals / hints\n      size                           Sizes and lengths\n      all                            All of the above\n  --relocs                           Display relocations\n  -s, --snapshot                     Alias for --redact=all --elements=-all\n  --section-headers                  Display section headers\n  --strings                          Display string tables\n  --symbols                          Display symbol tables\n  --tls                              Display TLS information\n      Some example output:\n      \u276f zig objdump mathtest-dync-exe-no-llvm.dll --all-headers\nmathtest-dync-exe-no-llvm.dll: PE/COFF image\n\n\nCOFF Header:\n            8664 machine (AMD64)\n               7 number_of_sections\n        6a08670a time_date_stamp\n               0 pointer_to_symbol_table\n               0 number_of_symbols\n              f0 size_of_optional_header\n            2022 flags\n               | EXECUTABLE_IMAGE\n               | LARGE_ADDRESS_AWARE\n               | DLL\n\nCOFF Optional Header:\n             20b magic (PE32+)\n           14.00 linker_version\n          14a400 size_of_code\n           84e00 size_of_initialized_data\n               0 size_of_uninitialized_data\n            1000 address_of_entry_point (       180001000)\n            1000 base_of_code (       180001000)\n       180000000 image_base\n            1000 section_alignment\n             200 file_alignment\n            6.00 operating_system_version\n            1.00 image_version\n            6.00 subsystem_version\n               0 win32_version_value\n          1d6000 size_of_image\n             400 size_of_headers\n               0 checksum\n               2 subsystem (WINDOWS_GUI)\n             160 dll_flags\n               | HIGH_ENTROPY_VA\n               | DYNAMIC_BASE\n               | NX_COMPAT\n          100000 size_of_stack_reserve\n            1000 size_of_stack_commit\n          100000 size_of_heap_reserve\n            1000 size_of_heap_commit\n               0 loader_flags\n              10 number_of_rva_and_sizes\n\nData Directories:\n          1b48d0       54 EXPORT\n          1b4924       8c IMPORT\n               0        0 RESOURCE\n          1cc000     633c EXCEPTION\n               0        0 SECURITY\n          1d4000     1280 BASERELOC\n          1bc000       1c DEBUG\n               0        0 ARCHITECTURE\n               0        0 GLOBALPTR\n          1aebc8       28 TLS\n               0        0 LOAD_CONFIG\n               0        0 BOUND_IMPORT\n          1b4c80      2d0 IAT\n               0        0 DELAY_IMPORT\n               0        0 COM_DESCRIPTOR\n               0        0 RESERVED\n\nSections in 'mathtest-dync-exe-no-llvm.dll':\nNum Name          RVA Virt Size Data Size   & Data & Relocs  & Lines # Relocs  # Lines    Flags\n  1 .text        1000    14a346    14a400      400        0        0    0    0 60000020 | CNT_CODE MEM_EXECUTE MEM_READ\n  2 .rdata     14c000     6fe3c     70000   14a800        0        0    0    0 40000040 | CNT_INITIALIZED_DATA MEM_READ\n  3 .buildid   1bc000        52       200   1ba800        0        0    0    0 40000040 | CNT_INITIALIZED_DATA MEM_READ\n  4 .data      1bd000      e2a0      d200   1baa00        0        0    0    0 c0000040 | CNT_INITIALIZED_DATA MEM_READ MEM_WRITE\n  5 .pdata     1cc000      633c      6400   1c7c00        0        0    0    0 40000040 | CNT_INITIALIZED_DATA MEM_READ\n  6 .tls       1d3000        20       200   1ce000        0        0    0    0 c0000040 | CNT_INITIALIZED_DATA MEM_READ MEM_WRITE\n  7 .reloc     1d4000      1280      1400   1ce200        0        0    0    0 42000040 | CNT_INITIALIZED_DATA MEM_DISCARDABLE MEM_READ\n\nNo symbol table found\n\n    If this output was used for a snapshot test that wanted to test the presence of a particular export:\n\n\u276f zig objdump mathtest-dync-exe-no-llvm.dll --exports --only-symbol=add --redact=rva --elements=-all\nExport directory:\n               0 flags\n               0 time_date_stamp\n            0.00 version\nxxxxxxxxxxxxxxxx name_rva\n               1 ordinal_base\n               1 number_of_entries\n               1 number_of_names\nxxxxxxxxxxxxxxxx export_address_table_rva\nxxxxxxxxxxxxxxxx name_pointer_table_rva\nxxxxxxxxxxxxxxxx ordinal_table_rva\n   1    0 xxxxxxxx | add\n\n    The redaction (--redact=) and element removal (--elements=) functionality is used to remove parts of\n    the output that don't matter for the particular test, as to not cause spurious failures if say, an RVA for\n    a symbol changes due to some unrelated change to the linker. -s is shorthand which enables all the\n    redacts and removes all extra output elements, but particular tests may not use this if they do care about\n    specific values.\n    \n\n    resinator \u00a7\n\n    Windows Resource Compilation Moving to an External Package \u00a7\n\n    Windows resource script\n    compilation will be moved out of the compiler and into an official-but-external build system\n    package in the next release. As such, the corresponding std.Build functions and fields\n    (Build.Module.addWin32ResourceFile, etc) have been marked as deprecated in this release.\n\n    The zig rc subcommand will remain after this change in order to continue supporting the use\n    case of using the Zig toolchain with other build systems.\n    \n    \n\n    zig fmt \u00a7\n\n    Added --complexity Flag \u00a7\n\n    It's a simple tool for counting tokens and AST nodes, which can be used to share how an edit to a source\n    file increases or reduces complexity with a heuristic that is more insightful than line count.\n    For example, running it on old ELF linker directory:\n    info: src/link/Elf/gc.zig: tokens=1538 nodes=770\ninfo: src/link/Elf/Atom.zig: tokens=15576 nodes=7768\ninfo: src/link/Elf/Merge.zig: tokens=2288 nodes=1092\ninfo: src/link/Elf/Thunk.zig: tokens=1128 nodes=519\ninfo: src/link/Elf/SharedObject.zig: tokens=4566 nodes=2236\ninfo: src/link/Elf/eh_frame.zig: tokens=4840 nodes=2335\ninfo: src/link/Elf/Symbol.zig: tokens=3770 nodes=1872\ninfo: src/link/Elf/synthetic_sections.zig: tokens=13287 nodes=6375\ninfo: src/link/Elf/Object.zig: tokens=13903 nodes=6842\ninfo: src/link/Elf/LinkerDefined.zig: tokens=4140 nodes=2091\ninfo: src/link/Elf/relocatable.zig: tokens=3598 nodes=1848\ninfo: src/link/Elf/Archive.zig: tokens=2176 nodes=1028\ninfo: src/link/Elf/ZigObject.zig: tokens=20783 nodes=10274\ninfo: src/link/Elf/AtomList.zig: tokens=1819 nodes=933\ninfo: src/link/Elf/relocation.zig: tokens=1289 nodes=551\ninfo: src/link/Elf/file.zig: tokens=2330 nodes=1087\ninfo: total: tokens=97031 nodes=47621\n    Another example is after editing Lld.zig to use\n    arena.print rather than std.fmt.allocPrint. The\n    line count is roughly the same but --complexity tells a different story:\n    \n    before: tokens=11929 nodes=5900\n    after: tokens=11832 nodes=5852 (1% reduction in source complexity)\n    \n    In the future this metric may be helpful for an automatic import organizer to determine whether to\n    create an import alias or not. \n    \n    \n\n    \n\n    Roadmap \u00a7\n\n    \n      Work with ZLS team to enhance Build Server Protocol to the point where\n      satisfies all their use cases.\n      Complete Windows support in the x86_64 backend so that it can be enabled by default.\n      Complete and stabilize the language.\n      Complete the aarch64 Backend and make it the default backend for debug mode.\n      Enhance the Linker implementations, eliminating dependency on\n      LLD and support Incremental Compilation.\n      Enhance the integrated Fuzzer to be competitive with AFL and other state-of-the-art fuzzers.\n      Transition from a library dependency on LLVM to a process dependency on Clang (#16270).\n      Complete the Build System, in particular Package Management features.\n      Audit the Standard Library (#1629).\n    \n    \n\n    Thank You Contributors! \u00a7\n\n    Here are all the people who landed at least one contribution into this release:\n    \nAlex R\u00f8nne Petersen\nAndrew Kelley\nMatthew Lugg\nCasey Banner\nJacob Young\nFrank Denis\nAli Chraghi\nIsaac Freund\nPavel Verigo\nRyan Liptak\nTechatrix\nJustus Klausecker\nLinus Groh\nxtex\nrpkak\nDavid Rubin\nElaine Gibson\nDavid Senoner\nK4\nfardragon\npentuppup\nKrzysztof Wolicki\nMason Remaley\nMeghan Denny\nChristophe Delage\nRobbie Lyman\nLuk\u00e1\u0161 Lalinsk\u00fd\nBrandon Black\nKendall Condon\nhemisputnik\nwhatisaphone\nBen Anderman\nGasInfinity\nHuang Zhichao\nJakub Konka\nJari Vetoniemi\nKleshzz\nMick Sayson\nMiko\u0142aj Rosowski\nRyan Mehri\nSertonix\njeffkdev\nlg\nCarl \u00c5stholm\nEJ\nHila Friedman\nQuint Daenen\nSaurabh Mishra\nStephen Gregoratto\nSubo2002\nTen Eugene\nzacoons\nArthur Teixeira\nBen Burkert\nBernard Assan\nCursedByTheVoid\nDaniel Kareh\nEnnui Langeweile\nIgor Anic\u0301\nJanne Hellsten\nJay Petacat\nNguy\u1ec5n Gia Phong\nRagul R\nRue04\nRyan Mehri\nSam Connelly\nScott Redig\nTheo Fabi\nVitor Fernandes\nc-kappel\ngero3\nglowsquid\ntaoqy\nteflate\nxeondev\nAI Xin\nARandomOSDever\nAcid Bong\nAdri\u00e0 Arrufat\nAkshay Trivedi\nAlan Cocanour\nAlex Kladov\nAmilia MacIntyre\nAnders Stenberg\nAndrew Kraevskiii\nAnshul Gupta\nAnthon van der Neut\nAri Becker\nAshley (holtowd)\nC19\nCarter Snook\nChadwain Holness\nChlo\u00e9 Vulquin\nChris Boesch\nChristoffer Lerno\nCorentin Kerisit\nDavid\nDevin J. Pohly\nDiego Pe\u00f1a y Lillo\nDmitry Mostovenko\nEric Joldasov\nErik Schlyter\nFalsePattern\nFitti\nGabriel Sa\nGereon V\nGiuseppe Cesarano\nGota7\nGrimTyr\nGuillaume Wenzek\nGuy Fischman\nHenry Kupty\nIgnacio Ibarra\nJan Proch\u00e1zka\nJan200101\nJeff Fowler\nJeremy Linton\nJohn Benediktsson\nJonathan Marler\nJoseph Lyncheski\nJosh Megnauth\nKirk Scheibelhut\nLeon Lombar\nLeonid Emar-Kar\nMai-Lapyst\nManlio Perillo\nMarcel W. Wysocki\nMark Rushakoff\nMathieu Suen\nMatthew Knight\nMatthias Portzel\nMichael Farber Brodsky\nMilo\u0161 Koz\u00e1k\nNguyen Gia Huy\nNico Elbers\nNoam Rothschild\nNurul Huda (Apon)\nPaul Anderson\nPaulo Duarte\nPerry Fraser\nPivok\nPreeternal\nProkop Rand\u00e1\u010dek\nRadsammyT\nRayan Halder\nRichalsu\nRichard Levitte\nRue04\nRyan Davis\nRyan King\nSage Hane\nSamuel Hunter\nSawyer X\nSiddharth Sinha\nSteve\nTapir\nThibault Leclercq\nYasin Gorgij\nZhalkhas\nabdessalem\nagave\nahwayakchih\nakbarhusain\narshidkv12\navalyn0x45\nbadayvedat\nbinarycraft007\nbrianferri\nbrkzlr\ncarmooo\ncheesecakecatttt\nconmaster2112\ndrex_vk\ngDator\ngemmaro\ngubbu\nilovapples\njmcaine\njohan0A\njpk68\nkrystiann\nkubashi\nl1yefeng\nlevinqua\nllogick\nmarximimus\nmihael\nmlugg\nnash1111\nndjenks\nnekogirl\nnyx-xyn\npancelor\nskdishansachin\nsphaerophoria\nsquidy239\nsstochi\nvlkrs\nzirunis\n\u00d6mer Faruk IRMAK\n\u0388\u03bb\u03bb\u03b5\u03bd \u0395\u03bc\u03af\u03bb\u03b9\u03b1 \u0386\u03bd\u03bd\u03b1 Zscheile\n\u6797\u6668 (Leo Cheng)\n    \n    \n\n    \n\n    \n    Special thanks to those who sponsor Zig.\n    Because of diverse, recurring donations, Zig is driven by the open source community, rather\n    than the goal of making profit. In particular, those below sponsored Zig\n    for an average of $50/month or more during this release cycle\n    using our preferred donation platform:\n    \n    \n    Sergey M\n    Mitchell Kember\n    David Vanderson\n    Thomas Manner\n    Kirk Scheibelhut\n    Kazuhiro Kondo\n    Merlyn Morgan-Graham\n    Freddi Linse\n    Numan Sachwani\n    Aur\u00e9lien Cibrario\n    Erik Dunteman\n    Ondra Voves\n    Mitchell Gayner\n    Dylan Conway\n    Trevor John\n    Jason Watson\n    Greg Clark\n    Benjamin Crist\n    Alexander Weavers\n    Natalie Vais\n    Stevie Hryciw\n    Kyle Hill\n    Felix Quei\u00dfner\n    Srinivasan Balram\n    Peter Ronnquist\n    Lajos Nagy\n    Gauthier Voron\n    Andrew Mangogna\n    Alex Kladov\n    Jacob Sandlund\n    Jordan Lucier\n    Wolfgang Sanyer\n    Matthew Knight\n    Nick Macholl\n    Ceri Elenbaas\n    Michael Keathley\n    Daniele Cocca\n    Bartosz Bogacz\n    James Cox-Morton\n    William Canan\n    Fabio Arnold\n    Johannes Meyer\n    Silver van Koten\n    Flavius Gruian\n    Daniel MacDougall\n    Karrick McDermott\n    Dan Mack\n    Caleb Hearon\n    Richard Levitte\n    Ingimar J\u00f3hannesson\n    David Fendley\n    Aaron Cross\n    Jeremiah Oard\n    Simon Ekstr\u00f6m\n    Jorge De Le\u00f3n\n    Saurabh Mishra\n    Rob Green\n    Kytezign q\n    Mykhailo Tsiuptsiun\n    Paul Sargent\n    Erik M\u00e5llberg\n    Igor Anic\n    Fawzi Mohamed\n    David Jones\n    Magnus Holm\n    Nicholas Woolmer\n    Samarth Kishor\n    Charles Haws\n    Shlomi Atar\n    Robbie Lyman\n    Andrius Bentkus\n    Jean-Luc Geering\n    Aaron Mady\n    coleman broaddus\n    Trace Andreason\n    Jim Calabro\n    Chris Baldwin\n    Ian Johnson\n    Brandon Black\n    Michael Lynch\n    O Y\n    Francesco Gualazzi\n    David Sugar\n    Malcolm Still\n    Jeff Fowler\n    Yaroslav Zhavoronkov\n    Miles McGruder\n    \u00c1lvaro Justen\n    FELIPE SOARES GONCALVES SA ROSA\n    Noah Betzen\n    Manuel Barkhau\n    Rikard Karlsen\n    Frank Ittermann\n    Eli Janssen\n    Peter Snelgrove\n    Will Pragnell\n    Pete Dietl\n    Vaughn Spielman\n    Michael Kato\n    Daniel Dubecky Hodan\n    Dan Boykis\n    Richard Feldman\n    Markus Ort\n    Peyman Mortazavi\n    Wilson Bilkovich\n    Kev Burns\n    Francisco Nevitt Gon\u00e7alves\n    Mark Banhidi\n    Kristoffer Str\u00f6m\n    Carl Distefano\n    Alexander Reustle\n    Martin Hovda Haugsand\n    Lexa Tang\n    Lennart Tuijnder\n    Enver Bisevac\n    Jameson York\n    Hong Shick Pak\n    Travis Staloch\n    Clover Caruso\n    Matthew Chavez\n    Daniel Gregoire\n    Jose M Rico\n    Xavier Cochran\n    Nas Denkov\n    Pavel Rychl\u00fd\n    papa leromi\n    Ronald Zielaznicki\n    Tommi Komulainen\n    Matthew Jee\n    Johan Forsberg\n    \u0141ukasz Mr\u00f3z\n    Fabio Leimgruber\n    Maurice van Veen\n    Dean Simmons\n    Pierre Marc Levasseur\n    Sebastian Appler\n    Sam Windell\n    Aksel Hjerpbakk\n    Jonathan Helland\n    Karl Fleischmann\n    Erik Hansen\n    Chris Boesch\n    Pablo \u00c1lvarez\n    Jacob Hooper\n    Avinash Lakshman\n    Joshua Park\n    Nicholas Clark\n    Ryan Higgins\n    Jeffrey Ollie\n    Adam Goertz\n    David Nowotny\n    Gus Louw\n    David Francoeur\n    David Sparby\n    Tyler Bender\n    Mark Halonen\n    Reinis Taukulis\n    Nancy Remaley\n    Isaac F\n    Kjell Hoffhenke\n    Vlad Panazan\n    Jordan Rowland\n    Jay Van Der Wall\n    Jean-Philippe Quenord\n    Jakob K\u00fclzer\n    Varun Pramanik\n    Benjamin Edwards\n    Andreas Herrmann\n    Adam Nilsson\n    Joseph Ruiz\n    Anthony Nguyen\n    Marcin Wolcendorf\n    Tobias Lahrmann Hansen\n    Pat Smuk\n    Martin Weber\n    Jordan Kardon\n    Benjamin LE BERRE\n    John Goen\n    Sebastian Ahlman\n    Anthony Hernandez\n    Shail Patel\n    Alexander Genaud\n    Morten Dalfoss\n    Jason Dubaniewicz\n    Mark Hayes\n    Eivind Rovik\n    Renan Silva\n    Isak K\u00e4llman\n    Ladislav B\u00f6hm\n    LeRoyce Pearson\n    Rowan Saunders\n    Joshua Masci\n    Raymond Imber\n    Daniel Worley\n    Owen Cabalceta\n    Erez Shomron\n    Max Grosse\n    Ehden Sinai\n    Christopher Redden\n    Antoine Balaine\n    Chris Durkin\n    Dave Wallace\n    Aura Birb\n    Andy Armstrong\n    Spencer Brower\n    Simon Clavet\n    Guido Schmidt\n    Peter McGaughey\n    Callum McArthur\n    David Lei\n    David Brotz\n    Matti H\u00e4nninen\n    Joseph Chan\n    Vincent Weber\n    Jeremy McAdams\n    Morgan Gallant\n    Brett Pechiney\n    Thilina Jayanath Nenathunga Liyanage\n    Kevin Bockelandt\n    Gunnar Z\u00f6tl\n    \n    Special thanks also to TigerBeetle,\n    Synadia Communications, and\n    ZML for substantial contributions."
                ],
                "output": "readability",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-02T22:05:46.665721+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmp1g_5yfvi",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-03T01:42:00.824361+00:00",
                "index_texts": [
                    "0.17.0 Release Notes\n    \n    Download & Documentation\n    \n    \n    Zig is a general-purpose programming language and toolchain for maintaining\n    robust, optimal, and reusable software.\n    \n    Zig development is funded via Zig Software Foundation,\n    a 501(c)(3) non-profit organization. Please consider a recurring donation\n    so that we can offer more billable hours to our core team members. This is\n    the most straightforward way to accelerate the project along the\n    Roadmap to 1.0. If you need donation receipts or are\n    looking to migrate away from GitHub Sponsors, we recommend\n    donating via Every.org.\n    \n\n    This release features 5 months of work: changes from 206 different\n    contributors, spread among 925 commits.\n\n    Originally predicted to be shorter, this release cycle ended up substantial, with\n    the Build System reworked, including the introduction of the\n    Build Server Protocol, and the ELF Linker enhanced to the point where we\n    expect Incremental Compilation to work for everyone on x86_64-linux.\n    \n\n    Table of Contents \u00a7\n\n    \n\n    \n        Table of Contents\n        Target Support\n        \n            Tier System\n            \n                Tier 1\n                Tier 2\n                Tier 3\n                Tier 4\n            \n            Support Table\n            OS Version Requirements\n            Additional Platforms\n        \n        Language Changes\n        \n            Language Stability Progress\n            @bitCast changes\n            Formally Specified and Fuzzed Grammar\n            C Translation Moving to External Package\n            Added @backingInt and @fromBackingInt\n            Added @SpirvType\n            Array Multiplication Syntax Removed\n            Added @divCeil\n            @hasDecl Returns true Only for Public Declarations\n            Allow Dereference and Coercion to Array Pointer of comptime Length Slices\n            void{} Syntax Removed\n            errdefer Capture Removed\n            i0 Removed\n            internal and link_once Global Linkage Removed\n        \n        Standard Library\n        \n            Deprecations\n            StackFallbackAllocator Reworked\n            SafeAllocator Introduced\n            ArrayList\n            \n                ArrayList Pointer Stability\n            \n            debug.SafetyLock Gains Support for Shared Locking\n            fmt.allocPrint moved to mem.Allocator\n            Formatted Printing Enhancements\n            std.zon.parse Reworked\n            Rename bit_set Variants and Deprecate the Managed One\n            Struct-Of-Arrays Style for std.lang.Type\n            Rename lang.OptimizeMode to lang.Optimize\n            lang.Optimize.runtimeSafety\n            @import(\"builtin\") Deprecations\n            Handle Floats Correctly in mem.eql and mem.findDiff\n            Decouple Uri and net.HostName\n        \n        Build System\n        \n            Separate the Maker Process from the Configurer Process\n            Cache System Reworked\n            Introduce the Concept of Configure Cache Poisoning\n            findProgram\n            findProgramLazy\n            Run Step: Passthru Args\n            Fmt Step: Options\n            Step.Options: add addOptionPathDirectory\n            Lazy Dependency Ergonomic Enhancements\n            Removed Ability to Override Build Runner\n            Package Management\n            \n                Ability to Override Package Path\n                Global vs Local Fetching\n            \n            Slight Difference in PATH for DLL Arguments\n            Build Server Protocol\n        \n        Compiler\n        \n            Incremental Compilation\n            SPIR-V Backend\n            aarch64 Backend\n            loongarch Backend\n            WebAssembly Backend\n        \n        Linker\n        \n            ELF\n            COFF\n            New Linker Testing Framework\n            SPIR-V\n        \n        Fuzzer\n        Bug Fixes\n        \n            This Release Contains Bugs\n            \n                Notable Regressions\n            \n        \n        Toolchain\n        \n            LLVM 22\n            \n                Loop Vectorization Disabled to Work Around Regression\n            \n            musl 1.2.5\n            glibc 2.44\n            Linux 7.2 Headers\n            macOS 27.0 Headers\n            MinGW-w64\n            NetBSD 11.0 libc\n            OpenBSD 7.9 libc\n            WASI libc\n            zig libc\n            zig cc\n            zig objdump\n            resinator\n            \n                Windows Resource Compilation Moving to an External Package\n            \n            zig fmt\n            \n                Added --complexity Flag\n            \n        \n        Roadmap\n        Thank You Contributors!\n        Thank You Sponsors!\n    \n\n    \n\n    Target Support \u00a7\n\n    \n      Zig supports a wide range of architectures and operating systems. The\n      Support Table and Additional Platforms sections cover\n      the targets that Zig can build programs for, while the\n      zig-bootstrap README\n      covers the targets that the Zig Compiler itself can be easily\n      cross-compiled to run on.\n    \n    Notable changes:\n    \n      aarch64-openbsd is now tested natively in Zig's CI, ensuring high-quality\n      support going forward.\n      aarch64-freebsd and aarch64-netbsd CI jobs now run on pull\n      requests too, in addition to master pushes.\n      An LLVM bug that broke\n      most aarch64-windows binaries, including the Zig Compiler, has been\n      worked around.\n      The Zig Compiler now applies mandatory code hardening techniques when targeting\n      aarch64-openbsd so that the resulting binaries actually work.\n      Zig now provides stack traces on crashes and failed assertions on 32-bit ARM. Some work\n      still remains for Thumb-only\n      targets.\n      Zig now provides stack traces on crashes and failed assertions on SPARC.\n      Zig now handles pointer authentication opcodes when doing stack unwinding on AArch64.\n      Support for the loongarch32-linux-gnu[sf] targets has been added.\n      Zig now has generally usable support for 64-bit SPARC, and especially\n      sparc64-linux. This is largely thanks to Zig's new ELF linker which now has better\n      support for this target than LLD.\n      The Zig Standard Library has been ported to the x32 and N32 ABIs on x86-64 and\n      64-bit MIPS, respectively. These are niche ILP32 ABIs that allow using the 64-bit instruction set\n      while only having 32-bit pointers - the idea being to trade available address space for lower\n      memory usage and better cache utilization.\n      Target information has been added for some game consoles: aarch64-switch,\n      arm-gba, mipsel-psx, and powerpc-wiiu\n      Very early xtensa-linux support has been added to Zig. Note that, for now,\n      this support can only be exercised via the C backend or the experimental LLVM\n      backend.\n      The Zig Standard Library now has support for arc[eb]-linux,\n      csky-linux, and m88k-openbsd when using the C backend.\n      The Zig Standard Library now has support for no-libc microblaze[el]-linux,\n      sh[eb]-linux, and sparc-linux.\n      Zig now enforces -mabi=ieeelongdouble for all PowerPC targets. This is just a\n      formalization of what was already reality; Zig has never supported the IBM \"double-double\"\n      format for long double and likely never will. As a result, this release drops\n      support for powerpc-linux-gnueabi[hf] because glibc only supports the \"double-double\"\n      format on these targets. The powerpc-linux-musleabi[hf] targets remain supported as\n      they use the IEEE format.\n      This release drops support for powerpc64-linux-gnu. Zig has only ever\n      supported linking ELFv2 binaries for 64-bit PowerPC, and glibc does not officially support\n      ELFv2 on big endian - nor IEEE long double, as above.\n      Zig's ability to detect the native CPU model and features has been greatly enhanced across\n      the board; this affects almost every architecture on every supported OS.\n      \n        The baseline CPU model has been changed for some targets:\n        \n          aarch64-haiku: cortex_a55\n          m68k-*: M68030\n          mips64-openbsd: octeon\n          powerpc-netbsd: 750\n          powerpc64-freebsd: pwr8\n          powerpc64-linux: pwr8\n          powerpc64-openbsd: pwr9\n          s390x-*: arch11\n          sparc-*: generic\n          sparc-linux: v9\n          sparc64-*: ultrasparc\n          xtensa-*: esp32\n        \n      \n      In Zig's target query syntax, native libc version detection now only happens if the triple\n      actually uses native libc (i.e. the ABI component is omitted). We expect this new behavior to\n      better match people's mental model for how target queries work, particularly when considering\n      how the OS component works.\n    \n\n    Tier System \u00a7\n\n    \n      Zig's level of support for various targets is broadly categorized into\n      four tiers with Tier 1 being the highest. The goal is for Tier 1 targets\n      to have zero disabled tests - this will become a requirement for\n      post-1.0.0 Zig releases.\n    \n\n    Tier 1 \u00a7\n\n    \n      All non-experimental language features are known to work correctly.\n      The Compiler can generate machine code for this target without relying on LLVM.\n      The integrated fuzzer works on this target (if applicable).\n    \n    \n\n    Tier 2 \u00a7\n\n    \n      The Standard Library cross-platform abstractions have implementations for this target.\n      Failed assertions and crashes produce stack traces on this target.\n      libc is available for this target even when cross-compiling (if applicable).\n      Continuous integration machines build the module tests for this target on every push.\n    \n    \n\n    Tier 3 \u00a7\n\n    \n      The Compiler can generate machine code for this target by relying on an external backend such as LLVM.\n      The Linker can produce object files, libraries, and executables for this target.\n    \n    \n\n    Tier 4 \u00a7\n\n    \n      The Compiler can generate assembly or C source code for this target.\n    \n    \n\n    \n\n    Support Table \u00a7\n\n    \n      In the following table, \u2705 indicates full support, \u274c indicates no\n      support, and \u26a0\ufe0f indicates that there is partial support, e.g. only for some\n      sub-targets, or with some notable known issues. \u2754 indicates that the\n      status is largely unknown, typically because the target is rarely\n      exercised. Hover over other icons for details.\n    \n    \n      Targets marked with \ud83e\udea6 are obsolescent; the Zig compiler and standard\n      library maintain best-effort support for them, but that support is\n      expected to be removed eventually.\n    \n\n    \n      \n        \n          Tier \n          Target \n          Code Gen. \n          Linker \n          Lang. Feat. \n          Std. Lib. \n          Stack Traces \n          Fuzzer \n          libc \n          CI \n        \n      \n\n      \n        \n          1 \n          x86_64-linux \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n\n        \n          \n            \n          \n        \n\n        \n          2 \n          aarch64-freebsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64[_be]-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-maccatalyst \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-macos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64[_be]-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          aarch64-windows \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          arm-freebsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          arm[eb]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          arm[eb]-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          arm-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          hexagon-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          loongarch32-linux \n          \ud83d\udda5\ud83d\udee0 \n          \u2705 \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          loongarch64-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          mips[el]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          mips[el]-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          mips64[el]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          mips64[el]-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc64[le]-freebsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          powerpc64[le]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          powerpc64-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv32-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          riscv32-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv64-freebsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv64-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          riscv64-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          riscv64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          s390x-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          sparc64-linux \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          thumb[eb]-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          wasm32-wasi \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86-linux \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86-openbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \ud83e\udea6 \n          x86-windows \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86_64-freebsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \ud83e\udea6 \n          x86_64-maccatalyst \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \ud83e\udea6 \n          x86_64-macos \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u26a0\ufe0f \n        \n        \n          2 \n          x86_64-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86_64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n        \n          2 \n          x86_64-windows \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u2705 \n        \n\n        \n          \n            \n          \n        \n\n        \n          3 \n          aarch64-haiku \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-ios \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-serenity \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-tvos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-visionos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          aarch64-watchos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          arm-haiku \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          mips64[el]-netbsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n          \u2705 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          riscv64-haiku \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          riscv64-serenity \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \ud83e\udea6 \n          thumb-windows \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          3 \n          wasm64-wasi \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u26a0\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \ud83e\udea6 \n          x86-freebsd \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c \n        \n        \n          3 \n          x86-haiku \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \ud83e\udea6 \n          x86-illumos \n          \ud83d\udda5\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-dragonfly \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-haiku \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-illumos \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          3 \n          x86_64-serenity \n          \ud83d\udda5\ufe0f\u26a1 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2705 \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n\n        \n          \n            \n          \n        \n\n        \n          4 \n          alpha-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          alpha-netbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          alpha-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          arc[eb]-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          csky-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa-netbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          hppa64-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u274c\ufe0f \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          m68k-linux \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          m68k-netbsd \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          m88k-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          microblaze[el]-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          or1k-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sh[eb]-linux \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sh[eb]-netbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sh-openbsd \n          \ud83d\udcc4 \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc-linux \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u2705 \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc-netbsd \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc64-netbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u26a0\ufe0f \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          sparc64-openbsd \n          \ud83d\udda5\ufe0f\ud83d\udee0\ufe0f \n          \u26a0\ufe0f \n          \u2705 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u2705 \n          \u274c\ufe0f \n        \n        \n          4 \n          xtensa[eb]-linux \n          \ud83d\udda5\ufe0f \n          \u274c\ufe0f \n          \u2754 \n          \u2705 \n          \u274c\ufe0f \n          \u274c \n          \u274c\ufe0f \n          \u274c\ufe0f \n        \n      \n    \n    \n\n    OS Version Requirements \u00a7\n\n    \n      The Zig standard library has minimum version requirements for some\n      supported operating systems, which in turn affect the Zig compiler itself:\n    \n\n    \n      \n        \n          OS\n          Version\n        \n      \n\n      \n        \n          Darwin\n          15.0+\n        \n        \n          DragonFly BSD\n          6.4+\n        \n        \n          FreeBSD\n          14.0+\n        \n        \n          Linux\n          5.10+\n        \n        \n          NetBSD\n          10.1+\n        \n        \n          OpenBSD\n          7.8+\n        \n        \n          Windows\n          10+\n        \n      \n    \n    \n\n    Additional Platforms \u00a7\n\n    \n      Zig also has varying levels of support for these targets, for which the\n      tier system does not quite apply:\n    \n\n    \n      aarch64-driverkit\n      aarch64[_be]-freestanding\n      aarch64-fuchsia\n      aarch64-hurd\n      aarch64-switch\n      aarch64-uefi\n      alpha-freestanding\n      amdgcn-amdhsa\n      amdgcn-amdpal\n      amdgcn-mesa3d\n      arc[eb]-freestanding\n      arm[eb]-freestanding\n      arm-3ds\n      arm-fuchsia\n      arm-gba\n      arm-uefi\n      arm-vita\n      avr-freestanding\n      bpf(eb,el)-freestanding\n      csky-freestanding\n      ez80-freestanding\n      ez80-tios\n      hexagon-freestanding\n      hppa[64]-freestanding\n      kalimba-freestanding\n      kvx-freestanding\n      lanai-freestanding\n      loongarch(32,64)-freestanding\n      loongarch(32,64)-uefi\n      m68k-freestanding\n      m88k-freestanding\n      microblaze[el]-freestanding\n      mips[64][el]-freestanding\n      mipsel-psx\n      mipsel-psp\n      msp430-freestanding\n      nvptx[64]-cuda\n      nvptx[64]-nvcl\n      or1k-freestanding\n      powerpc-wiiu\n      powerpc[64][le]-freestanding\n      powerpc64-ps3\n      propeller-freestanding\n      riscv(32,64)[be]-freestanding\n      riscv(32,64)-uefi\n      riscv64-fuchsia\n      riscv64-hurd\n      s390x-freestanding\n      sh[eb]-freestanding\n      sparc[64]-freestanding\n      spirv(32,64)-opencl\n      spirv(32,64)-opengl\n      spirv(32,64)-vulkan\n      spork8-freestanding\n      thumb[eb]-freestanding\n      thumb-fuchsia\n      thumb-gba\n      thumb-vita\n      ve-freestanding\n      wasm(32,64)-emscripten\n      wasm(32,64)-freestanding\n      x86[_16,_64]-freestanding\n      x86[_64]-hurd\n      x86[_64]-uefi\n      x86_64-driverkit\n      x86_64-fuchsia\n      x86_64-plan9\n      x86_64-ps4\n      x86_64-ps5\n      xcore-freestanding\n      xtensa[eb]-freestanding\n    \n    \n    \n\n    Language Changes \u00a7\n\n\n    Language Stability Progress \u00a7\n\n    Since the release of Zig 0.16.0, a lot of progress has been made towards stabilizing the\n    language. This is a key step in our roadmap, and a requirement before tagging\n    Zig 1.0.\n    In particular, since the last release, we have discussed and made decisions on many language\n    proposals\u2014accepting around 25 and rejecting around 125. At the time of writing, 23 undecided\n    language proposals remain open on the Codeberg issue tracker, and 61 undecided language\n    proposals remain open on the legacy GitHub issue tracker. Therefore, this effort represents a\n    significant step towards finalizing the language design (although\n    some\n    major\n    decisions\n    remain).\n    \n\n    @bitCast changes \u00a7\n\n    Zig 0.17.0 changes the definition of the @bitCast builtin.\n    In many cases, the new behavior is equivalent to the old: in particular, casting between an integer type and another integer type is unaffected, as is casting between an integer type and a packed struct or packed union.\n    However, the semantics of @bitCast calls involving array or vector types have changed. Unfortunately, this change has the potential to break existing code without triggering a compile error.. Therefore, it may be useful when upgrading to audit any @bitCast uses which involve array or vector types.\n    The new definition of @bitCast is that it reinterprets the logical bit representation of a value as a different type. The following types are considered to have logical bit representations:\n    \n      void\n      bool\n      integer types, except for comptime_int\n      floating-point types, except for comptime_float\n      integer-backed types enum(T), packed struct(T), and packed union(T)\n      arrays or vectors of any of these types\n    \n    For integer and floating-point types, the logical bit representation starts with the least-significant bit and ends with the most-significant bit. For array and vector types, all elements' logical bit representations are concatenated in order starting with the first element.\n    In practice, this means that the new @bitCast definition largely aligns with the old behavior on little-endian targets. Unlike the old behavior, the new behavior is fully endian-agnostic, i.e. the operation behaves the same regardless of the target endian.\n    The new @bitCast definition disallows casts between some types which were previously allowed. In particular, casts involving extern struct or extern union types are no longer permitted. In most cases, code which was using such casts is aiming to reinterpret the value's in-memory representation (sometimes called \"type punning\")\u2014to achieve this, use @ptrCast or an extern union.\n    bitcast_extern_struct.zigconst TwoBytes = extern struct {\n    b0: u8,\n    b1: u8,\n};\ntest \"type pun extern struct\" {\n    const bytes: TwoBytes = .{ .b0 = 0x12, .b1 = 0xAB };\n    const int: u16 = @bitCast(bytes);\n    switch (std.lang.Endian.native) {\n        .little => try expectEqual(0xAB_12, int),\n        .big => try expectEqual(0x12_AB, int),\n    }\n}\nconst std = @import(\"std\");\nconst expectEqual = std.testing.expectEqual;Shell$ zig test bitcast_extern_struct.zig\n/home/ci/.cache/act/4d2db5a0202099f4/hostexecutor/src/download/0.17.0/release-notes/bitcast_extern_struct.zig:7:31: error: cannot @bitCast from 'bitcast_extern_struct.TwoBytes'\n    const int: u16 = @bitCast(bytes);\n                              ^~~~~\n/home/ci/.cache/act/4d2db5a0202099f4/hostexecutor/src/download/0.17.0/release-notes/bitcast_extern_struct.zig:1:25: note: struct declared here\nconst TwoBytes = extern struct {\n                 ~~~~~~~^~~~~~\n\n\n    \u2b07\ufe0f\n    ptrcast_extern_struct.zigconst TwoBytes = extern struct {\n    b0: u8,\n    b1: u8,\n};\ntest \"type pun extern struct\" {\n    const bytes: TwoBytes = .{ .b0 = 0x12, .b1 = 0xAB };\n    const int_ptr: *align(1) const u16 = @ptrCast(&bytes);\n    switch (std.lang.Endian.native) {\n        .little => try expectEqual(0xAB_12, int_ptr.*),\n        .big => try expectEqual(0x12_AB, int_ptr.*),\n    }\n}\nconst std = @import(\"std\");\nconst expectEqual = std.testing.expectEqual;Shell$ zig test ptrcast_extern_struct.zig\n1/1 ptrcast_extern_struct.test.type pun extern struct...OK\nAll 1 tests passed.\n\n    \n\n    Formally Specified and Fuzzed Grammar \u00a7\n\n    Zig's formal grammar.peg and the actual language implementation did not agree in many places. Probably,\n    the formal grammar has never actually 100% matched the actual handwritten tokenizer and parser.\n\n    This problem is now fixed and unblocks future grammar changes and language specification work.\n\n    At a high level, the approach was to write a tool that accepts Zig's grammar.peg as input and outputs a\n    simple recursive descent parser. This generated parser is then used as an oracle for fuzz testing and the\n    handwritten std.zig.Ast.parse() is compared against it. This approach ensures a\n    single source of truth and allows for easy iteration as the grammar changes.\n\n    More details: #36094\n    \n\n    C Translation Moving to External Package \u00a7\n\n    @cImport\n    was deprecated in Zig 0.16.0 and is now removed. Furthermore, in this release\n    std.Build.Step.TranslateC is deprecated in favor of an explicit package dependency on\n    official ZSF translate-c package, which is the same\n    implementation the build step provides, but offers\n    more configuration options for the\n    translated code, and has an independent release cadence from the main Zig toolchain.\n\n    Upgrade guide:\n\n    zig fetch --save git+https://codeberg.org/ziglang/translate-c\n\n    --- a/build.zig\n+++ b/build.zig\n@@ -1,16 +1,19 @@\n const std = @import(\"std\");\n+const Translator = @import(\"translate_c\").Translator;\n \n pub fn build(b: *std.Build) void {\n     const target = b.standardTargetOptions(.{});\n     const optimize = b.standardOptimizeOption(.{});\n \n-    const translate_c = b.addTranslateC(.{\n-        .root_source_file = b.path(\"src/c.h\"),\n+    const translate_c = b.dependency(\"translate_c\", .{});\n+\n+    const translator: Translator = .init(translate_c, .{\n+        .c_source_file = b.path(\"src/c.h\"),\n         .target = target,\n         .optimize = optimize,\n+ // additional options now available that go here:\n+ // https://codeberg.org/ziglang/translate-c#options\n     });\n-    translate_c.linkSystemLibrary(\"glfw\", .{});\n-    translate_c.linkSystemLibrary(\"epoxy\", .{});\n+    translator.linkSystemLibrary(\"glfw3\", .{});\n+    translator.linkSystemLibrary(\"epoxy\", .{});\n \n     const exe = b.addExecutable(.{\n         .name = \"tetris\",\n@@ -21,7 +24,7 @@ pub fn build(b: *std.Build) void {\n             .imports = &.{\n                 .{\n                     .name = \"c\",\n-                    .module = translate_c.createModule(),\n+                    .module = translator.mod,\n                 },\n             },\n         }),\n\n\n    \n\n    Added @backingInt and @fromBackingInt \u00a7\n\n    The @backingInt and @fromBackingInt builtins are new.\n    These builtins replace the now-deprecated @intFromEnum and\n    @enumFromInt builtins (#35966).\n\n    @backingInt works with all enums and with bitpacks with explicit backing\n    integer types only. It also works with tagged unions, returning the backing\n    integer of the active tag value.\n    An undefined enum or bitpack yields an undefined backing integer.\n    \n\n    @fromBackingInt infers its result type, which may be any enum or a bitpack with an\n    explicit backing integer type. It takes a parameter of exactly that backing integer type. For enums,\n    passing a backing integer that is either undefined or would yield an invalid tag\n    value results in safety-checked Illegal Behavior. For bitpacks, passing an undefined\n    backing integer yields an undefined bitpack.\n\n    @bitCast now also performs a safety check for invalid tag values if its\n    destination type is an enum.\n\n    Also adds a std.meta.BackingInt function to get the result\n    type of @backingInt.\n\n    Zig now requires empty enums to have noreturn as their backing integer because\n    they are uninstantiable.\n\n    Upgrade example:\n\n    --- a/lib/std/Build.zig\n+++ b/lib/std/Build.zig\n@@ -145,7 +145,7 @@ pub const Graph = struct {\n \n     pub fn addGeneratedFile(graph: *Graph, owner: *Step) Configuration.GeneratedFileIndex {\n         graph.generated_files.append(graph.arena, owner) catch @panic(\"OOM\");\n-        return @enumFromInt(graph.generated_files.items.len - 1);\n+        return @fromBackingInt(@intCast(graph.generated_files.items.len - 1));\n     }\n \n     pub fn dupeString(graph: *const Graph, bytes: []const u8) []const u8 {\n@@ -2607,7 +2607,7 @@ pub const LazyPath = union(enum) {\n             .src_path, .cwd_relative, .relative, .dependency => {},\n             .generated => |gen| {\n                 const graph = other_step.owner.graph;\n-                const generated_owner_step = graph.generated_files.items[@intFromEnum(gen.index)];\n+                const generated_owner_step = graph.generated_files.items[@backingInt(gen.index)];\n                 other_step.dependOn(generated_owner_step);\n             },\n         }\n\n\n    zig fmt automatically performs this upgrade.\n    \n\n    Added @SpirvType \u00a7\n\n    SPIR-V has a number of types, such as images and samplers, that have no equivalent in Zig's type\n    system. Previously, the only way to refer to one of them was through inline assembly, which made it\n    impossible to declare a texture or a storage buffer as an ordinary global variable. Zig 0.17.0\n    implements accepted proposal #35240,\n    adding the @SpirvType builtin alongside the other type-creating builtins:\n    sample_code@SpirvType(comptime options: std.lang.Type.Spirv) type\n    \n      .sampler creates an OpTypeSampler.\n      .image creates an OpTypeImage.\n      .sampled_image creates an OpTypeSampledImage from an image\n      type whose usage is .sampled.\n      .runtime_array creates an OpTypeRuntimeArray.\n      It supports indexing and exposes a len field just like the array type.\n    \n    Using this builtin when not targeting SPIR-V is a compile error. The options are also validated\n    against the target OS.\n    spirv_type.zigconst std = @import(\"std\");\n\nconst Image = @SpirvType(.{ .image = .{\n    .usage = .{ .sampled = f32 },\n    .format = .unknown,\n    .dim = .@\"2d\",\n    .depth = .not_depth,\n    .arrayed = false,\n    .multisampled = false,\n    .access = .unknown,\n} });\nconst SampledImage = @SpirvType(.{ .sampled_image = Image });\n\nconst texture = @extern(*addrspace(.constant) const SampledImage, .{\n    .name = \"texture\",\n    .decoration = .{ .descriptor = .{ .set = 0, .binding = 0 } },\n});\nconst uv_in = @extern(*addrspace(.input) const @Vector(2, f32), .{\n    .name = \"uv\",\n    .decoration = .{ .location = 0 },\n});\nconst color_out = @extern(*addrspace(.output) @Vector(4, f32), .{\n    .name = \"color\",\n    .decoration = .{ .location = 0 },\n});\n\nexport fn main() callconv(.{ .spirv_fragment = .{} }) void {\n    color_out.* = std.spirv.imageSampleImplicitLod(texture, uv_in.*);\n}Shell$ zig build-obj spirv_type.zig -target spirv32-vulkan\n\n    \n\n    Array Multiplication Syntax Removed \u00a7\n\n    Array multiplication syntax (a ** b) has been removed in favor of\n    @splat.\n    Migration:\n    --- a/player/chromaprint.zig\n+++ b/player/chromaprint.zig\n@@ -35,7 +35,7 @@ pub const Chroma = struct {\n     const max_index = @min(window_size / 2, freqToIndex(max_freq));\n     const notes: [window_size]u8 = n: {\n         @setEvalBranchQuota(window_size);\n-        var result = [1]u8{0} ** window_size;\n+        var result: [window_size]u8 = @splat(0);\n         for (min_index..max_index) |i| {\n             const freq = indexToFreq(i);\n             const octave = freqToOctave(freq);\n@@ -123,7 +123,7 @@ const RollingIntegralImage = struct {\n     num_rows: u32,\n \n     pub const init: RollingIntegralImage = .{\n-        .data = [1]Float{0} ** data_size,\n+        .data = @splat(0),\n         .num_rows = 0,\n     };\n\n    \n\n    Added @divCeil \u00a7\n\n    The new @divCeil builtin performs integer division rounded toward positive\n    infinity, complementing the existing @divTrunc, @divFloor,\n    and @divExact builtins.\n\n    sample_code@divCeil(5, 3) == 2\n@divCeil(-5, 3) == -1\n\n    As with the other division builtins, caller guarantees that denominator != 0 and\n    that result does not overflow.\n\n    No more std.math.divCeil(a, b) catch unreachable!\n    \n\n    @hasDecl Returns true Only for Public Declarations \u00a7\n\n    Previously, @hasDecl returned true for public declarations\n    and declarations in the same file. Now, the behavior is the same independently of which file\n    @hasDecl is in.\n    hasdecl.zigconst std = @import(\"std\");\n\nconst Foo = struct {\n    bar: i32,\n\n    const baz = 1;\n    pub var quux = \"xxx\";\n};\n\ntest \"@hasDecl example\" {\n    try std.testing.expect(!@hasDecl(Foo, \"bar\"));\n    try std.testing.expect(!@hasDecl(Foo, \"baz\")); // different in 0.17.0\n    try std.testing.expect(@hasDecl(Foo, \"quux\"));\n}Shell$ zig test hasdecl.zig\n1/1 hasdecl.test.@hasDecl example...OK\nAll 1 tests passed.\n\n    \n\n    Allow Dereference and Coercion to Array Pointer of comptime Length Slices \u00a7\n\n    Now allowed:\n    sample_codeconst slice: []const u16 = &.{ 1, 2, 3 };\nconst array: [3]u16 = slice.*;\nconst array_ptr: *const [3]u16 = slice;\n    \n\n    void{} Syntax Removed \u00a7\n\n    void{} is no longer valid syntax. Use {} instead (#15213).\n    \n\n    errdefer Capture Removed \u00a7\n\n    sample_codeerrdefer |err| {\n    // `err` was the error being returned; you could do stuff with it!\n    // Like a normal `defer/`errdefer`, you can't `return` or `try` in this block, so you can't change\n    // which error is returned; but you can e.g. log it\n}\n    The capture (|err|) is no longer allowed (#23734).\n    To migrate, split the function into two:\n    fn processOneTarget(job: Job) void {\n-    errdefer |err| std.debug.panic(\"panic: {s}\", .{@errorName(err)});\n+    processOneTargetInner(job) catch |err| std.debug.panic(\"panic: {s}\", .{@errorName(err)});\n+}\n+fn processOneTargetInner(job: Job) !void {\n     const target = job.target;\n\n    \n\n    i0 Removed \u00a7\n\n    i0 is no longer an allowed primitive integer type.\n    This type was nonsensical, so does not have a direct alternative. However, any uses of it can almost certainly be transparently replaced with u0.\n    \n\n    internal and link_once Global Linkage Removed \u00a7\n\n    The internal and link_once tags of\n    std.lang.GlobalLinkage have been removed as they had unclear semantics and\n    incomplete support in codegen and linking (#36956). Any use of link_once is likely served by\n    weak, while the replacement for internal is to simply not\n    @export the symbol in the first place.\n    \n\n    \n\n    Standard Library \u00a7\n\n    \n      Added f128 support for @exp and\n      @exp2 based on \"Table-Driven Implementation of the Exponential Function in IEEE\n      Floating-Point Arithmetic\" by Ping Tak Peter Tang, adapted to work with 128-bit numbers (#31846).\n      Added std.Io.Semaphore.waitTimeout (#31924).\n      Added std.spirv helpers for sampling, querying, and writing images\n      (#36187).\n\n      ArrayHashMap.setKey no longer recomputes the entire index (#32136).\n      std.Target.parseCpuModel now returns optional rather than error.\n      std.debug.Pdb: deduplicate inline source locations (#35438).\n      hash.crc full namespace audit (#35952).\n      std.fs.path add appending variants for relative and\n      resolve (#36784).\n    \n\n    Deprecations \u00a7\n\n    \n      std.heap.memory_pool.AlignedManaged removed in favor of\n      std.heap.memory_pool.Aligned.\n      std.heap.memory_pool.ExtraManaged removed in favor of\n      std.heap.memory_pool.Extra.\n      Deprecated std.builtin in favor of std.lang.\n      Deprecated std.meta.fieldInfo in favor of @typeInfo.\n      Deprecated std.meta.fieldNames in favor of @typeInfo.\n      Deprecated std.meta.fieldTypes in favor of @typeInfo.\n      Deprecated std.DoublyLinkedList.pop in favor of\n      std.DoublyLinkedList.popLast.\n      Renamed std.gpu to std.spirv.\n      Removed std.ascii.indexOfIgnoreCase in favor of std.ascii.findIgnoreCase.\n      Removed std.ascii.indexOfIgnoreCasePos in favor of std.ascii.findIgnoreCasePos.\n      Removed std.ascii.indexOfIgnoreCasePosLinear in favor of std.ascii.findIgnoreCasePosLinear.\n      Removed std.bit_set.Integer.initEmpty in favor of std.bit_set.Integer.empty.\n      Removed std.bit_set.Integer.initFull in favor of std.bit_set.Integer.full.\n      Removed std.bit_set.Array.initEmpty in favor of std.bit_set.Array.empty.\n      Removed std.bit_set.Array.initFull in favor of std.bit_set.Array.full.\n      Removed std.enums.EnumSet.initEmpty in favor of std.enums.EnumSet.empty.\n      Removed std.enums.EnumSet.initFull in favor of std.enums.EnumSet.full.\n      Removed std.mem.containsAtLeastScalar2 in favor of std.mem.containsAtLeastScalar.\n      Removed std.mem.readPackedIntNative in favor of std.mem.readPackedInt.\n      Removed std.mem.readPackedIntForeign in favor of std.mem.readPackedInt.\n      Removed std.mem.writePackedIntNative in favor of std.mem.writePackedInt.\n      Removed std.mem.writePackedIntForeign in favor of std.mem.writePackedInt.\n    \n    \n\n    StackFallbackAllocator Reworked \u00a7\n\n    StackFallbackAllocator is an abstraction that is useful for the \"small\n    vec\" optimization, in which common cases can fit on a pre-allocated stack buffer, but rare cases\n    need dynamic heap allocation. The previous design had a few problems:\n    \n    There was no way to specify the alignment of the buffer.\n    It was generic over the size of the buffer.\n    Calling .allocator().get() mutated the type, unlike all other allocators,\n    requiring a runtime safety check.\n    \n    Now, the buffer is provided as an argument, like most other std APIs that need a buffer.\n    Migration guide:\n    sample_codevar stack align(@max(\n    @alignOf(std.heap.StackFallbackAllocator(0)),\n    @alignOf(Item)),\n) = std.heap.stackFallback(@sizeOf(Item), self.gpa);\nconst allocator = stack.get();\n    \u2b07\ufe0f\n    sample_codevar stack_buf: [1]Item = undefined;\nvar stack: std.heap.StackFallbackAllocator = .init(@ptrCast(&stack_buf), gpa);\nconst allocator = stack.allocator();\n    \n\n    SafeAllocator Introduced \u00a7\n\n    std.heap.DebugAllocator is replaced by a thread-safe allocator with the following\n    guarantees:\n    \n    deinit reports all leaks and frees all backing memory.\n    All allocation mismatches result in either a panic or segmentation fault.\n    Allocations from other SafeAllocator instances cause a panic (if\n    Options.canary differ).\n    Double frees and operation (resize, remap, and free) races panic or segmentation fault.\n    \n    Given the backing allocator does not reuse memory, it does not reuse memory either and\n    most writes after free will segmentation fault or are eventually detected and panic.\n    std.heap.DebugAllocator and std.heap.Check are\n    deprecated.\n\n    Every allocation is trailed by an AllocFooter which contains metadata for the\n    allocation and stack traces. It is protected by a checksum to catch corruption from allocation overwrites\n    and report canary mismatches. An allocation's memory has a minimum alignment of\n    AllocFooter so that the footer is at a fixed offset determined from the allocation\n    size. An allocation's memory is stored either:\n    \n    Inside linearly-filled buckets for small allocations.\n    Inside an allocation directly from the backing allocator.\n    \n    To track allocations, each thread maintains a table of backing allocations. The table may be modified by\n    other threads in the case of a producer-consumer operation, so the table is a linked list only expanded by\n    creating new segments. Each thread maintains a linked list of free entries, which may contain entries from\n    other threads' tables.\n    In the case of producer-consumer operations, acquire/release ordering is assumed to be provided\n    externally. This is also assumed by all other thread-safe allocators that reuse memory as otherwise there\n    would be data races on reuse of allocated memory.\n\n    Two fuzz tests have also been added for the allocator. They check that there is no memory reuse, that\n    returned memory is writable, and that it is not overwritten. The multi-threaded fuzz test spawns a number\n    of worker threads which are used for all the test runs. I have run these tests extensively under TSAN.\n\n    Building the standard library tests with an -Osafe compiler build and\n    -Ddebug-allocator:\nBenchmark 1 (3 runs): ./master-out/bin/zig test --zig-lib-dir lib lib/std/std.zig -femit-bin=test --test-no-exec\n  measurement          mean \u00b1 \u03c3            min \u2026 max           outliers         delta\n  wall_time          29.4s  \u00b1  157ms    29.2s  \u2026 29.5s           0 ( 0%)        0%\n  peak_rss           2.24GB \u00b1 3.49MB    2.23GB \u2026 2.24GB          0 ( 0%)        0%\n  cpu_cycles          143G  \u00b1  999M      142G  \u2026  144G           0 ( 0%)        0%\n  instructions        268G  \u00b1 5.22M      268G  \u2026  268G           0 ( 0%)        0%\n  cache_references   13.1G  \u00b1 88.8M     13.0G  \u2026 13.2G           0 ( 0%)        0%\n  cache_misses       2.38G  \u00b1 30.7M     2.35G  \u2026 2.41G           0 ( 0%)        0%\n  branch_misses       634M  \u00b1 6.22M      629M  \u2026  641M           0 ( 0%)        0%\nBenchmark 2 (3 runs): ./branch-out/bin/zig test --zig-lib-dir lib lib/std/std.zig -femit-bin=test --test-no-exec\n  measurement          mean \u00b1 \u03c3            min \u2026 max           outliers         delta\n  wall_time          22.1s  \u00b1 88.6ms    22.0s  \u2026 22.2s           0 ( 0%)        \u26a1- 24.7% \u00b1  1.0%\n  peak_rss           1.11GB \u00b1  799KB    1.11GB \u2026 1.11GB          0 ( 0%)        \u26a1- 50.3% \u00b1  0.3%\n  cpu_cycles          136G  \u00b1  480M      136G  \u2026  137G           0 ( 0%)        \u26a1-  4.4% \u00b1  1.2%\n  instructions        273G  \u00b1 2.07M      273G  \u2026  273G           0 ( 0%)        \ud83d\udca9+  1.6% \u00b1  0.0%\n  cache_references   12.3G  \u00b1 71.3M     12.2G  \u2026 12.4G           0 ( 0%)        \u26a1-  6.0% \u00b1  1.4%\n  cache_misses       2.02G  \u00b1 11.5M     2.01G  \u2026 2.03G           0 ( 0%)        \u26a1- 14.9% \u00b1  2.2%\n  branch_misses       569M  \u00b1 2.65M      567M  \u2026  572M           0 ( 0%)        \u26a1- 10.2% \u00b1  1.7%\n    \n\n    ArrayList \u00a7\n\n    \n    getLastOrNull has been deprecated and renamed to last\n    getLast has been deprecated in favor of last combined\n    with .?\n    lastPtr has been added which returns ?*T\n    \n    Upgrade guide:\n    sample_codeif (list.getLastOrNull()) |foo| {\n    // ...\n}\nconst foo = list.getLast();\n    \u2b07\ufe0f\n    sample_codeif (list.last()) |foo| {\n    // ...\n}\nconst foo = list.last().?;\n\n    ArrayList Pointer Stability \u00a7\n\n    \n    This is an enhancement that can help track down ArrayList usage bugs faster (#36239).\n    \n    Devlog Entry\n    \n    \n    \n\n    debug.SafetyLock Gains Support for Shared Locking \u00a7\n\n    The existing lock and unlock methods continue to act\n    exclusively. They should be used when data may be mutated. New methods, lockShared\n    and unlockShared, may be used for shared locking in situations where multiple\n    independent users are reading but not mutating data.\n    \n\n    fmt.allocPrint moved to mem.Allocator \u00a7\n\n    sample_codetry std.fmt.allocPrint(arena, \"{s}={d}\", .{ x, y });\n    \u2b07\ufe0f\n    sample_codetry arena.print(\"{s}={d}\", .{ x, y });\n    \n\n    Formatted Printing Enhancements \u00a7\n\n    The \"{q}\" specifier which escapes strings so that they can appear in\n    double-quoted string literals has relaxed escaping rules such that UTF-8 encoded data can pass through\n    unmangled.\n\n    \"{qf}\" is introduced for double-quote escaping the output of\n    a format().\n    \n\n    std.zon.parse Reworked \u00a7\n\n    std.zon.parse now takes struct args and allocates its result from an arena.\n    Migration guide:\n    sample_codevar diag: Diagnostics = .{};\ndefer diag.deinit(gpa);\nconst result = std.zon.fromSlice(\n    MyZonType,\n    gpa,\n    source,\n    &diag,\n    .{},\n) catch |err| switch (err) {\n    error.ParseZon => std.process.fatal(\"input.zon: {f}\", .{diag}),\n    error.OutOfMemory => |e| return e,\n};\ndefer std.zon.parse.free(result);\n    \u2b07\ufe0f\n    sample_codevar diag: Diagnostics = undefined;\nconst result = std.zon.fromSlice(MyZonType, .{\n    .gpa = gpa,\n    .arena = arena,\n    .source = source,\n    .diagnostics = &diag,\n}) catch |err| switch (err) {\n    error.ParseZon => diag.fatal(\"input.zon\"),\n    error.OutOfMemory => |e| return e,\n}\n\n    Some methods were renamed:\n\n    \n    fromSliceAlloc \u27a1\ufe0f fromSlice\n    fromSlice \u27a1\ufe0f fromSliceNoAlloc\n    The other \"from\" methods were renamed following this same scheme.\n    \n    \"updateFrom\" variants such as updateFromSlice were added. These update an in\n    memory value, overwriting the value's fields with fields specified in the ZON source. This can be useful\n    when using ZON to load configuration files with varying precedence, for example a text editor that has a\n    global config file and a per-project config file.\n    \n\n    Rename bit_set Variants and Deprecate the Managed One \u00a7\n\n    Renames the types for consistency, deprecating the previous names and the managed variant.\n    \n    std.bit_set.IntegerBitSet \u27a1\ufe0f std.bit_set.Integer\n    std.bit_set.ArrayBitSet \u27a1\ufe0f std.bit_set.Array\n    std.StaticBitset, std.bit_set.StaticBitSet \u27a1\ufe0f\n    std.bit_set.Static\n    std.DynamicBitSetUnmanaged,\n    std.bit_set.DynamicBitSetUnmanaged \u27a1\ufe0f std.bit_set.Dynamic\n    std.DynamicBitSet, std.bit_set.DynamicBitSet \u27a1\ufe0f\n    std.bit_set.DynamicManaged (deprecated)\n    \n    \n\n    Struct-Of-Arrays Style for std.lang.Type \u00a7\n\n    When doing type reflection, structs and unions return their information in struct-of-arrays style\n    (#35234).\n    --- a/lib/compiler/Maker/ScannedConfig.zig\n+++ b/lib/compiler/Maker/ScannedConfig.zig\n@@ -49,9 +49,10 @@ pub fn print(sc: *const ScannedConfig, w: *Writer) Writer.Error!void {\n }\n \n fn printStruct(sc: *const ScannedConfig, s: *Serializer.Struct, comptime S: type, v: S) !void {\n-    inline for (@typeInfo(S).@\"struct\".fields) |field| {\n-        try s.fieldPrefix(field.name);\n-        try printValue(sc, s.container.serializer, field.type, @field(v, field.name));\n+    const info = @typeInfo(S).@\"struct\";\n+    inline for (info.field_names, info.field_types) |field_name, field_type| {\n+        try s.fieldPrefix(field_name);\n+        try printValue(sc, s.container.serializer, field_type, @field(v, field_name));\n     }\n }\n\n    \n\n    Rename lang.OptimizeMode to lang.Optimize \u00a7\n\n    And remove \"release\" from the enum tag names.\n    No functional change, however, despite the addition of backwards-compatibile declarations in this patch,\n    it is breaking because expressions that use == or !=\n    operators will not able to use the deprecated names.\n    \n    std.lang: OptimizeMode \u27a1\ufe0f  Optimize\n      \n      Debug \u27a1\ufe0f- debug\n      ReleaseSafe \u27a1\ufe0f- safe\n      ReleaseFast \u27a1\ufe0f- fast\n      ReleaseSmall \u27a1\ufe0f- small\n      \n    \n    \n\n    lang.Optimize.runtimeSafety \u00a7\n\n    std.lang.Optimize.runtimeSafety is preferred as an alternative to\n    std.debug.runtime_safety since it will offer callsites knowledge about their own\n    module rather than standard library module.\n    \n\n    @import(\"builtin\") Deprecations \u00a7\n\n    The redundant constants cpu, os,\n    abi, and object_format in\n    @import(\"builtin\") have been\n    deprecated and will be removed in 0.18.0. Please replace any usage with the corresponding fields on the\n    target constant:\n    \n    @import(\"builtin\").cpu \u27a1\ufe0f @import(\"builtin\").target.cpu\n    @import(\"builtin\").os \u27a1\ufe0f @import(\"builtin\").target.os\n    @import(\"builtin\").abi \u27a1\ufe0f @import(\"builtin\").target.abi\n    @import(\"builtin\").object_format \u27a1\ufe0f @import(\"builtin\").target.ofmt\n    \n    \n    Handle Floats Correctly in mem.eql and mem.findDiff \u00a7\n\n    The functions std.mem.eql and std.mem.findDiff\n    short-circuit when their two inputs are slices to the same memory. This short-circuiting is only correct\n    when the == operator, for the given type, is reflexive. This isn't the case for\n    floats, as for example std.math.nan(f64) != std.math.nan(f64). The change in this PR\n    disables that optimisation when working on float slices.\n\n    Previously-failing, now-succeeding tests:\n    sample_codeconst x: [3]f64 = .{ 42.0, std.math.nan(f64), 3.1415 };\ntry std.testing.expect(!std.mem.eql(f64, &x, &x));\ntry std.testing.expectEqual(1, std.mem.findDiff(f64, &x, &x));\n    \n\n    Decouple Uri and net.HostName \u00a7\n\n    Uri was sometimes using HostName.validate for host (in resolveInPlace) and sometimes not (in\n    parseAfterScheme). On its own, this was a problem, but the bigger problem is that RFC3986 (Uri) has a much\n    different idea of what a valid host name is than RFC1123 (HostName), and so just making Uri consistently\n    use HostName.validate would make Uri less useful overall.\n\n    Instead, all HostName-related stuff has been removed from\n    Uri. Uri.getHost has been moved to\n    HostName.fromUri (without a graceful deprecation, since the semantics are different enough for users to\n    need to evaluate usage sites), while Uri.getHostAlloc has been removed entirely.\n\n    Migration guide:\n\n    sample_codevar host_buf: [HostName.max_len]u8 = undefined;\nconst host = try uri.getHost(&host_buf);\n    \u2b07\ufe0f \n    sample_codevar host_buf: [HostName.max_len]u8 = undefined;\n// note: the error set is different than it was before since fromUri does validation\nconst host = try HostName.fromUri(uri, &host_buf);\n    #36036\n    \n\n    \n\n    Build System \u00a7\n\n    \n    b.build_root (Directory) \u27a1\ufe0f b.root (Path)\n    ConfigHeader.Options: include_guard_override \u27a1\ufe0f\n    include_guard\n    LazyPath: getDisplayName \u27a1\ufe0f format\n    (\"{f}\")\n    LazyPath.basename: removed since the value is not known until make phase\n    b.findProgram divided into findProgram and\n    findProgramLazy and API future-proofed.\n    ConfigHeader fixed; now reports unused values for all styles\n    addArtifactArg, addPrefixedArtifactArg \u27a1\ufe0f  addArtifactArg2\n    addOutputFileArg, addPrefixedOutputFileArg \u27a1\ufe0f addOutputFileArg2\n    addFileContentArg, addPrefixedFileContentArg \u27a1\ufe0f addFileContentArg2\n    addOutputDirectoryArg, addPrefixedOutputDirectoryArg \u27a1\ufe0f addOutputDirectoryArg2\n    addDirectoryArg, addPrefixedDirectoryArg, addDecoratedDirectoryArg \u27a1\ufe0f addDirectoryArg2\n    addDepFileOutputArg, addPrefixedDepFileOutputArg \u27a1\ufe0f addDepFileOutputArg2\n    addFileArg, addPrefixedFileArg \u27a1\ufe0f addFileArg2\n    \n\n    Separate the Maker Process from the Configurer Process \u00a7\n\n    zig build now runs projects' build.zig code in a separate executable than the\n    one that performs Package Management and executes the build graph, making \n    zig build faster for several reasons\n    (#35428):\n    \n    The maker executable remains unmodified when build.zig script is edited,\n    and therefore only needs to be built exactly once (\"first time setup\") after installing Zig.\n    The maker executable is built with optimizations enabled, which is starting to become\n    more valuable now that we have introduced --watch and --fuzz.\n    build.zig logic can be skipped sometimes depending on what CLI flags are used with\n    zig build.\n    \n    Furthermore, configuration is now serialized into a compact binary format that can be\n    consumed by third party tooling and is part of the new Build Server Protocol. The prior\n    way of satisfying this use case by forking the build runner is\n    no longer supported.\n    To render configuration as .zon to stdout, pass --print-configuration.\n    \n\n    Cache System Reworked \u00a7\n\n    New features:\n    \n    Directory support. Ability for entries added, removed, or renamed in directories to cause a cache\n    miss.\n    Metadata mode. Normally, only changed contents causes a cache miss. In metadata mode, when size, inode,\n    or mtime changes, it always causes a cache miss independent of contents.\n    \n    All four combinations are possible (is_directory=true/false, metadata_mode=true/false). These features\n    are exposed as new API in the Build System.\n    Since the Zig toolchain is heavily reliant on the caching system, this release also switches to a\n    binary format, saving roughly 25% on file size, which eases a bit of pressure on the file system cache\n    while also simplifying the work the computer needs to do - directly copy bytes from disk rather than\n    parsing text files. The new zig cache-cat subcommand is available for troubleshooting or\n    tinkering with files inside a zig-cache directory.\n    The cache system also now has the capability to explain why a \"miss\" happened. The public-facing API of\n    std.Build.Cache has many breaking changes, but outside of compiler tooling, this is\n    an uncommon API to be used, and all the changes make it harder to misuse.\n    This change has been observed to speed up cache hits by 5-10% (#36822).\n    \n\n    Introduce the Concept of Configure Cache Poisoning \u00a7\n\n    If the cache is poisoned means that the configure logic had side effects, or otherwise\n    did something that could not be tracked by the cache system.\n\n    This is not to be confused with whether individual steps may have side effects when being evaluated; it\n    has to do with the logic inside build.zig itself. For example, a Run step that\n    prints \"hello world\" has side effects at make time and therefore does not warrant setting this flag,\n    while checking for the existence of scdoc at configure time in order to choose the default\n    value for a configuration option does.\n\n    Keeping the cache pure will make zig build faster, bypassing the configurer process when\n    identical configuration would be generated.\n\n    When the cache is poisoned, the maker process will delete the build configuration file upon ingesting it\n    since it cannot be reused.\n\n    Ways to poison the cache include calling findProgram, or more directly\n    std.Build.Graph.poisonCache. A better alternative than cache poisoning is to\n    explicitly declare the configuration dependencies with these new functions:\n    \n      std.Build.dependOnFileContents - indicates that the build.zig logic depends on a particular file's contents.\n      std.Build.dependOnFileMetadata - indicates that the build.zig logic depends on a particular file's size, inode, mtime, and contents.\n      std.Build.dependOnDirectoryContents - indicates that the build.zig logic depends on a particular directory's entries.\n      std.Build.dependOnDirectoryMetadata - indicates that the build.zig logic\n      depends on a particular directory's last modification date.\n    \n\n    Advanced users can override the cache poisoning behavior with a new CLI option:\n\n      --cache-poison[=mode]        Override configuration caching behavior\n      pure                     (default) Avoid false positive cache hits\n      poisoned                 Don't cache the configuration\n      disallowed               Panics when cache would be poisoned\n      ignored                  A little poison never hurt anybody\n    \n\n    findProgram \u00a7\n\n    Immediately (in the configure phase), searches for an executable on the host that has more than one\n    possible name.\n    Names are searched in order, observing search prefixes first and then PATH environment variable.\n    Calling this function poisons the configuration cache, so it is only appropriate when the existence of\n    the program or its output needs to be observed by configuration logic. That's why there is also\n    findProgramLazy now.\n    \n\n    findProgramLazy \u00a7\n\n    Creates an anonymous Step that searches for an executable on the host that\n    has more than one possible name.\n\n    Unlike findProgram, this function does not\n    poison the configuration cache, however\n    the result cannot be used in the configuration phase, hence the return type being\n    LazyPath.\n\n    Returns the LazyPath of the found executable. The search only takes place\n    if the LazyPath will be used by a depending Step.\n\n    This API is useful in the following cases:\n    \n     The binary is not named the same across all systems (for example \"python\"\n      vs \"python3\").\n     The binary may be produced by building from source rather than being\n      globally installed and will therefore be possibly found in one of the\n      search prefix paths.\n    \n    \n\n    Run Step: Passthru Args \u00a7\n\n    In the Run step, passthru args are all together now, not observable in\n    configure phase whether run args are provided.\n    --- build.zig\n+++ build.zig\n@\n-if (b.args) |args| {\n-    run_cmd.addArgs(args);\n-}\n+run_cmd.addPassthruArgs();\n\n    This removes a capability from build scripts since they can no longer observe those arguments. In\n    exchange, it means that when changing those arguments, build scripts no longer must be rebuilt from\n    source.\n    \n\n    Fmt Step: Options \u00a7\n\n    paths and exclude_paths are now\n    LazyPath lists. There is a convenience method to create them:\n    b.pathList.\n    --- build.zig\n+++ build.zig\n@\n-    const fmt_include_paths = &.{ \"lib\", \"src\", \"test\", \"tools\", \"build.zig\", \"build.zig.zon\" };\n-    const fmt_exclude_paths = &.{ \"test/cases\", \"test/behavior/zon\" };\n+    const fmt_include_paths = b.pathList(&.{ \"lib\", \"src\", \"test\", \"tools\", \"build.zig\", \"build.zig.zon\" });\n+    const fmt_exclude_paths = b.pathList(&.{ \"test/cases\", \"test/behavior/zon\" });\n\n    \n\n    Step.Options: add addOptionPathDirectory \u00a7\n\n    Now, when adding an option that is a file path, one must explicitly choose between (#36876):\n    \n    addOptionPath (must be a file)\n    addOptionPathDirectory (must be a directory)\n    addOptionPathUntracked (opt out of dependency tracking)\n    \n    \n\n    Lazy Dependency Ergonomic Enhancements \u00a7\n\n    \n    Log when lazy dependencies are fetched.\n    std.Build.dependency: support lazy dependencies\n    Introduce std.Build.dependencyLazy which possibly returns\n    error.LazyDependencyNeeded instead of null, so that you can\n    use try\n    When user build functions return\n    error.LazyDependencyNeeded, build system proceeds to fetch them rather than failing\n    configuration.\n    \n    \n\n    Removed Ability to Override Build Runner \u00a7\n\n    There is no concept of a \"build runner\" any more; it has been\n    split into: configurer and maker\n    This use case is now handled by the Build Server Protocol.\n    \n\n    Package Management \u00a7\n\n    All package management functionality has been moved out of the Compiler and into the\n    Build System. This includes the following sub-commands:\n    \n      zig build\n      zig fetch\n      zig init\n      zig libc \n      zig cache-cat \n    \n    This means that large parts of what used to be included in the compiler executable are now shipped in\n    source form instead, including:\n    \n    package fetching logic\n    http client and networking\n    TLS (Transport Layer Security) and associated crypto\n    git protocol\n    xz, gzip, zstd, flate, zip\n    parsing, validation, and otherwise dealing with build.zig.zon files\n    \n    All of this functionality is now compiled in -Osafe\n    optimization mode rather than -Ofast due to being in the compiler. When hacking on\n    the build system itself, the environment variable ZIG_DEBUG_CMD=1 may be used to\n    compile the build system in debug mode instead.\n\n    Miscellaneous changes:\n    \n    Bug fix: reject path deps that escape the parent package root.\n    \n    Ability to Override Package Path \u00a7\n\n    --pkg-path CLI arg and ZIG_LOCAL_PKG_DIR env var are now observed for both\n    fetch and build commands.\n    \n\n    Global vs Local Fetching \u00a7\n\n    Now zig fetch only fetches into the global cache, just like it used to. However, if\n    --save (or any variant) is used, then it also fetches into the local package path. When\n    fetching globally, does not require build.zig to be present. zig build always\n    fetches locally (in addition to globally).\n    Notably, this fixes the regressed use case zig fetch .\n    When fetching by path, the hash is always computed, recompressed tarball is always created, always\n    overwrites any existing global cache entry.\n    \n    \n\n    Slight Difference in PATH for DLL Arguments \u00a7\n\n    It used to be the case that, when targeting Windows or Wine, artifact args added to Run steps modified\n    PATH based on the set of directories containing the recursive set of DLL dependencies. Now this is only\n    done for argv[0]. The motivation for also doing this for the other command line arguments is unclear, since\n    those DLLs don't need to be loaded in order to execute argv[0].\n    \n\n    Build Server Protocol \u00a7\n\n    Now, when --listen=- is passed, the build system serves a protocol that allows connected\n    clients to monitor and control the build graph as it executes. This is intended to be consumed by\n    third-party tooling such as IDEs.\n    Current things you can do:\n    \n      Get full access to the entire build graph's static, post-configuration information, such as\n          which build steps are available, which options are set, dependencies, etc. There are a couple\n          things yet to be included, such as the exposed set of module names.\n      Get notified when a build step starts and completes, including information about errors and\n          which files were generated.\n      Request specific steps to build.\n    \n    In particular, the\n    separation of maker process and configurer process\n    is a breaking change that prevents the ZLS project from working\n    with 0.17.0. Although some progress was made to restore functionality in this release cycle, Zig team and\n    ZLS team are still working together to enhance the build server protocol further to the\n    point that ZLS can not only restore functionality, but surpass the power and capabilities compared to\n    before.\n    In the future it is expected for much of Zig's own first-party build system tooling to become a client\n    of the build server protocol, dogfooding it to ensure that third-party tooling enjoys equivalent\n    capabilities (#36497).\n    It is also planned for the build server to multiplex compiler server protocol for the compilation steps,\n    providing type-system information, refactoring, and other advanced editing capabilities (#615).\n    \n    \n\n    Compiler \u00a7\n\n    Incremental Compilation \u00a7\n\n    The Zig compiler's implementation of incremental compilation\u2014a feature allowing\n    near-instant rebuilds of projects after changing the code\u2014has been significantly improved\n    in Zig 0.17.0. Many bugs have been fixed, and the new ELF Linker introduced in the\n    previous release has gained good support for the feature.\n    Thanks to these enhancements, it is now possible for most projects targeting\n      x86_64-linux to take advantage of incremental compilation. To do so, add\n    the arguments -fincremental --watch to your zig build command (e.g.\n    zig build -fincremental --watch)\u2014this will cause the Zig build system to\n    listen for changes to source files, and react to them by performing an incremental rebuild.\n    For more information on ways to use incremental compilation in your own projects, or to learn\n    more about how this feature works under the hood, consider checking out\n    this blog post by a\n    Zig core team member.\n    Future releases will continue to focus on improving this feature, including introducing a new\n    Mach-O linker and self-hosted aarch64 Backend with good support for incremental\n    compilation; adding support for using incremental compilation without --watch; and\n    fixing any remaining bugs.\n    \n\n    SPIR-V Backend \u00a7\n\n    The self-hosted SPIR-V backend is now multi-threaded like the other backends.\n    Execution modes such as LocalSize and OriginUpperLeft are now derived\n    from the function's calling convention instead of being set through inline assembly, and the new\n    spirv_task and spirv_mesh calling conventions add\n    support for task and mesh shaders (#35676).\n    Declaring capabilities and extensions in inline assembly with OpCapability and\n    OpExtension is no longer allowed. They are enabled through target CPU features\n    instead, i.e. the -mcpu option.\n    \n    22 bugs were fixed in the SPIR-V backend during this release cycle.\n    \n\n    aarch64 Backend \u00a7\n\n    Progress towards this is blocked on Linker enhancements, many of which were completed\n    during this release cycle.\n    \n\n    loongarch Backend \u00a7\n\n    Initial implementation of self-hosted backend for loongarch64 has been contributed (#36418). It is still experimental\n    and not yet usable. There are two ways to contribute to this backend: working on it directly, and\n    contributing to AIR Legalization Features,\n    which helps all unfinished backends reach the finish line quicker.\n    \n\n    WebAssembly Backend \u00a7\n\n    Zig's WebAssembly backend is now passing 2060/2054 (100%) behavior tests compared to the LLVM\n    backend. However, it is not yet the default when compiling in debug optimization mode due to\n    lack of debug info support (#37032).\n    \n    \n\n    Linker \u00a7\n\n\n    ELF \u00a7\n\n    This release makes significant progress towards replacing Zig's legacy self-hosted ELF linker\n    with its new implementation introduced in the previous release. Specific enhancements include:\n    \n      Full x86_64 support\n      Full SPARC64 support\n      Partial Loongarch support\n      Static library generation\n      Shared library generation\n      Errors for undefined symbols in executables\n      GOT generation\n      Copy relocations\n      GNU symbol versioning\n      DWARF debug information\n      Symbol hash table generation\n      Mostly-reproducible binaries\n      Arbitrary section alignment\n      Support for small host file system block sizes\n    \n    While this linker has not quite reached feature parity with our old self-hosted ELF linker\n    yet\u2014and so remains disabled by default\u2014it is already capable in practice of building\n    the vast majority of Zig projects targeting x86_64-linux. This unlocks the ability\n    to use Incremental Compilation for these projects\u2014like in Zig 0.16.0, the new\n    linker is enabled by default in this case.\n    In the next release of Zig, we hope to fully eliminate the legacy ELF linker in favour of\n    this implementation.\n    \n\n    COFF \u00a7\n\n    COFF support in the linker is enhanced with the following features (#35674):\n    \n    Outputing objects (.obj) and archives (.lib)\n    Outputing implibs alongside images\n    Outputing the TLS and Exports data directories for images\n    Consuming objects, archives, and import libraries as inputs\n    Only links in objects from archives as required, ie. if they contain a symbol needed to satisfy a\n    reference\n    COMDAT rules (enough support for linking compiler_rt and libc, some COMDAT types are not supported\n    yet)\n    Supports linking against both -gnu and -msvc libc\n    TLS support\n    __dllimport support: Indirect calls / loads from the IAT directly\n    Detects which entrypoint to choose based on exported symbols\n    -gnu: Constructor / destructor support (ie. merge .ctor and .dtor, and set up the\n      __CTOR_LIST__, __DTOR_LIST__ symbols)\n    Support for several .drectve arguments (these are required to correctly link\n    msvc libc):\n      /INCLUDE: Forcing a symbol to be referenced\n      /ALTERNATENAME: Adding symbol aliases\n      /MERGE: Section merging. This functionality is also used to direct certain sections into the right\n      place (like .ctor / .dtor into .rdata)\n      /DEFAULTLIB: Adding new inputs\n    \n    \n\n    New Linker Testing Framework \u00a7\n\n    Zig is moving towards snapshot-based testing for its linkers.\n    Tests are a combination of comparing objdump snapshot output, actually running the artifacts, and\n    checking for linker errors.\n    zig build -Dlink-snapshot-update causes tests to run in a mode that outputs snapshots\n    instead of checking against them.\n    A typical workflow for adding a new test:\n    \n    Add the test\n    zig-debug build test-link -Dtest-filter=my-test -Dlink-snapshot-update\n      This will output a .dmp file for all the snapshot combinations defined in any\n      verifyObjdump calls.\n      A single snapshot intentionally aliases between many targets to reduce noise in the snapshot folder,\n      so snapshot updates are made by whichever test runs first for that snapshot name. If differences between\n      targets do exist, they will be revealed in step 4.\n    Inspect the snapshot output for correctness.\n    zig-debug build test-link -Dtest-filter=my-test\n        This will now run all targets against the newly added snapshots\n    If there are now snapshot failures, that means different targets had different snapshot outputs. The\n    output should be inspected to see if these results are indeed valid differences. If they are, then the\n    scope parameter should be used to cause -Dlink-snapshot-update to output snapshot\n    to different filenames, scoped on the diference.\n    Re-run -Dlink-snapshot-update to update the new set of snapshots.\n    \n    \n\n    SPIR-V \u00a7\n\n    The SPIR-V linker has been rewritten (#36828).\n    It now supports incremental compilation and can link external .spv object files.\n    \n    \n\n    Fuzzer \u00a7\n\n    Although this release's Build System changes are loosely related to Zig's integrated\n    fuzzer and its interaction with the build system, no changes were made to the fuzzer itself.\n    We expect to focus on improving the fuzzer in a future release cycle.\n    \n\n    Bug Fixes \u00a7\n\n    Full list of the 329 bug reports closed during this release cycle:\n    Tracked on GitHub\n    Tracked on Codeberg\n    Many bugs were both introduced and resolved within this release cycle. Most bug fixes are omitted from\n    these release notes for the sake of brevity.\n\n    This Release Contains Bugs \u00a7\n\n    \n    Zig has known\n    bugs,\n    miscompilations, and\n    regressions.\n    \n    Even with Zig 0.17.x, working on a non-trivial project using Zig may require participating in the\n    development process.\n    When Zig reaches 1.0.0, Tier 1 support will gain a bug policy as an additional requirement.\n\n    Notable Regressions \u00a7\n\n    We are aware of these notable regressions in 0.17.0:\n    \n      #37006: compiler-rt fails to compile for soft float on x86\n      #36986: std.debug.simple_panic fails to compile\n      #36986: Weak Zig libc symbols cannot be reliably overridden\n      #36444: The separation of maker process and configurer process breaks response file use cases for std.Build.Step.Run\n      #37050: SPIR-V backend regressions\n    \n    \n    \n    \n\n    \n\n\n    LLVM 22 \u00a7\n\n    This release of Zig upgrades to\n    LLVM 22.1.8. This\n    covers Clang (zig cc), libc++, libc++abi, libunwind, and\n    libtsan as well.\n    Loop Vectorization Disabled to Work Around Regression \u00a7\n\n    In the previous release of Zig, we were forced to disable a key LLVM optimization\n    pass\u2014loop vectorization\u2014to work around a\n    miscompilation which affected\n    the Zig compiler.\n    Since we first introduced that workaround, a\n    fix has been merged into LLVM's\n    main branch. However, the fix is not available in LLVM 22, the LLVM version used by Zig\n    0.17.0. Therefore, this workaround remains enabled for now.\n    Zig 0.18.0 will upgrade to LLVM 23, so will allow us to re-enable this optimization pass.\n    \n    \n\n    musl 1.2.5 \u00a7\n\n    Zig 0.17.0 distributes musl 1.2.5 plus backported security and portability fixes. Meanwhile,\n    upstream has tagged 1.2.6. Zig 0.18.0 will update to musl 1.2.6.\n    When targeting musl statically, many functions are now provided by zig libc rather\n    than source files copied from musl. Therefore, if you encounter bugs with musl libc provided by Zig, please\n    respect upstream by reporting them to Zig's issue tracker rather than musl's.\n    \n\n    glibc 2.44 \u00a7\n\n    glibc version 2.44 is now available when cross-compiling.\n    \n\n    \n\n    This release includes Linux kernel headers for version 7.2.\n    \n\n    \n\n    This release includes macOS system headers for version 27.0.\n    \n\n    MinGW-w64 \u00a7\n\n    Zig 0.17.distributes MinGW-w64 commit 31bd54ab7d5fe03c67ed2bb1a57e531b9c7f8cc4.\n    However, many functions are now provided by zig libc rather\n    than source files copied from MinGW-w64. Therefore, if you encounter bugs with MinGW-w64 libc provided by Zig,\n    please respect upstream by reporting them to Zig's issue tracker rather than MinGW-w64's.\n    \n\n    NetBSD 11.0 libc \u00a7\n\n    NetBSD libc version 11.0 is now available when cross-compiling.\n    \n\n    OpenBSD 7.9 libc \u00a7\n\n    OpenBSD libc version 7.9 is now available when cross-compiling.\n    \n\n    WASI libc \u00a7\n\n    Zig 0.17.0 continues to distribute WASI libc\n    commit c89896107d7b57aef69dcadede47409ee4f702ee.\n    However, many functions are now provided by zig libc rather than source files copied from WASI\n    libc.\n    Furthermore, starting with Zig 0.18.0, instead of distributing third party WASI libc code, Zig will\n    provide libc for WASI targets via zig libc. For more information, see:\n    \n    Define a distinct Zig libc ABI\n    remove support for wasi-libc\n    \n    \n\n    zig libc \u00a7\n\n    In libc.txt files, the gcc_dir field has been renamed to cc_dir\n    to reflect the reality that it is not specific to GCC. The old name will still be accepted for now, but\n    users are encouraged to migrate their libc.txt to the new name (#36951).\n\n    Additionally, cc_dir is now required on Linux targets. Note that, because Android and OpenHarmony\n    store the relevant object files in an unusual location, users of these targets will likely want to set\n    cc_dir to the same path as crt_dir.\n    \n\n    zig cc \u00a7\n\n    zig cc and zig c++ are now based on Clang 22.1.8.\n    \n\n    zig objdump \u00a7\n\n    This was a requirement for snapshot testing, as well as aiding in developing the COFF\n    Linker.\n    Supported features:\n    Usage: zig objdump [options] file\n\nOptions:\n  -h, --help                         Print this help and exit\n  --all-headers                      Alias for --file-headers --linker-member=2 --member-headers --section-headers --relocs --symbols\n  --exports[=sort]                   Display exported symbols.\n                                     In the case of COFF import libraries, displays the symbol list and import headers.\n                                     Specify =sort to optionally sort the import headers by symbol name.\n  --file-headers                     Display file-format specific headers\n  --imports                          Display imported symbols\n  --linker-member[=1|2|longnames]    (Coff) Display contents of the specified archive linker member (default 2)\n  --member-headers                   Display archive member headers\n  --elements=[e1],[e2],-[e3],...     Select which formatting elements are displayed. Intended for snapshot testing.\n      file-type                      File type summary\n      header-name                    Name that precedes a header block\n      member-path                    Display full member paths. If removed, only basenames will be used.\n      newlines                       Newlines between output sections\n      table-header                   Table headers with column names\n      all                            (default) All of the above\n  --only-member=[name]               Only consider archive members names that contain [name]. Can be specified multiple times.\n  --only-section=[name]              Only consider section names that contain [name]. Can be specified multiple times.\n  --only-symbol=[name]               Only consider symbol names that contain [name]. Can be specified multiple times.\n  --redact=[kind]                    Redact the specified field kind. Intended for snapshot testing.\n      rva                            Relative virtual addresses\n      va                             Virtual addresses and file offsets\n      ord                            Symbol ordinals / hints\n      size                           Sizes and lengths\n      all                            All of the above\n  --relocs                           Display relocations\n  -s, --snapshot                     Alias for --redact=all --elements=-all\n  --section-headers                  Display section headers\n  --strings                          Display string tables\n  --symbols                          Display symbol tables\n  --tls                              Display TLS information\n      Some example output:\n      \u276f zig objdump mathtest-dync-exe-no-llvm.dll --all-headers\nmathtest-dync-exe-no-llvm.dll: PE/COFF image\n\n\nCOFF Header:\n            8664 machine (AMD64)\n               7 number_of_sections\n        6a08670a time_date_stamp\n               0 pointer_to_symbol_table\n               0 number_of_symbols\n              f0 size_of_optional_header\n            2022 flags\n               | EXECUTABLE_IMAGE\n               | LARGE_ADDRESS_AWARE\n               | DLL\n\nCOFF Optional Header:\n             20b magic (PE32+)\n           14.00 linker_version\n          14a400 size_of_code\n           84e00 size_of_initialized_data\n               0 size_of_uninitialized_data\n            1000 address_of_entry_point (       180001000)\n            1000 base_of_code (       180001000)\n       180000000 image_base\n            1000 section_alignment\n             200 file_alignment\n            6.00 operating_system_version\n            1.00 image_version\n            6.00 subsystem_version\n               0 win32_version_value\n          1d6000 size_of_image\n             400 size_of_headers\n               0 checksum\n               2 subsystem (WINDOWS_GUI)\n             160 dll_flags\n               | HIGH_ENTROPY_VA\n               | DYNAMIC_BASE\n               | NX_COMPAT\n          100000 size_of_stack_reserve\n            1000 size_of_stack_commit\n          100000 size_of_heap_reserve\n            1000 size_of_heap_commit\n               0 loader_flags\n              10 number_of_rva_and_sizes\n\nData Directories:\n          1b48d0       54 EXPORT\n          1b4924       8c IMPORT\n               0        0 RESOURCE\n          1cc000     633c EXCEPTION\n               0        0 SECURITY\n          1d4000     1280 BASERELOC\n          1bc000       1c DEBUG\n               0        0 ARCHITECTURE\n               0        0 GLOBALPTR\n          1aebc8       28 TLS\n               0        0 LOAD_CONFIG\n               0        0 BOUND_IMPORT\n          1b4c80      2d0 IAT\n               0        0 DELAY_IMPORT\n               0        0 COM_DESCRIPTOR\n               0        0 RESERVED\n\nSections in 'mathtest-dync-exe-no-llvm.dll':\nNum Name          RVA Virt Size Data Size   & Data & Relocs  & Lines # Relocs  # Lines    Flags\n  1 .text        1000    14a346    14a400      400        0        0    0    0 60000020 | CNT_CODE MEM_EXECUTE MEM_READ\n  2 .rdata     14c000     6fe3c     70000   14a800        0        0    0    0 40000040 | CNT_INITIALIZED_DATA MEM_READ\n  3 .buildid   1bc000        52       200   1ba800        0        0    0    0 40000040 | CNT_INITIALIZED_DATA MEM_READ\n  4 .data      1bd000      e2a0      d200   1baa00        0        0    0    0 c0000040 | CNT_INITIALIZED_DATA MEM_READ MEM_WRITE\n  5 .pdata     1cc000      633c      6400   1c7c00        0        0    0    0 40000040 | CNT_INITIALIZED_DATA MEM_READ\n  6 .tls       1d3000        20       200   1ce000        0        0    0    0 c0000040 | CNT_INITIALIZED_DATA MEM_READ MEM_WRITE\n  7 .reloc     1d4000      1280      1400   1ce200        0        0    0    0 42000040 | CNT_INITIALIZED_DATA MEM_DISCARDABLE MEM_READ\n\nNo symbol table found\n\n    If this output was used for a snapshot test that wanted to test the presence of a particular export:\n\n\u276f zig objdump mathtest-dync-exe-no-llvm.dll --exports --only-symbol=add --redact=rva --elements=-all\nExport directory:\n               0 flags\n               0 time_date_stamp\n            0.00 version\nxxxxxxxxxxxxxxxx name_rva\n               1 ordinal_base\n               1 number_of_entries\n               1 number_of_names\nxxxxxxxxxxxxxxxx export_address_table_rva\nxxxxxxxxxxxxxxxx name_pointer_table_rva\nxxxxxxxxxxxxxxxx ordinal_table_rva\n   1    0 xxxxxxxx | add\n\n    The redaction (--redact=) and element removal (--elements=) functionality is used to remove parts of\n    the output that don't matter for the particular test, as to not cause spurious failures if say, an RVA for\n    a symbol changes due to some unrelated change to the linker. -s is shorthand which enables all the\n    redacts and removes all extra output elements, but particular tests may not use this if they do care about\n    specific values.\n    \n\n    resinator \u00a7\n\n    Windows Resource Compilation Moving to an External Package \u00a7\n\n    Windows resource script\n    compilation will be moved out of the compiler and into an official-but-external build system\n    package in the next release. As such, the corresponding std.Build functions and fields\n    (Build.Module.addWin32ResourceFile, etc) have been marked as deprecated in this release.\n\n    The zig rc subcommand will remain after this change in order to continue supporting the use\n    case of using the Zig toolchain with other build systems.\n    \n    \n\n    zig fmt \u00a7\n\n    Added --complexity Flag \u00a7\n\n    It's a simple tool for counting tokens and AST nodes, which can be used to share how an edit to a source\n    file increases or reduces complexity with a heuristic that is more insightful than line count.\n    For example, running it on old ELF linker directory:\n    info: src/link/Elf/gc.zig: tokens=1538 nodes=770\ninfo: src/link/Elf/Atom.zig: tokens=15576 nodes=7768\ninfo: src/link/Elf/Merge.zig: tokens=2288 nodes=1092\ninfo: src/link/Elf/Thunk.zig: tokens=1128 nodes=519\ninfo: src/link/Elf/SharedObject.zig: tokens=4566 nodes=2236\ninfo: src/link/Elf/eh_frame.zig: tokens=4840 nodes=2335\ninfo: src/link/Elf/Symbol.zig: tokens=3770 nodes=1872\ninfo: src/link/Elf/synthetic_sections.zig: tokens=13287 nodes=6375\ninfo: src/link/Elf/Object.zig: tokens=13903 nodes=6842\ninfo: src/link/Elf/LinkerDefined.zig: tokens=4140 nodes=2091\ninfo: src/link/Elf/relocatable.zig: tokens=3598 nodes=1848\ninfo: src/link/Elf/Archive.zig: tokens=2176 nodes=1028\ninfo: src/link/Elf/ZigObject.zig: tokens=20783 nodes=10274\ninfo: src/link/Elf/AtomList.zig: tokens=1819 nodes=933\ninfo: src/link/Elf/relocation.zig: tokens=1289 nodes=551\ninfo: src/link/Elf/file.zig: tokens=2330 nodes=1087\ninfo: total: tokens=97031 nodes=47621\n    Another example is after editing Lld.zig to use\n    arena.print rather than std.fmt.allocPrint. The\n    line count is roughly the same but --complexity tells a different story:\n    \n    before: tokens=11929 nodes=5900\n    after: tokens=11832 nodes=5852 (1% reduction in source complexity)\n    \n    In the future this metric may be helpful for an automatic import organizer to determine whether to\n    create an import alias or not. \n    \n    \n\n    \n\n    Roadmap \u00a7\n\n    \n      Work with ZLS team to enhance Build Server Protocol to the point where\n      satisfies all their use cases.\n      Complete Windows support in the x86_64 backend so that it can be enabled by default.\n      Complete and stabilize the language.\n      Complete the aarch64 Backend and make it the default backend for debug mode.\n      Enhance the Linker implementations, eliminating dependency on\n      LLD and support Incremental Compilation.\n      Enhance the integrated Fuzzer to be competitive with AFL and other state-of-the-art fuzzers.\n      Transition from a library dependency on LLVM to a process dependency on Clang (#16270).\n      Complete the Build System, in particular Package Management features.\n      Audit the Standard Library (#1629).\n    \n    \n\n    Thank You Contributors! \u00a7\n\n    Here are all the people who landed at least one contribution into this release:\n    \nAlex R\u00f8nne Petersen\nAndrew Kelley\nMatthew Lugg\nCasey Banner\nJacob Young\nFrank Denis\nAli Chraghi\nIsaac Freund\nPavel Verigo\nRyan Liptak\nTechatrix\nJustus Klausecker\nLinus Groh\nxtex\nrpkak\nDavid Rubin\nElaine Gibson\nDavid Senoner\nK4\nfardragon\npentuppup\nKrzysztof Wolicki\nMason Remaley\nMeghan Denny\nChristophe Delage\nRobbie Lyman\nLuk\u00e1\u0161 Lalinsk\u00fd\nBrandon Black\nKendall Condon\nhemisputnik\nwhatisaphone\nBen Anderman\nGasInfinity\nHuang Zhichao\nJakub Konka\nJari Vetoniemi\nKleshzz\nMick Sayson\nMiko\u0142aj Rosowski\nRyan Mehri\nSertonix\njeffkdev\nlg\nCarl \u00c5stholm\nEJ\nHila Friedman\nQuint Daenen\nSaurabh Mishra\nStephen Gregoratto\nSubo2002\nTen Eugene\nzacoons\nArthur Teixeira\nBen Burkert\nBernard Assan\nCursedByTheVoid\nDaniel Kareh\nEnnui Langeweile\nIgor Anic\u0301\nJanne Hellsten\nJay Petacat\nNguy\u1ec5n Gia Phong\nRagul R\nRue04\nRyan Mehri\nSam Connelly\nScott Redig\nTheo Fabi\nVitor Fernandes\nc-kappel\ngero3\nglowsquid\ntaoqy\nteflate\nxeondev\nAI Xin\nARandomOSDever\nAcid Bong\nAdri\u00e0 Arrufat\nAkshay Trivedi\nAlan Cocanour\nAlex Kladov\nAmilia MacIntyre\nAnders Stenberg\nAndrew Kraevskiii\nAnshul Gupta\nAnthon van der Neut\nAri Becker\nAshley (holtowd)\nC19\nCarter Snook\nChadwain Holness\nChlo\u00e9 Vulquin\nChris Boesch\nChristoffer Lerno\nCorentin Kerisit\nDavid\nDevin J. Pohly\nDiego Pe\u00f1a y Lillo\nDmitry Mostovenko\nEric Joldasov\nErik Schlyter\nFalsePattern\nFitti\nGabriel Sa\nGereon V\nGiuseppe Cesarano\nGota7\nGrimTyr\nGuillaume Wenzek\nGuy Fischman\nHenry Kupty\nIgnacio Ibarra\nJan Proch\u00e1zka\nJan200101\nJeff Fowler\nJeremy Linton\nJohn Benediktsson\nJonathan Marler\nJoseph Lyncheski\nJosh Megnauth\nKirk Scheibelhut\nLeon Lombar\nLeonid Emar-Kar\nMai-Lapyst\nManlio Perillo\nMarcel W. Wysocki\nMark Rushakoff\nMathieu Suen\nMatthew Knight\nMatthias Portzel\nMichael Farber Brodsky\nMilo\u0161 Koz\u00e1k\nNguyen Gia Huy\nNico Elbers\nNoam Rothschild\nNurul Huda (Apon)\nPaul Anderson\nPaulo Duarte\nPerry Fraser\nPivok\nPreeternal\nProkop Rand\u00e1\u010dek\nRadsammyT\nRayan Halder\nRichalsu\nRichard Levitte\nRue04\nRyan Davis\nRyan King\nSage Hane\nSamuel Hunter\nSawyer X\nSiddharth Sinha\nSteve\nTapir\nThibault Leclercq\nYasin Gorgij\nZhalkhas\nabdessalem\nagave\nahwayakchih\nakbarhusain\narshidkv12\navalyn0x45\nbadayvedat\nbinarycraft007\nbrianferri\nbrkzlr\ncarmooo\ncheesecakecatttt\nconmaster2112\ndrex_vk\ngDator\ngemmaro\ngubbu\nilovapples\njmcaine\njohan0A\njpk68\nkrystiann\nkubashi\nl1yefeng\nlevinqua\nllogick\nmarximimus\nmihael\nmlugg\nnash1111\nndjenks\nnekogirl\nnyx-xyn\npancelor\nskdishansachin\nsphaerophoria\nsquidy239\nsstochi\nvlkrs\nzirunis\n\u00d6mer Faruk IRMAK\n\u0388\u03bb\u03bb\u03b5\u03bd \u0395\u03bc\u03af\u03bb\u03b9\u03b1 \u0386\u03bd\u03bd\u03b1 Zscheile\n\u6797\u6668 (Leo Cheng)\n    \n    \n\n    \n\n    \n    Special thanks to those who sponsor Zig.\n    Because of diverse, recurring donations, Zig is driven by the open source community, rather\n    than the goal of making profit. In particular, those below sponsored Zig\n    for an average of $50/month or more during this release cycle\n    using our preferred donation platform:\n    \n    \n    Sergey M\n    Mitchell Kember\n    David Vanderson\n    Thomas Manner\n    Kirk Scheibelhut\n    Kazuhiro Kondo\n    Merlyn Morgan-Graham\n    Freddi Linse\n    Numan Sachwani\n    Aur\u00e9lien Cibrario\n    Erik Dunteman\n    Ondra Voves\n    Mitchell Gayner\n    Dylan Conway\n    Trevor John\n    Jason Watson\n    Greg Clark\n    Benjamin Crist\n    Alexander Weavers\n    Natalie Vais\n    Stevie Hryciw\n    Kyle Hill\n    Felix Quei\u00dfner\n    Srinivasan Balram\n    Peter Ronnquist\n    Lajos Nagy\n    Gauthier Voron\n    Andrew Mangogna\n    Alex Kladov\n    Jacob Sandlund\n    Jordan Lucier\n    Wolfgang Sanyer\n    Matthew Knight\n    Nick Macholl\n    Ceri Elenbaas\n    Michael Keathley\n    Daniele Cocca\n    Bartosz Bogacz\n    James Cox-Morton\n    William Canan\n    Fabio Arnold\n    Johannes Meyer\n    Silver van Koten\n    Flavius Gruian\n    Daniel MacDougall\n    Karrick McDermott\n    Dan Mack\n    Caleb Hearon\n    Richard Levitte\n    Ingimar J\u00f3hannesson\n    David Fendley\n    Aaron Cross\n    Jeremiah Oard\n    Simon Ekstr\u00f6m\n    Jorge De Le\u00f3n\n    Saurabh Mishra\n    Rob Green\n    Kytezign q\n    Mykhailo Tsiuptsiun\n    Paul Sargent\n    Erik M\u00e5llberg\n    Igor Anic\n    Fawzi Mohamed\n    David Jones\n    Magnus Holm\n    Nicholas Woolmer\n    Samarth Kishor\n    Charles Haws\n    Shlomi Atar\n    Robbie Lyman\n    Andrius Bentkus\n    Jean-Luc Geering\n    Aaron Mady\n    coleman broaddus\n    Trace Andreason\n    Jim Calabro\n    Chris Baldwin\n    Ian Johnson\n    Brandon Black\n    Michael Lynch\n    O Y\n    Francesco Gualazzi\n    David Sugar\n    Malcolm Still\n    Jeff Fowler\n    Yaroslav Zhavoronkov\n    Miles McGruder\n    \u00c1lvaro Justen\n    FELIPE SOARES GONCALVES SA ROSA\n    Noah Betzen\n    Manuel Barkhau\n    Rikard Karlsen\n    Frank Ittermann\n    Eli Janssen\n    Peter Snelgrove\n    Will Pragnell\n    Pete Dietl\n    Vaughn Spielman\n    Michael Kato\n    Daniel Dubecky Hodan\n    Dan Boykis\n    Richard Feldman\n    Markus Ort\n    Peyman Mortazavi\n    Wilson Bilkovich\n    Kev Burns\n    Francisco Nevitt Gon\u00e7alves\n    Mark Banhidi\n    Kristoffer Str\u00f6m\n    Carl Distefano\n    Alexander Reustle\n    Martin Hovda Haugsand\n    Lexa Tang\n    Lennart Tuijnder\n    Enver Bisevac\n    Jameson York\n    Hong Shick Pak\n    Travis Staloch\n    Clover Caruso\n    Matthew Chavez\n    Daniel Gregoire\n    Jose M Rico\n    Xavier Cochran\n    Nas Denkov\n    Pavel Rychl\u00fd\n    papa leromi\n    Ronald Zielaznicki\n    Tommi Komulainen\n    Matthew Jee\n    Johan Forsberg\n    \u0141ukasz Mr\u00f3z\n    Fabio Leimgruber\n    Maurice van Veen\n    Dean Simmons\n    Pierre Marc Levasseur\n    Sebastian Appler\n    Sam Windell\n    Aksel Hjerpbakk\n    Jonathan Helland\n    Karl Fleischmann\n    Erik Hansen\n    Chris Boesch\n    Pablo \u00c1lvarez\n    Jacob Hooper\n    Avinash Lakshman\n    Joshua Park\n    Nicholas Clark\n    Ryan Higgins\n    Jeffrey Ollie\n    Adam Goertz\n    David Nowotny\n    Gus Louw\n    David Francoeur\n    David Sparby\n    Tyler Bender\n    Mark Halonen\n    Reinis Taukulis\n    Nancy Remaley\n    Isaac F\n    Kjell Hoffhenke\n    Vlad Panazan\n    Jordan Rowland\n    Jay Van Der Wall\n    Jean-Philippe Quenord\n    Jakob K\u00fclzer\n    Varun Pramanik\n    Benjamin Edwards\n    Andreas Herrmann\n    Adam Nilsson\n    Joseph Ruiz\n    Anthony Nguyen\n    Marcin Wolcendorf\n    Tobias Lahrmann Hansen\n    Pat Smuk\n    Martin Weber\n    Jordan Kardon\n    Benjamin LE BERRE\n    John Goen\n    Sebastian Ahlman\n    Anthony Hernandez\n    Shail Patel\n    Alexander Genaud\n    Morten Dalfoss\n    Jason Dubaniewicz\n    Mark Hayes\n    Eivind Rovik\n    Renan Silva\n    Isak K\u00e4llman\n    Ladislav B\u00f6hm\n    LeRoyce Pearson\n    Rowan Saunders\n    Joshua Masci\n    Raymond Imber\n    Daniel Worley\n    Owen Cabalceta\n    Erez Shomron\n    Max Grosse\n    Ehden Sinai\n    Christopher Redden\n    Antoine Balaine\n    Chris Durkin\n    Dave Wallace\n    Aura Birb\n    Andy Armstrong\n    Spencer Brower\n    Simon Clavet\n    Guido Schmidt\n    Peter McGaughey\n    Callum McArthur\n    David Lei\n    David Brotz\n    Matti H\u00e4nninen\n    Joseph Chan\n    Vincent Weber\n    Jeremy McAdams\n    Morgan Gallant\n    Brett Pechiney\n    Thilina Jayanath Nenathunga Liyanage\n    Kevin Bockelandt\n    Gunnar Z\u00f6tl\n    \n    Special thanks also to TigerBeetle,\n    Synadia Communications, and\n    ZML for substantial contributions."
                ],
                "output": "readability",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-03T01:41:57.361054+00:00",
                "status": "succeeded"
            }
        ],
        "screenshot": [],
        "singlefile": [],
        "title": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-02T22:05:46.657393+00:00",
                "index_texts": null,
                "output": "0.17.0 Release Notes \u26a1 The Zig Programming Language",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-02T22:05:46.547354+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-03T01:41:57.351295+00:00",
                "index_texts": null,
                "output": "0.17.0 Release Notes \u26a1 The Zig Programming Language",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-03T01:41:57.202690+00:00",
                "status": "succeeded"
            }
        ],
        "wget": [
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-02T22:05:46.536845+00:00",
                "index_texts": null,
                "output": "ziglang.org/download/0.17.0/release-notes.html",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-02T22:05:43.422044+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://ziglang.org/download/0.17.0/release-notes.html"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-03T01:41:57.191774+00:00",
                "index_texts": null,
                "output": "IndexError: list index out of range",
                "pwd": "/data/archive/1790978741.216204",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-03T01:41:53.903447+00:00",
                "status": "failed"
            }
        ]
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": null,
        "dom": null,
        "favicon": "favicon.ico",
        "git": null,
        "media": null,
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "0.17.0 Release Notes \u26a1 The Zig Programming Language",
        "warc": null,
        "wget": "IndexError: list index out of range"
    },
    "link_dir": "/data/archive/1790978741.216204",
    "newest_archive_date": "2026-10-03T01:42:00.839284+00:00",
    "num_failures": 1,
    "num_outputs": 11,
    "oldest_archive_date": "2026-10-02T22:05:41.764050+00:00",
    "path": "/download/0.17.0/release-notes.html",
    "schema": "Link",
    "scheme": "https",
    "snapshot_id": "c65d9100-9127-4dd9-9395-09c27e65e5f1",
    "sources": [
        "/data/sources/1790978741-import.txt"
    ],
    "tags": ",war-wiki",
    "tags_str": "war-wiki",
    "timestamp": "1790978741.216204",
    "title": "0.17.0 Release Notes \u26a1 The Zig Programming Language",
    "updated": "2026-10-03T01:41:52.480347+00:00",
    "updated_date": "2026-10-03 01:41",
    "url": "https://ziglang.org/download/0.17.0/release-notes.html"
}