Skip to content

ICE when generating diagnostic replacement from max_value() to MAX #15805

@SOF3

Description

@SOF3

Summary

pub trait NumericLike:Sized{
    fn saturating_add_usize(self, i: usize) -> Self;

    fn saturating_sub_usize(self, i: usize) -> Self;
}

macro_rules! impl_primitive {
    (
        $ty:ty,
        saturating_add_usize: $self1:ident, $i1:ident => $saturating_add_usize:expr,
        saturating_sub_usize: $self2:ident, $i2:ident => $saturating_sub_usize:expr,
        $metadata:ident => $precision:expr,
        $float:ident => $from_float:expr,
    ) => {
        impl NumericLike for $ty {
            fn saturating_add_usize($self1, $i1: usize) -> Self {
                $saturating_add_usize
            }

            fn saturating_sub_usize($self2, $i2: usize) -> Self {
                $saturating_sub_usize
            }
        }
    }
}

macro_rules! impl_number_signed {
    ($(($ty:ty, $unsigned:ty),)*) => {
        $(
            impl_primitive! {
                $ty,
                saturating_add_usize: self, i => {
                    self.saturating_add_unsigned(<$unsigned>::try_from(i).unwrap_or_else(|_| <$unsigned>::max_value(),
                    // panic line here                                                                    ^^^^^^^^^^^ 33:107 to 33:118
                    //                                                                                    ^^^^^^^^^   33:107 to 33:116
                    ))
                },
                saturating_sub_usize: self, i => {
                    self.saturating_sub_unsigned(<$unsigned>::try_from(i).unwrap_or_else(|_| <$unsigned>::max_value()))
                },
                metadata => { metadata.precision.map(|n| n as f64) },
                float => { float.round() as $ty },
            }
        )*
    };
}

impl_number_signed! {
    (i8, u8),
}

Version

rustc 1.91.0-beta.4 (aa7859c0d 2025-09-27)
binary: rustc
commit-hash: aa7859c0dec2de6c9cab34b03028bcef7b1fc25d
commit-date: 2025-09-27
host: x86_64-unknown-linux-gnu
release: 1.91.0-beta.4
LLVM version: 21.1.1

Error output

Backtrace

thread 'rustc' (198485) panicked at compiler/rustc_errors/src/lib.rs:385:17:
assertion `left == right` failed: all spans must be disjoint
left: Some([SubstitutionPart { span: src/lib.rs:33:107: 33:118 (#4), snippet: "MAX" }, SubstitutionPart { span: src/lib.rs:33:107: 33:116 (#4), snippet: "::" }])
right: None
stack backtrace:
 0: __rustc::rust_begin_unwind
 1: core::panicking::panic_fmt
 2: core::panicking::assert_failed_inner
 3: core::panicking::assert_failed::<core::option::Option<&[rustc_errors::SubstitutionPart; 2]>, core::option::Option<&[rustc_errors::SubstitutionPart; 2]>>
 4: <core::iter::adapters::filter_map::FilterMap<core::iter::adapters::cloned::Cloned<core::iter::adapters::filter::Filter<core::slice::iter::Iter<rustc_errors::Substitution>, <rustc_errors::CodeSuggestion>::splice_lines::{closure#0}>>, <rustc_errors::CodeSuggestion>::splice_lines::{closure#1}> as core::iter::traits::iterator::Iterator>::next
 5: <rustc_errors::emitter::HumanEmitter>::emit_suggestion_default
 6: <rustc_errors::emitter::HumanEmitter as rustc_errors::emitter::Emitter>::emit_diagnostic
 7: <rustc_errors::json::Diagnostic>::from_errors_diagnostic
 8: <rustc_errors::json::JsonEmitter as rustc_errors::emitter::Emitter>::emit_diagnostic
 9: <rustc_errors::DiagCtxtInner>::emit_diagnostic::{closure#3}
10: rustc_interface::callbacks::track_diagnostic::<core::option::Option<rustc_span::ErrorGuaranteed>>
11: <rustc_errors::DiagCtxtInner>::emit_diagnostic
12: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
13: <() as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
14: rustc_middle::lint::lint_level::lint_level_impl
15: <rustc_lint::context::LateContext as rustc_lint::context::LintContext>::opt_span_lint::<rustc_span::span_encoding::Span, clippy_utils::diagnostics::span_lint_and_then<rustc_lint::context::LateContext, rustc_span::span_encoding::Span, &str, <clippy_lints::legacy_numeric_constants::LegacyNumericConstants as rustc_lint::passes::LateLintPass>::check_expr::{closure#1}>::{closure#0}>
16: <clippy_lints::legacy_numeric_constants::LegacyNumericConstants as rustc_lint::passes::LateLintPass>::check_expr
17: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
18: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
19: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
20: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_fn
21: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
22: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
23: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
24: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
25: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
26: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
27: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_block
28: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
29: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
30: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_block
31: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
32: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
33: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
34: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_fn
35: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_item
36: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>::process_mod
37: rustc_lint::late::check_crate::{closure#0}
38: rustc_lint::late::check_crate
39: rustc_interface::passes::analysis
    [... omitted 1 frame ...]
40: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
41: rustc_interface::interface::run_compiler::<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust-clippy/issues/new?template=ice.yml

note: rustc 1.91.0-beta.4 (aa7859c0d 2025-09-27) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type lib -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [analysis] running analysis passes on this crate
end of query stack
note: Clippy version: clippy 0.1.91 (aa7859c0de 2025-09-27)

error: could not compile `tmp` (lib)

Caused by:
process didn't exit successfully: `/home/sofe/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/bin/clippy-driver /home/sofe/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/bin/rustc --crate-name tmp --edition=2024 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=238 --crate-type lib --emit=dep-info,metadata -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=10a479b13c283cde -C extra-filename=-bd475d7d96085378 --out-dir /home/sofe/tmp/target/debug/deps -C incremental=/home/sofe/tmp/target/debug/incremental -L dependency=/home/sofe/tmp/target/debug/deps` (exit status: 101)

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-ICEIssue: Clippy panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions