{"id":"6e23776663942761","repo":"rust-lang/rust","slug":"discriminantkind-is-not-const","errorCode":null,"errorMessage":"DiscriminantKind is not const","messagePattern":"DiscriminantKind is not const","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"compiler/rustc_next_trait_solver/src/solve/effect_goals.rs","lineNumber":413,"sourceCode":"    fn consider_builtin_async_iterator_candidate(\n        _ecx: &mut EvalCtxt<'_, D>,\n        _goal: Goal<I, Self>,\n    ) -> Result<Candidate<I>, NoSolutionOrRerunNonErased> {\n        unreachable!(\"AsyncIterator is not const\")\n    }\n\n    fn consider_builtin_coroutine_candidate(\n        _ecx: &mut EvalCtxt<'_, D>,\n        _goal: Goal<I, Self>,\n    ) -> Result<Candidate<I>, NoSolutionOrRerunNonErased> {\n        unreachable!(\"Coroutine is not const\")\n    }\n\n    fn consider_builtin_discriminant_kind_candidate(\n        _ecx: &mut EvalCtxt<'_, D>,\n        _goal: Goal<I, Self>,\n    ) -> Result<Candidate<I>, NoSolutionOrRerunNonErased> {\n        unreachable!(\"DiscriminantKind is not const\")\n    }\n\n    fn consider_builtin_destruct_candidate(\n        ecx: &mut EvalCtxt<'_, D>,\n        goal: Goal<I, Self>,\n    ) -> Result<Candidate<I>, NoSolutionOrRerunNonErased> {\n        let cx = ecx.cx();\n\n        let self_ty = goal.predicate.self_ty();\n        let const_conditions = structural_traits::const_conditions_for_destruct(cx, self_ty)?;\n\n        ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {\n            ecx.add_goals(\n                GoalSource::AliasBoundConstCondition,\n                const_conditions.into_iter().map(|trait_ref| {\n                    goal.with(\n                        cx,\n                        ty::Binder::dummy(trait_ref)","sourceCodeStart":395,"sourceCodeEnd":431,"githubUrl":"https://github.com/rust-lang/rust/blob/22057b88b091743bc0fd8d592a9264f0a6951403/compiler/rustc_next_trait_solver/src/solve/effect_goals.rs#L395-L431","documentation":"Internal `unreachable!` in the next-gen trait solver's const-effect candidate assembly for `DiscriminantKind` (`core::marker::DiscriminantKind`), the trait backing `core::mem::discriminant`/`mem::Discriminant`. The trait is implemented for every type automatically by the compiler and has no const variant, so probing a const candidate is a routing bug. This ICEs the compiler.","triggerScenarios":"The host-effect solver is asked to prove `T: const DiscriminantKind` (or `~const`) — typically via `mem::discriminant(&t)` or `Discriminant::<T>` referenced inside a `const fn` that propagates a const bound, or via a `#[const_trait]` whose implied bounds include `DiscriminantKind`.","commonSituations":"Calling `mem::discriminant` or pattern-matching with `Discriminant` inside nightly `const fn`; generic const code that auto-derives marker-trait bounds; `-Znext-solver` exposing previously-unhit effect-goal branches; nightly regression after auto-trait/marker const routing changes.","solutions":["Avoid requiring a const bound on `DiscriminantKind`; it is a compiler-implemented marker with no const impl.","Move the `mem::discriminant`/`Discriminant` usage out of the `const fn` or const context.","Report the ICE upstream with the minimal const-fn reproducer and `-Znext-solver` flags.","Bisect nightlies — marker-trait const routing is actively being refined."],"exampleFix":"// before\nconst fn tag<T: const DiscriminantKind>(t: &T) -> Discriminant<T> { discriminant(t) }\n\n// after\nfn tag<T>(t: &T) -> Discriminant<T> { discriminant(t) }","handlingStrategy":"validation","validationCode":"// build.rs: reject const DiscriminantKind effect goals\nfn main() {\n    let src = std::fs::read_to_string(\"src/lib.rs\").unwrap_or_default();\n    for banned in [\"~const DiscriminantKind\", \"const DiscriminantKind\"] {\n        assert!(!src.contains(banned), \"rejected: {banned} — DiscriminantKind has no const builtin candidate\");\n    }\n    println!(\"cargo:rerun-if-changed=src/lib.rs\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["`DiscriminantKind` is structural but its const host-effect candidate is intentionally unreachable (effect_goals.rs:413); never write `T: const DiscriminantKind`.","Read enum tags via `core::mem::discriminant` only in runtime code, not behind const bounds.","In const code, branch on enum variants by direct `match`, which does not require the DiscriminantKind effect goal.","If you only see the ICE with no explicit bound, it is a solver bug — capture the `-Zself-profile`/`--emit=metadata` reproducer."],"tags":["rustc","trait-solver","const-traits","ice","discriminantkind","marker"],"analyzedSha":"22057b88b091743bc0fd8d592a9264f0a6951403","analyzedAt":"2026-08-03T08:09:25.915Z","schemaVersion":2}