{"article":{"slug":"announcing-rust-1-99-0","title":"Announcing Rust 1.99.0","subtitle":null,"summary":"The Rust team announces Rust 1.99.0 with the usual rustup upgrade path and release notes covering language, library, and tooling changes.","content_type":"changelog","language":"en","canonical_url":"https://blog.rust-lang.org/2026/10/01/Rust-1.99.0/","author":{"name":"The Rust Release Team","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Rust Blog","url":"https://blog.rust-lang.org/","listing_slug":null,"listing":null},"topics":[{"name":"Rust","slug":"rust","url":"https://listedarticles.com/topics/rust"},{"name":"Programming","slug":"programming","url":"https://listedarticles.com/topics/programming"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"},{"name":"Systems Programming","slug":"systems-programming","url":"https://listedarticles.com/topics/systems-programming"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":440,"reading_minutes":2,"published_at":"2026-10-01T00:00:00.000Z","added_at":"2026-10-02T18:14:54.254Z","updated_at":"2026-10-02T18:14:54.254Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/announcing-rust-1-99-0","markdown_url":"https://listedarticles.com/articles/announcing-rust-1-99-0.md","example":false,"citation":"The Rust Release Team, Rust Blog. \"Announcing Rust 1.99.0.\" 1 Oct 2026. https://blog.rust-lang.org/2026/10/01/Rust-1.99.0/ (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://blog.rust-lang.org/2026/10/01/Rust-1.99.0/"},"body_markdown":"# Announcing Rust 1.99.0\n\nThe Rust team is happy to announce a new version of Rust, 1.99.0. Rust is a programming language empowering everyone to build reliable and efficient software.\n\nIf you have a previous version of Rust installed via `rustup`, you can get 1.99.0 with:\n\n`$ rustup update stable`\nIf you don't have it already, you can get `rustup` from the appropriate page on our website, and check out the detailed release notes for 1.99.0.\n\nIf you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (`rustup default beta`) or the nightly channel (`rustup default nightly`). Please report any bugs you might come across!\n\n## What's in 1.99.0 stable\n\n### extern \"C\" variadics\n\nRust 1.99.0 stabilizes defining C-ABI variadic functions with \"C\" and\n\"C-unwind\" ABIs. Variadic functions defined this way use a variable argument\nlist (`...`) and accept an arbitrary number of arguments. Rust could already\ncall externally-defined variadic functions (e.g., `libc::printf`). With Rust\n1.99, these functions can now be written in Rust itself:\n\n```\n/// SAFETY: must be called with (at least) 2 i32 arguments.\nunsafe extern \"C\" fn sum(mut args: ...) -> i32 {\n    // SAFETY: guaranteed by the caller.\n    let a = unsafe { args.next_arg::<i32>() };\n    let b = unsafe { args.next_arg::<i32>() };\n    a + b\n}\nfn foo() -> i32 {\n    unsafe { sum(0i32, 2i32) }\n}\n```\nThe type of `...` is `VaList`,\nwhich is ABI-compatible with the C `va_list` type across targets. What types can be read from a `VaList` is guarded by the\n`VaArgSafe` trait.\n\nFor more details on c-variadic functions, see the Reference. This release also stabilizes support for defining naked variadic functions with non-\"C\" ABIs, which must be written via inline assembly.\n\n### Layout information from raw pointers\n\nThis release settles the safety requirements for retrieving the size and\nalignment on raw pointers to both `Sized` (trivially safe, already possible on\nstable) and non-`Sized` types.\n\nThis is done by stabilizing three functions:\n\n### \nRecommend against round-trip unleaking after `Box::leak`\n\nWhile there are no changes to the language semantics in Rust 1.99, we have\nupdated the documentation on `Box::leak` to recommend against patterns that\nlater deallocate that memory. This was done because such code was found to have\nproblematic interactions with current and future potential compiler optimizations,\nand is especially problematic with the upcoming stabilization of custom allocators.\nInstead, `Box::into_non_null` or `Box::into_raw` should be preferred.\n\nThis guidance also applies to other `leak` functions in the standard library.\n\n### Stabilized APIs\n\n### Other changes\n\nCheck out everything that changed in Rust, Cargo, and Clippy.\n\n## Contributors to 1.99.0\n\nMany people came together to create Rust 1.99.0. We couldn't have done it without all of you. Thanks!","body_html":"<h1 id=\"announcing-rust-1-99-0\">Announcing Rust 1.99.0</h1>\n<p>The Rust team is happy to announce a new version of Rust, 1.99.0. Rust is a programming language empowering everyone to build reliable and efficient software.</p>\n<p>If you have a previous version of Rust installed via <code>rustup</code>, you can get 1.99.0 with:</p>\n<p><code>$ rustup update stable</code>\nIf you don&#39;t have it already, you can get <code>rustup</code> from the appropriate page on our website, and check out the detailed release notes for 1.99.0.</p>\n<p>If you&#39;d like to help us out by testing future releases, you might consider updating locally to use the beta channel (<code>rustup default beta</code>) or the nightly channel (<code>rustup default nightly</code>). Please report any bugs you might come across!</p>\n<h2 id=\"what-s-in-1-99-0-stable\">What&#39;s in 1.99.0 stable</h2>\n<h3 id=\"extern-c-variadics\">extern &quot;C&quot; variadics</h3>\n<p>Rust 1.99.0 stabilizes defining C-ABI variadic functions with &quot;C&quot; and\n&quot;C-unwind&quot; ABIs. Variadic functions defined this way use a variable argument\nlist (<code>...</code>) and accept an arbitrary number of arguments. Rust could already\ncall externally-defined variadic functions (e.g., <code>libc::printf</code>). With Rust\n1.99, these functions can now be written in Rust itself:</p>\n<pre><code>/// SAFETY: must be called with (at least) 2 i32 arguments.\nunsafe extern &quot;C&quot; fn sum(mut args: ...) -&gt; i32 {\n    // SAFETY: guaranteed by the caller.\n    let a = unsafe { args.next_arg::&lt;i32&gt;() };\n    let b = unsafe { args.next_arg::&lt;i32&gt;() };\n    a + b\n}\nfn foo() -&gt; i32 {\n    unsafe { sum(0i32, 2i32) }\n}</code></pre>\n<p>The type of <code>...</code> is <code>VaList</code>,\nwhich is ABI-compatible with the C <code>va_list</code> type across targets. What types can be read from a <code>VaList</code> is guarded by the\n<code>VaArgSafe</code> trait.</p>\n<p>For more details on c-variadic functions, see the Reference. This release also stabilizes support for defining naked variadic functions with non-&quot;C&quot; ABIs, which must be written via inline assembly.</p>\n<h3 id=\"layout-information-from-raw-pointers\">Layout information from raw pointers</h3>\n<p>This release settles the safety requirements for retrieving the size and\nalignment on raw pointers to both <code>Sized</code> (trivially safe, already possible on\nstable) and non-<code>Sized</code> types.</p>\n<p>This is done by stabilizing three functions:</p>\n<p>### \nRecommend against round-trip unleaking after <code>Box::leak</code></p>\n<p>While there are no changes to the language semantics in Rust 1.99, we have\nupdated the documentation on <code>Box::leak</code> to recommend against patterns that\nlater deallocate that memory. This was done because such code was found to have\nproblematic interactions with current and future potential compiler optimizations,\nand is especially problematic with the upcoming stabilization of custom allocators.\nInstead, <code>Box::into_non_null</code> or <code>Box::into_raw</code> should be preferred.</p>\n<p>This guidance also applies to other <code>leak</code> functions in the standard library.</p>\n<h3 id=\"stabilized-apis\">Stabilized APIs</h3>\n<h3 id=\"other-changes\">Other changes</h3>\n<p>Check out everything that changed in Rust, Cargo, and Clippy.</p>\n<h2 id=\"contributors-to-1-99-0\">Contributors to 1.99.0</h2>\n<p>Many people came together to create Rust 1.99.0. We couldn&#39;t have done it without all of you. Thanks!</p>","headings":[{"level":1,"text":"Announcing Rust 1.99.0","id":"announcing-rust-1-99-0"},{"level":2,"text":"What's in 1.99.0 stable","id":"what-s-in-1-99-0-stable"},{"level":3,"text":"extern \"C\" variadics","id":"extern-c-variadics"},{"level":3,"text":"Layout information from raw pointers","id":"layout-information-from-raw-pointers"},{"level":3,"text":"Stabilized APIs","id":"stabilized-apis"},{"level":3,"text":"Other changes","id":"other-changes"},{"level":2,"text":"Contributors to 1.99.0","id":"contributors-to-1-99-0"}]}}