ab87f72a22
Signed-off-by: Yuki Okushi <jtitor@2k36.org>
88 lines
1.7 KiB
Rust
88 lines
1.7 KiB
Rust
// 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<Inner1>
|
|
where
|
|
Self: Sized,
|
|
{
|
|
fn crash_here()
|
|
where
|
|
Inner1: Default,
|
|
{
|
|
Inner1::default();
|
|
}
|
|
}
|
|
|
|
struct Struct1<T>(T);
|
|
impl<T> Trait1<T> for Struct1<T> {}
|
|
|
|
trait Trait2<Inner2>
|
|
where
|
|
Self: Sized,
|
|
{
|
|
type Assoc: Trait1<Inner2>;
|
|
|
|
fn call_crash()
|
|
where
|
|
Inner2: Default,
|
|
{
|
|
// if Inner2 implements Default, we can call crash_here.
|
|
Self::Assoc::crash_here();
|
|
}
|
|
}
|
|
|
|
struct Struct2<const SIZE1: usize, const SIZE2: usize> {}
|
|
/*
|
|
where
|
|
[(); min(SIZE1, SIZE2)]:,
|
|
{
|
|
elem: [i32; min(SIZE1, SIZE2)],
|
|
}
|
|
*/
|
|
|
|
impl<const SIZE1: usize, const SIZE2: usize> Trait2<[i32; min(SIZE1, SIZE2)]>
|
|
for Struct2<SIZE1, SIZE2>
|
|
{
|
|
type Assoc = Struct1<[i32; min(SIZE1, SIZE2)]>;
|
|
// dose Struct1<[i32; min(SIZE1, SIZE2)]> implement Default?
|
|
}
|
|
|
|
fn main() {
|
|
pattern2();
|
|
|
|
print_fully_name(<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here);
|
|
// <compiler_bug2::Struct1<[i32; 1]> as compiler_bug2::Trait1<[i32; 1]>>::crash_here
|
|
}
|
|
|
|
fn pattern1() {
|
|
// no crash
|
|
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here();
|
|
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::call_crash();
|
|
}
|
|
|
|
fn pattern2() {
|
|
// crash
|
|
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::call_crash();
|
|
|
|
// undefined reference to `compiler_bug2::Trait1::crash_here'
|
|
}
|
|
|
|
fn pattern3() {
|
|
// no crash
|
|
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here();
|
|
}
|
|
|
|
fn print_fully_name<T>(_: T) {
|
|
let _ = std::any::type_name::<T>();
|
|
}
|