File: nested-undelimited-precedence.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (44 lines) | stat: -rw-r--r-- 1,369 bytes parent folder | download | duplicates (11)
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() {}