Mehdi Akiki
Rust Failure Atlas / failure families

Upgrades and compatibility

A toolchain or edition upgrade exposes a hidden assumption.

This page lists all 78 records in this family. 77 of them have a failing and a repaired fixture, and 16 are keyed to a compiler error code. Use the Atlas search to filter by mechanism, first check, or evidence.

These cases in this family depend on the linker, a native toolchain, the target, a Cargo profile, the test harness, or the runtime. They are also featured on the Atlas front page.

Complete symptom directory

Case identifiers and anchors are stable. Records whose page is not published yet are listed without a link. Records marked “no fixture yet” link to an article and have no executable fixture.

  1. RFA-026 — Rust 2024 drops a temporary earlier, making code fail to compile or changing destructor timing.No fixture yet
  2. RFA-037 — Integer arithmetic panics in a debug build but wraps or produces a different result in a release build.
  3. RFA-081 — A variable or method named `gen` compiles before an edition migration and becomes a reserved-keyword parse error in Rust 2024.
  4. RFA-082 — Rust 2024 rejects `#[no_mangle]` with 'unsafe attribute used without unsafe' even though the function body is safe.
  5. RFA-083 — An `extern "C"` declaration block fails in Rust 2024 because the block is not marked unsafe.
  6. RFA-084 — A previously ordinary call to `std::env::set_var` requires an unsafe block after moving the crate to edition 2024.
  7. RFA-085 — A pattern such as `let [mut value] = &[41]` stops compiling in Rust 2024 because it mixes an implicit borrow with an explicit binding mode.
  8. RFA-119 — Edition 2024 denies creating a shared reference to a mutable static even when the expression is inside unsafe.
  9. RFA-243 — u32::saturating_div panics with a zero divisor although the method name suggests every invalid result will saturate.
  10. RFA-244 — f64::clamp panics when the minimum bound is NaN, while a NaN value being clamped is returned as NaN.
  11. RFA-248 — 0_u32.pow(0) returns 1 when application code expected the ambiguous zero-to-zero case to return zero or fail.
  12. RFA-249 — u32::MAX.checked_next_power_of_two returns None although the input itself is a valid u32 value.
  13. RFA-257 — Zero checked_ilog2 returns None while code expected zero as the bit position or bucket for a zero value.
  14. RFA-258 — u32::is_multiple_of returns true for zero and zero instead of panicking or returning false for every zero divisor.
  15. RFA-259 — Two point five rounded as f64 becomes three instead of the even integer two, while negative two point five becomes negative three.
  16. RFA-264 — Taking abs of i32::MIN overflows: checked builds panic while unchecked-overflow optimized builds can keep the negative minimum.
  17. RFA-273 — For negative seven divided by four, slash returns negative one while i32::div_euclid returns negative two with remainder one.
  18. RFA-274 — Calling leading_zeros on zero u32 returns 32, while code using the count as a logarithm or empty-value sentinel expected zero.
  19. RFA-283 — Range::is_empty returns true for a floating-point range whose endpoint is NaN, grouping incomparable endpoints with non-increasing ranges.
  20. RFA-286 — Iterator::product over an empty iterator of u32 values returns one rather than zero or an absence marker.
  21. RFA-287 — f64::fract on negative 3.6 returns approximately negative 0.6 instead of a normalized positive value between zero and one.
  22. RFA-288 — Duration::checked_div with divisor zero returns None, so immediately unwrapping the checked operation still panics.
  23. RFA-291 — A first iterator that returns None once and Some later loses that later value when it is placed before another iterator with chain.
  24. RFA-292 — After RangeInclusive is iterated to exhaustion, comparing start and end does not reliably reveal that no values remain.
  25. RFA-303 — A value with observable Clone identity appears after its clones when iter::repeat_n is collected rather than appearing first.
  26. RFA-304 — Calling isqrt on a negative signed integer panics instead of returning an integer sentinel or floating-point-style NaN.
  27. RFA-307 — A String retain predicate runs fewer times than String::len for input containing a multibyte Unicode scalar value.
  28. RFA-308 — Calling f64::signum on negative zero returns negative one even though negative zero compares equal to positive zero.
  29. RFA-309 — split_once with an empty delimiter returns a successful pair containing an empty edge instead of reporting no delimiter.
  30. RFA-310 — A scan adapter returns None for one input but produces another value when next is called again manually.
  31. RFA-311 — After try_fold rejects one item, continuing the iterator starts at the following item rather than revisiting the rejected one.
  32. RFA-320 — Taking the minimum of a numeric float and NaN returns the number rather than propagating the invalid floating-point value.
  33. RFA-321 — A fused multiply-add returns a small nonzero residual where the source-equivalent separate multiplication and addition return zero.
  34. RFA-322 — A signed midpoint across a negative odd sum selects the integer nearer zero rather than the lower mathematical integer.
  35. RFA-323 — Rounding an integer to the next configured multiple panics when the configured divisor is zero.
  36. RFA-324 — Case-insensitive comparison succeeds for ASCII letters but rejects corresponding uppercase and lowercase non-ASCII characters.
  37. RFA-325 — Replacing a String range selected with a display-oriented position panics at an endpoint inside a multi-byte UTF-8 scalar.
  38. RFA-333 — Calling duration_since in reversed Instant order returns zero and makes an instrumentation bug resemble a zero-latency operation.
  39. RFA-334 — A Duration round-trip through total nanoseconds becomes much smaller after its u128 total is narrowed to u64.
  40. RFA-335 — Casting 300.0 to u8 produces 255 instead of the wrapped low-byte value familiar from integer narrowing.
  41. RFA-336 — An ASCII-only string containing vertical tab stays one field under split_ascii_whitespace but splits under Unicode split_whitespace.
  42. RFA-341 — A custom iterator produces Some after None, but that later value disappears when the iterator is wrapped with fuse.
  43. RFA-342 — Calling i32::wrapping_shl with shift count 32 returns the original value instead of zero.
  44. RFA-343 — The wrapping absolute value of i32::MIN remains negative and violates an assumed non-negative postcondition.
  45. RFA-348 — Two enum values with different payload data produce equal values from mem::discriminant.
  46. RFA-353 — A secondary comparison with visible work runs even though Ordering::Less already determines the combined comparison result.
  47. RFA-363 — Calling 42_i32.unbounded_shl(32) returns zero rather than masking the count to zero and returning 42.
  48. RFA-364 — i32::MIN.overflowing_div(-1) returns (i32::MIN, true), not a zero placeholder or a representable positive quotient.
  49. RFA-377 — Calling unbounded_shr on a negative i32 with count 32 returns minus one rather than zero.
  50. RFA-378 — i32::MIN.overflowing_rem(-1) returns numerical remainder zero together with an overflow flag of true.
  51. RFA-388 — overflowing_shr with count 32 returns the original i32 value and an overflow flag rather than shifting every bit out.
  52. RFA-392 — skip_while keeps a later value that satisfies the original skip predicate and stops invoking the predicate after its first false result.
  53. RFA-393 — Peekable::next_if returns None for a rejected predicate but the same next element appears on the following next call.
  54. RFA-395 — array::from_fn invokes its stateful closure for indices zero through length-minus-one rather than in reverse or unspecified order.
  55. RFA-397 — Iterator::cmp determines ordering at the first unequal pair and leaves later items unconsumed in both borrowed iterators.
  56. RFA-398 — Iterator::next_chunk produces E0658 on stable Rust 1.98.1 even though its documentation describes partial-item preservation.
  57. RFA-399 — Iterator::advance_by produces E0658 on stable Rust 1.98.1 despite appearing in current standard-library documentation.
  58. RFA-406 — The expression (f64::MAX + f64::MAX) / 2 is infinity while f64::MAX.midpoint(f64::MAX) remains finite.
  59. RFA-417 — u32::ilog(1) panics before returning a result because an integer logarithm base must be at least two.
  60. RFA-427 — A reference written as &Label fails with E0782 in edition 2024 because a trait used as an erased object type must be written &dyn Label.
  61. RFA-438 — Declaring const fn version inside a trait fails with E0379 on Rust 1.98.1 because stable trait function declarations cannot carry const.
  62. RFA-459 — In edition 2024, let [mut value] = &array fails because the outer reference makes the pattern implicitly borrow and mut cannot reset that default binding mode to a by-value mutable binding.
  63. RFA-519 — Manually implementing FnOnce for Increment fails on stable Rust with E0183 and related E0658 diagnostics because the implementation ABI and fn_traits support remain experimental.
  64. RFA-521 — Writing unsafe impl !Send for Local fails with E0198 because a negative implementation cannot carry unsafe.
  65. RFA-701 — Formatting a second integer into one NumBuffer fails with E0499 while the first returned &str is still used later.
  66. RFA-702 — String::from_utf16le returns FromUtf16Error with OddBytes when a byte stream ends halfway through one UTF-16 code unit.
  67. RFA-708 — A repr(transparent) wrapper that previously ignored an empty repr(C) marker now fails with E0690 after upgrading to Rust 1.98.
  68. RFA-709 — A correctly wrapped unsafe(link_section) attribute is still rejected when the crate sets deny(unsafe_code).
  69. RFA-710 — Moving std::env::vars() into thread::spawn fails with E0277 because VarsOs cannot be sent between threads safely.
  70. RFA-711 — A wrapper deriving both PartialOrd and Ord changes comparison results on Rust 1.98 when its field implements those two traits inconsistently.
  71. RFA-712 — Transmuting a repr(align(16)) wrapper around a generic raw pointer back into that pointer fails with E0512 on Rust 1.98.
  72. RFA-713 — Passing pin!(&mut_value) where Pin<&mut T> is expected now produces Pin<&mut &mut T> and fails with E0308.
  73. RFA-716 — A function signature using T::Ty<'r, dyn Inner> fails with E0228 because Rust cannot deduce the trait object's lifetime bound from that associated-type context.
  74. RFA-717 — A repr(transparent) wrapper around u64 and a dependency's zero-sized marker fails with E0690 because the marker type has private fields.
  75. RFA-718 — A repr(transparent) wrapper around u64 and a dependency's non_exhaustive unit struct fails with E0690 even though the marker is zero-sized today.
  76. RFA-719 — Code using #[inline(always(extra))] fails with E0539 on Rust 1.98 even though an older compiler appeared to accept the attribute.
  77. RFA-721 — NonZeroU32::from_str_radix("0", 10).unwrap() panics even though zero is valid decimal syntax and fits inside u32.
  78. RFA-722 — true.ok_or(build_error()) returns Ok(()), but build_error still runs and can allocate, mutate state, log, or perform other unnecessary work.