about summary refs log tree commit diff
path: root/tests/ui/pattern/rfc-3627-match-ergonomics-2024/experimental/pattern-errors.rs
blob: 1e170b7d3f8e72d1072202be0d42ec2ee0ca48c2 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//@ edition: 2024
//@ revisions: classic structural
//! Test cases for poorly-typed patterns in edition 2024 which are caught by HIR typeck. These must
//! be separate from cases caught by MIR borrowck or the latter errors may not be emitted.
#![allow(incomplete_features)]
#![cfg_attr(classic, feature(ref_pat_eat_one_layer_2024))]
#![cfg_attr(structural, feature(ref_pat_eat_one_layer_2024_structural))]

pub fn main() {
    if let Some(&mut x) = &Some(&mut 0) {
        //[classic]~^ ERROR: mismatched types
        let _: &u32 = x;
    }
    if let Some(&mut Some(&x)) = &Some(&mut Some(0)) {
        //[classic]~^ ERROR: mismatched types
        let _: u32 = x;
    }
    if let Some(Some(&mut x)) = &Some(Some(&mut 0)) {
        //[classic]~^ ERROR: mismatched types
        let _: &u32 = x;
    }

    if let Some(&mut Some(&_)) = &Some(&Some(0)) {
        //~^ ERROR: mismatched types
    }
    if let Some(&Some(&mut _)) = &Some(&mut Some(0)) {
        //[structural]~^ ERROR: mismatched types
    }
    if let Some(&Some(&mut _)) = &mut Some(&Some(0)) {
        //~^ ERROR: mismatched types
    }
    if let Some(&Some(Some((&mut _)))) = &Some(Some(&mut Some(0))) {
        //[structural]~^ ERROR: mismatched types
    }
    if let Some(&mut Some(x)) = &Some(Some(0)) {
        //~^ ERROR: mismatched types
    }
    if let Some(&mut Some(x)) = &Some(Some(0)) {
        //~^ ERROR: mismatched types
    }
}

fn structural_errors_0() {
    let &[&mut x] = &&mut [0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let &[&mut x] = &mut &mut [0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let &[&mut ref x] = &&mut [0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: &u32 = x;

    let &[&mut ref x] = &mut &mut [0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: &u32 = x;

    let &[&mut mut x] = &&mut [0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let &[&mut mut x] = &mut &mut [0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;
}

fn structural_errors_1() {
    let [&(mut x)] = &[&0];
    //[structural]~^ ERROR: binding cannot be both mutable and by-reference
    let _: &u32 = x;

    let [&(mut x)] = &mut [&0];
    //[structural]~^ ERROR: binding cannot be both mutable and by-reference
    let _: &u32 = x;
}

fn structural_errors_2() {
    let [&&mut x] = &[&mut 0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let [&&mut x] = &mut [&mut 0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let [&&mut ref x] = &[&mut 0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: &u32 = x;

    let [&&mut ref x] = &mut [&mut 0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: &u32 = x;

    let [&&mut mut x] = &[&mut 0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let [&&mut mut x] = &mut [&mut 0];
    //[structural]~^ ERROR: mismatched types
    //[structural]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;
}

fn classic_errors_0() {
    let [&mut x] = &[&mut 0];
    //[classic]~^ ERROR: mismatched types
    //[classic]~| cannot match inherited `&` with `&mut` pattern
    let _: &u32 = x;

    let [&mut &x] = &[&mut 0];
    //[classic]~^ ERROR: mismatched types
    //[classic]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;

    let [&mut &ref x] = &[&mut 0];
    //[classic]~^ ERROR: mismatched types
    //[classic]~| cannot match inherited `&` with `&mut` pattern
    let _: &u32 = x;

    let [&mut &(mut x)] = &[&mut 0];
    //[classic]~^ ERROR: mismatched types
    //[classic]~| cannot match inherited `&` with `&mut` pattern
    let _: u32 = x;
}