summary refs log tree commit diff
path: root/src/test/compile-fail/non-exhaustive-match.rs
blob: 017baacc9d329b771f7e40f295acbbfafeb03a24 (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
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

enum t { a, b, }

fn main() {
    let x = t::a;
    match x { t::b => { } } //~ ERROR non-exhaustive patterns: `a` not covered
    match true { //~ ERROR non-exhaustive patterns: `false` not covered
      true => {}
    }
    match Some(10) { //~ ERROR non-exhaustive patterns: `Some(_)` not covered
      None => {}
    }
    match (2, 3, 4) { //~ ERROR non-exhaustive patterns: `(_, _, _)` not covered
      (_, _, 4) => {}
    }
    match (t::a, t::a) { //~ ERROR non-exhaustive patterns: `(a, a)` not covered
      (t::a, t::b) => {}
      (t::b, t::a) => {}
    }
    match t::a { //~ ERROR non-exhaustive patterns: `b` not covered
      t::a => {}
    }
    // This is exhaustive, though the algorithm got it wrong at one point
    match (t::a, t::b) {
      (t::a, _) => {}
      (_, t::a) => {}
      (t::b, t::b) => {}
    }
    let vec = vec!(Some(42), None, Some(21));
    let vec: &[Option<isize>] = &vec;
    match *vec { //~ ERROR non-exhaustive patterns: `[]` not covered
        [Some(..), None, ref tail..] => {}
        [Some(..), Some(..), ref tail..] => {}
        [None] => {}
    }
    let vec = vec!(1);
    let vec: &[isize] = &vec;
    match *vec {
        [_, ref tail..] => (),
        [] => ()
    }
    let vec = vec!(0.5f32);
    let vec: &[f32] = &vec;
    match *vec { //~ ERROR non-exhaustive patterns: `[_, _, _, _]` not covered
        [0.1, 0.2, 0.3] => (),
        [0.1, 0.2] => (),
        [0.1] => (),
        [] => ()
    }
    let vec = vec!(Some(42), None, Some(21));
    let vec: &[Option<isize>] = &vec;
    match *vec {
        [Some(..), None, ref tail..] => {}
        [Some(..), Some(..), ref tail..] => {}
        [None, None, ref tail..] => {}
        [None, Some(..), ref tail..] => {}
        [Some(_)] => {}
        [None] => {}
        [] => {}
    }
}