summaryrefslogtreecommitdiffstats
path: root/tests/ui/or-patterns/nested-undelimited-precedence.rs
blob: 047836203575ffb814eb6ca72d9bf841d493371c (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
// This test tests the precedence of `|` (or-patterns) undelimited nested patterns. In particular,
// we want to reserve the syntactic space of a pattern followed by a type annotation for possible
// future type ascription, so we need to make sure that any time a pattern is followed by type
// annotation (for now), the pattern is not a top-level or-pattern. However, there are also a few
// types of patterns that allow undelimited subpatterns that could cause the same ambiguity.
// Currently, those should be impossible due to precedence rule. This test enforces that.

enum E {
    A,
    B,
}

fn foo() {
    use E::*;

    // ok
    let b @ (A | B): E = A;

    let b @ A | B: E = A; //~ERROR `b` is not bound in all patterns
    //~^ ERROR top-level or-patterns are not allowed
}

enum F {
    A(usize),
    B(usize),
}

fn bar() {
    use F::*;

    // ok
    let (A(x) | B(x)): F = A(3);

    let &A(_) | B(_): F = A(3); //~ERROR mismatched types
    //~^ ERROR top-level or-patterns are not allowed
    let &&A(_) | B(_): F = A(3); //~ERROR mismatched types
    //~^ ERROR top-level or-patterns are not allowed
    let &mut A(_) | B(_): F = A(3); //~ERROR mismatched types
    //~^ ERROR top-level or-patterns are not allowed
    let &&mut A(_) | B(_): F = A(3); //~ERROR mismatched types
    //~^ ERROR top-level or-patterns are not allowed
}

fn main() {}