File: tuple_struct_destructure_fail.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,539 bytes parent folder | download | duplicates (21)
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
struct TupleStruct<S, T>(S, T);

enum Enum<S, T> {
    SingleVariant(S, T)
}

type Alias<S> = Enum<S, isize>;

trait Test {
    fn test() -> TupleStruct<isize, isize> {
        TupleStruct(0, 0)
    }
}

impl Test for Alias<isize> {}

fn test() -> TupleStruct<isize, isize> {
    TupleStruct(0, 0)
}

fn main() {
    let (mut a, mut b);
    TupleStruct(a, .., b, ..) = TupleStruct(0, 1);
    //~^ ERROR `..` can only be used once per tuple struct or variant pattern
    Enum::SingleVariant(a, .., b, ..) = Enum::SingleVariant(0, 1);
    //~^ ERROR `..` can only be used once per tuple struct or variant pattern

    TupleStruct(a, a, b) = TupleStruct(1, 2);
    //~^ ERROR this pattern has 3 fields, but the corresponding tuple struct has 2 fields
    TupleStruct(_) = TupleStruct(1, 2);
    //~^ ERROR this pattern has 1 field, but the corresponding tuple struct has 2 fields
    Enum::SingleVariant(a, a, b) = Enum::SingleVariant(1, 2);
    //~^ ERROR this pattern has 3 fields, but the corresponding tuple variant has 2 fields
    Enum::SingleVariant(_) = Enum::SingleVariant(1, 2);
    //~^ ERROR this pattern has 1 field, but the corresponding tuple variant has 2 fields

    // Check if `test` is recognized as not a tuple struct but a function call:
    test() = TupleStruct(0, 0);
    //~^ ERROR invalid left-hand side of assignment
    (test)() = TupleStruct(0, 0);
    //~^ ERROR invalid left-hand side of assignment
    <Alias::<isize> as Test>::test() = TupleStruct(0, 0);
    //~^ ERROR invalid left-hand side of assignment
}