Repository navigation
chore: rustc: 1.99.0 -> 1.99.1 - #11935
Merged
Merged
Conversation
https://blog.rust-lang.org/2026/10/15/Rust-1.99.1/ Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
Both version pins are consistent, the change is limited to a patch upgrade, and no blocking issues were identified.
No open issues 🎉
What changed in this PR
Updates the repository’s Rust toolchain from 1.99.0 to 1.99.1, keeping rustup and Bazel aligned on the patch release.
Changes:
- Updates both toolchain version pins to 1.99.1.
- Leaves compiler settings, dependencies, test data, and benchmark baselines unchanged.
| File | Description |
|---|---|
rust-toolchain.toml |
Selects Rust 1.99.1 for rustup-based tooling. |
bazel/rust.MODULE.bazel |
Selects Rust 1.99.1 for Bazel builds. |
Review effort: Balanced
mraszyk
approved these changes
Oct 23, 2026
basvandijk
enabled auto-merge
October 23, 2026 15:00
dfinityianblenke
approved these changes
Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Upgrade the rust toolchain from 1.99.0 to 1.99.1. See:
https://blog.rust-lang.org/2026/10/15/Rust-1.99.1/.
1.99.1 is a point release with three backported fixes
(1.99.0...1.99.1). This PR is only the
version bump in
rust-toolchain.tomlandbazel/rust.MODULE.bazel. No clippy fixes, test data orcanbench baselines need to change. Clippy (
Cargo Lint LinuxandPocketIC Lint on Windows) isclean on 1.99.1.
The x86_64
boolmiscompilation did not affect the ICrust#163911: rust#159317, new in 1.99.0, dropped
zeroextfromboolreturn values ofextern "C"and most other non-Rust ABIs ("C-unwind","system","sysv64", ...) on x86_64 targets other than macOS and Windows, such asx86_64-unknown-linux-gnu. A Rust callee built with 1.99.0 can then returnfalsewith bits 1-7of
alset, which a caller that tests the whole byte reads astrue. Rust callers are notaffected, because 1.99.0 only tests bit 0. 1.99.1 restores
zeroext(rust#163917, backported inrust#164232).
The one place in the IC where this could bite is Wasmtime. Every host function (the
ic0.*systemAPI,
__.out_of_instructions,__.internal_trap, ...) is called through Wasmtime'sextern "C" fn array_call_trampoline(..) -> bool, which returnsfalsewhen the host call traps.Cranelift's wasm-to-host trampolines test that byte with
test %al,%al. A dirtyfalsewouldtherefore have let canister code keep running after a host call that trapped.
That did not happen.
//publish/binaries:canister_sandboxand//publish/binaries:replicawerebuilt from master 592d14c with both toolchains, with the release settings (
-c opt,-Cdebug-assertions=off), and compared:array_call_trampolineinstances (the 83func_wrapclosures inlinker.rs, eachcompiled for 32- and 64-bit main memory) and the 10 Wasmtime libcalls that return
bool(5 ofthem are compiled out in the IC and only panic) set
alonly withxor %eax,%eax,mov $0x1,%alor a call to such a function, on every return path, in both binaries. Apart from
breakpoint,which returns a constant 1, they return the result of
catch_unwind_and_record_trap, a Rust-ABIfunction, and Rust-ABI
boolreturns keptzeroextin 1.99.0.ret. The onlybool-ABI changes are on the caller side, in three Wasmtime functions(
catch_trapstwice andCodeMemory::publish), where for exampletest $0x1,%r15bbecomestest %r15b,%r15b. Their callees (Cranelift's array-to-wasm trampolines, the host trampolinesabove when an exported function is an imported one, and a C helper) always return 0 or 1, so
behaviour does not change.
non-Rust-ABI function returning
boolthat C, asm or JIT code calls. Wasmtime's other suchfunctions (component model, stack switching) are not compiled into the IC.
The remaining machine-code differences (under 1% of the functions in each binary, plus renamed
symbols) are optimisation churn. rustc hashes its version string into every crate's
StableCrateId.That changes symbol names,
TypeIds and how items are partitioned and ordered, and with them someinlining and function-merging decisions. With the compiler held fixed, changing only that hash input
reproduces the same kinds of differences in test builds of Wasmtime and of a canister.
canbench
All 8
_updatetargets were run on the same commit with both toolchains. No benchmark or scopemoves beyond its noise threshold, so no baseline is updated (as with the suites that stayed within
their thresholds in #11735). All 8
_testtargets pass on 1.99.1 against the committed baselines._testtarget_testchecks)//rs/bitcoin/ckbtc/minter:ckbtc_minter_canbench_test//rs/ethereum/cketh/minter:cketh_minter_canbench_test//rs/ledger_suite/icp/ledger:ledger_canbench_test//rs/ledger_suite/icrc1/ledger:canbench_u64_test//rs/ledger_suite/icrc1/ledger:canbench_u256_test//rs/nns/governance:governance-canbench_test//rs/registry/canister:registry-canbench_test//rs/sns/governance:governance-canbench_testNone of the three fixes changes wasm32 codegen, so 1.99.1's own effect on canister Wasm is the same
version-hash churn as above. Across the 8 modules, about 180 of ~20,400 functions get a different
instruction sequence, and nearly all other differences in function bodies are renumbered function
indices, data addresses and table slots. With the crate hashes pinned (
RUSTC_FORCE_RUSTC_VERSION),1.99.0 and 1.99.1 produce identical code and data for the SNS governance canister. The churn moves
NNS governance by -0.90% to +1.14% and ckETH by 50 instructions, and leaves the other six suites
identical. The rest of the last column is drift that master already has. Regenerating the baselines
with 1.99.0 on master gives the same numbers for the other six suites, and all of ckETH's +1.72%
except those 50 instructions.
NNS governance, rustc 1.99.0 → 1.99.1 on the same commit (30 entries)
add_neuron_active_maximumadd_neuron_inactive_maximumadd_neuron_active_typicaladd_neuron_inactive_typicallist_ready_to_spawn_neuron_idsunstake_maturity_of_dissolved_neurons::list_neuron_idslist_active_neurons_fund_neuronsunstake_maturity_of_dissolved_neuronscompute_ballots_for_new_proposal_with_stable_neuronslist_neurons_by_subaccountlist_neuronswith_neuron_mut_all_sections_typicalneuron_metrics_calculationrange_neurons_performancerecord_neuron_vote_known_neuron_voting_historysingle_vote_allvoting_power_snapshots_latest_snapshot_timestamp_secondsrecord_known_neuron_votedistribute_rewards_with_stable_neuronsvoting_power_snapshots_is_latest_snapshot_a_spike_falsevoting_power_snapshots_is_latest_snapshot_a_spike_truecentralized_following_allneuron_data_validationwith_neuron_mut_all_sections_maximumdraw_maturity_from_neurons_fundlist_proposalsunstake_maturity_of_dissolved_neurons::unstake_maturitycascading_vote_stable_everythingwith_neuron_mut_main_section_typicalwith_neuron_mut_main_section_maximumOther checks
//rs/recovery/subnet_splitting:integration_testpasses on 1.99.1 without a re-pin.wcslen): compiler-builtins nowprovides a weak
wcslenonwasm32-unknown-unknown. It is only linked when referenced, and nocanister references it: code that did would have failed to link on 1.99.0.
rust-lld):rust-lldcould not load
libLLVM.dylibwhen rustc ran without the rustup proxy. Thearm64-darwinCI job,which builds canister Wasm with Bazel, never hit this: rules_rust unpacks
llvm-toolsinto thesame directory as
rustc, andllvm-toolsshipslibLLVM.dylibinlib/rustlib/<host>/lib/,which is where
rust-lldlooks for it.Cargo.Bazel.*.lockfiles and no third-party cratechanged. rules_rust 0.74.0 ships no checksums for 1.99.1, so the toolchain is downloaded
unverified, as 1.99.0 is today.
bazel build //... --nobuildand buildifier pass. CI passes on all targets(
CI_ALL_BAZEL_TARGETS), including the arm64-linux and arm64-darwin builds and the WindowsPocketIC jobs.
🤖 Generated with Claude Code