Change:
<!-- [31mICE[0m: Rustc '-Zincremental-verify-ich=yes -Cincremental=<dir-Cdebuginfo=2' 'error: internal compiler error: Unexpected node AnonConst(AnonConst { hirid: HirId(DefId(0:35 ~ [f939]::N).1), defid: DefId(0:37 ~ [f939]::N::{constant}), body: BodyId { hirid: HirId(DefId(0:35 ~ [f939]::N).2) } })', 'error: internal compiler error: Unexpected node AnonConst(AnonConst { hirid: HirId(DefId(0:35 ~ [f939]::N).1), defid: DefId(0:37 ~ [f939]::N::{constant}), body: BodyId { hirid: HirId(DefId(0:35 ~ [f939]::N).2) } })' File: --auto-reduced (treereduce-rust): original: Version information ` Command: <!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongProgram output</strong</summary<p</p</details<!-- query stack: note: compiler flags: -Z incremental-verify-ich=yes -C incremental=[REDACTED] -C debuginfo=2 [diagnostichirwfcheck] performing HIR wf-checking for predicate at item [typeck] type-checking [checkmatch] match-checking [mirbuilt] building MIR for [mirconst] preparing for borrow checking [mirconstqualif] const checking [mirpromoted] promoting constants in MIR for [mirborrowck] borrow-checking [mirdropselaboratedandconstchecked] elaborating drops for [mirforctfe] caching mir of for CTFE [evaltoallocationraw] const-evaluating + checking [evaltovaltree] evaluating type-level constant [paramenv] computing normalized predicates of [checkwellformed] checking that is well-formed [checkmodtype_wf] checking that types are well-formed in top-level module [analysis] running analysis passes on this crate --
bisects to
Slightly smaller:

Discussion:
kind: hir::GenericParamKind::Type { default: Some(ty), .. }, .. }) => vec![*ty], <del> hir::Node::AnonConst(_) if let Some(const_param_id) = tcx.hir().opt_const_param_default_param_def_id(hir_id) </del> <ins> hir::Node::AnonConst(_) => { if let Some(const_param_id) = tcx.hir().opt_const_param_default_param_def_id(hir_id) </ins> && let hir::Node::GenericParam(hir::GenericParam { kind: hir::GenericParamKind::Const { ty, .. }, .. <del> }) = tcx.hir_node_by_def_id(const_param_id) => { vec![*ty] </del> <ins> }) = tcx.hir_node_by_def_id(const_param_id) { vec![*ty] } else { vec![] } </ins> } ref node => bug!("Unexpected node {:?}", node), },

<del> //@ known-bug: #122989 trait Traitor<const N: N<2> = 1, const N: N<2> = N> { fn N(&N) -> N<2> { M } } trait N<const N: Traitor<2> = 12> {} </del>

<ins> // Regression test for ICE #122989 trait Foo<const N: Bar<2>> { //~^ WARN trait objects without an explicit `dyn` are deprecated //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| ERROR cycle detected when computing type of `Foo::N` //~| ERROR cycle detected when computing type of `Foo::N` //~| ERROR the trait `Foo` cannot be made into an object //~| ERROR the trait `Foo` cannot be made into an object //~| ERROR the trait `Foo` cannot be made into an object //~| ERROR `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter fn func() { } } trait Bar<const M: Foo<2>> {} //~^ WARN trait objects without an explicit `dyn` are deprecated //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| ERROR the trait `Foo` cannot be made into an object //~| ERROR `(dyn Foo<2> + 'static)` is forbidden as the type of a const generic parameter fn main() {} </ins>

<ins> warning: trait objects without an explicit `dyn` are deprecated --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:20 | LL | trait Foo<const N: Bar<2>> { |                    ^^^^^^ | = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html> = note: `#[warn(bare_trait_objects)]` on by default help: if this is an object-safe trait, use `dyn` | LL | trait Foo<const N: dyn Bar<2>> { |                    +++ warning: trait objects without an explicit `dyn` are deprecated --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:20 | LL | trait Bar<const M: Foo<2>> {} |                    ^^^^^^ | = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html> help: if this is an object-safe trait, use `dyn` | LL | trait Bar<const M: dyn Foo<2>> {} |                    +++ error[E0391]: cycle detected when computing type of `Foo::N` --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11 | LL | trait Foo<const N: Bar<2>> { |           ^^^^^^^^^^^^^^^ | note: ...which requires computing type of `Bar::M`... --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:11 | LL | trait Bar<const M: Foo<2>> {} |           ^^^^^^^^^^^^^^^ = note: ...which again requires computing type of `Foo::N`, completing the cycle note: cycle used when computing explicit predicates of trait `Foo` --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:1 | LL | trait Foo<const N: Bar<2>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information error[E0391]: cycle detected when computing type of `Foo::N` --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11 | LL | trait Foo<const N: Bar<2>> { |           ^^^^^^^^^^^^^^^ | note: ...which requires computing type of `Bar::M`... --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:11 | LL | trait Bar<const M: Foo<2>> {} |           ^^^^^^^^^^^^^^^ = note: ...which again requires computing type of `Foo::N`, completing the cycle note: cycle used when computing explicit predicates of trait `Foo` --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:1 | LL | trait Foo<const N: Bar<2>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:24 | LL | trait Foo<const N: Bar<2>> { |                        ^ `Foo` cannot be made into an object | note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8 | LL | trait Foo<const N: Bar<2>> { |       --- this trait cannot be made into an object... ... LL |     fn func() { |        ^^^^ ...because associated function `func` has no `self` parameter help: consider turning `func` into a method by giving it a `&self` argument | LL |     fn func(&self) { |             +++++ help: alternatively, consider constraining `func` so it does not apply to trait objects | LL |     fn func() where Self: Sized { |               +++++++++++++++++ error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11 | LL | trait Foo<const N: Bar<2>> { |           ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object | note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8 | LL | trait Foo<const N: Bar<2>> { |       --- this trait cannot be made into an object... ... LL |     fn func() { |        ^^^^ ...because associated function `func` has no `self` parameter help: consider turning `func` into a method by giving it a `&self` argument | LL |     fn func(&self) { |             +++++ help: alternatively, consider constraining `func` so it does not apply to trait objects | LL |     fn func() where Self: Sized { |               +++++++++++++++++ error: `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:20 | LL | trait Foo<const N: Bar<2>> { |                    ^^^^^^ | = note: the only supported types are integers, `bool` and `char` error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:11 | LL | trait Bar<const M: Foo<2>> {} |           ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object | note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8 | LL | trait Foo<const N: Bar<2>> { |       --- this trait cannot be made into an object... ... LL |     fn func() { |        ^^^^ ...because associated function `func` has no `self` parameter help: consider turning `func` into a method by giving it a `&self` argument | LL |     fn func(&self) { |             +++++ help: alternatively, consider constraining `func` so it does not apply to trait objects | LL |     fn func() where Self: Sized { |               +++++++++++++++++ error: `(dyn Foo<2> + 'static)` is forbidden as the type of a const generic parameter --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:20 | LL | trait Bar<const M: Foo<2>> {} |                    ^^^^^^ | = note: the only supported types are integers, `bool` and `char` error[E0038]: the trait `Foo` cannot be made into an object --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11 | LL | trait Foo<const N: Bar<2>> { |           ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object | note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8 | LL | trait Foo<const N: Bar<2>> { |       --- this trait cannot be made into an object... ... LL |     fn func() { |        ^^^^ ...because associated function `func` has no `self` parameter = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` help: consider turning `func` into a method by giving it a `&self` argument | LL |     fn func(&self) { |             +++++ help: alternatively, consider constraining `func` so it does not apply to trait objects | LL |     fn func() where Self: Sized { |               +++++++++++++++++ error: aborting due to 8 previous errors; 2 warnings emitted Some errors have detailed explanations: E0038, E0391. For more information about an error, try `rustc --explain E0038`. </ins>