From ab87f72a22e51ba63cf979b03e9d4da94eab918a Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Sat, 24 Jun 2023 14:46:02 +0900 Subject: [PATCH] Add a regression test for #96699 Signed-off-by: Yuki Okushi --- .../generic_const_exprs/issue-96699.rs | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 tests/ui/const-generics/generic_const_exprs/issue-96699.rs diff --git a/tests/ui/const-generics/generic_const_exprs/issue-96699.rs b/tests/ui/const-generics/generic_const_exprs/issue-96699.rs new file mode 100644 index 0000000000000..83f329d2a2dff --- /dev/null +++ b/tests/ui/const-generics/generic_const_exprs/issue-96699.rs @@ -0,0 +1,87 @@ +// 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::(); +}