Skip to content

Commit ab87f72

Browse files
committed
Add a regression test for #96699
Signed-off-by: Yuki Okushi <[email protected]>
1 parent 1d67eba commit ab87f72

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// check-pass
2+
3+
#![allow(dead_code, incomplete_features)]
4+
#![feature(generic_const_exprs)]
5+
6+
const fn min(a: usize, b: usize) -> usize {
7+
if a < b {
8+
a
9+
} else {
10+
b
11+
}
12+
}
13+
14+
trait Trait1<Inner1>
15+
where
16+
Self: Sized,
17+
{
18+
fn crash_here()
19+
where
20+
Inner1: Default,
21+
{
22+
Inner1::default();
23+
}
24+
}
25+
26+
struct Struct1<T>(T);
27+
impl<T> Trait1<T> for Struct1<T> {}
28+
29+
trait Trait2<Inner2>
30+
where
31+
Self: Sized,
32+
{
33+
type Assoc: Trait1<Inner2>;
34+
35+
fn call_crash()
36+
where
37+
Inner2: Default,
38+
{
39+
// if Inner2 implements Default, we can call crash_here.
40+
Self::Assoc::crash_here();
41+
}
42+
}
43+
44+
struct Struct2<const SIZE1: usize, const SIZE2: usize> {}
45+
/*
46+
where
47+
[(); min(SIZE1, SIZE2)]:,
48+
{
49+
elem: [i32; min(SIZE1, SIZE2)],
50+
}
51+
*/
52+
53+
impl<const SIZE1: usize, const SIZE2: usize> Trait2<[i32; min(SIZE1, SIZE2)]>
54+
for Struct2<SIZE1, SIZE2>
55+
{
56+
type Assoc = Struct1<[i32; min(SIZE1, SIZE2)]>;
57+
// dose Struct1<[i32; min(SIZE1, SIZE2)]> implement Default?
58+
}
59+
60+
fn main() {
61+
pattern2();
62+
63+
print_fully_name(<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here);
64+
// <compiler_bug2::Struct1<[i32; 1]> as compiler_bug2::Trait1<[i32; 1]>>::crash_here
65+
}
66+
67+
fn pattern1() {
68+
// no crash
69+
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here();
70+
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::call_crash();
71+
}
72+
73+
fn pattern2() {
74+
// crash
75+
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::call_crash();
76+
77+
// undefined reference to `compiler_bug2::Trait1::crash_here'
78+
}
79+
80+
fn pattern3() {
81+
// no crash
82+
<Struct2<1, 2> as Trait2<[i32; min(1, 2)]>>::Assoc::crash_here();
83+
}
84+
85+
fn print_fully_name<T>(_: T) {
86+
let _ = std::any::type_name::<T>();
87+
}

0 commit comments

Comments
 (0)