// check-pass #![allow(dead_code, incomplete_features)] #![feature(generic_const_exprs)] const fn min(a: usize, b: usize) -> usize { if a < b { a } else { b } } trait Trait1 where Self: Sized, { fn crash_here() where Inner1: Default, { Inner1::default(); } } struct Struct1(T); impl Trait1 for Struct1 {} trait Trait2 where Self: Sized, { type Assoc: Trait1; fn call_crash() where Inner2: Default, { // if Inner2 implements Default, we can call crash_here. Self::Assoc::crash_here(); } } struct Struct2 {} /* where [(); min(SIZE1, SIZE2)]:, { elem: [i32; min(SIZE1, SIZE2)], } */ impl Trait2<[i32; min(SIZE1, SIZE2)]> for Struct2 { type Assoc = Struct1<[i32; min(SIZE1, SIZE2)]>; // dose Struct1<[i32; min(SIZE1, SIZE2)]> implement Default? } fn main() { pattern2(); print_fully_name( as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here); // as compiler_bug2::Trait1<[i32; 1]>>::crash_here } fn pattern1() { // no crash as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here(); as Trait2<[i32; min(1, 2)]>>::call_crash(); } fn pattern2() { // crash as Trait2<[i32; min(1, 2)]>>::call_crash(); // undefined reference to `compiler_bug2::Trait1::crash_here' } fn pattern3() { // no crash as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here(); } fn print_fully_name(_: T) { let _ = std::any::type_name::(); }