summaryrefslogtreecommitdiffstats
path: root/tests/ui/const-generics/generic_const_exprs/issue-96699.rs
blob: 83f329d2a2dffb43e2512a55813565c15ef2e95d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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>();
}