diff options
| author | Yuki Okushi <jtitor@2k36.org> | 2023-06-24 14:46:02 +0900 |
|---|---|---|
| committer | Yuki Okushi <jtitor@2k36.org> | 2023-06-24 14:46:02 +0900 |
| commit | ab87f72a22e51ba63cf979b03e9d4da94eab918a (patch) | |
| tree | d3b3c41606b9adc020b2e3c4baa03288889e5a6a | |
| parent | 1d67eba6873b1d551a259a0bbc1e2651b4443e12 (diff) | |
| download | rust-ab87f72a22e51ba63cf979b03e9d4da94eab918a.tar.gz rust-ab87f72a22e51ba63cf979b03e9d4da94eab918a.zip | |
Add a regression test for #96699
Signed-off-by: Yuki Okushi <jtitor@2k36.org>
| -rw-r--r-- | tests/ui/const-generics/generic_const_exprs/issue-96699.rs | 87 |
1 files changed, 87 insertions, 0 deletions
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 00000000000..83f329d2a2d --- /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<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>(); +} |
