2 #![feature(exclusive_range_pattern)]
6 #![allow(unused, if_let_redundant_pattern_matching)]
7 #![warn(single_match_else, match_same_arms)]
15 static NODE: ExprNode = ExprNode::Unicorns;
20 fn unwrap_addr() -> Option<&'static ExprNode> {
21 match ExprNode::Butterflies {
22 ExprNode::ExprAddrOf => Some(&NODE),
23 _ => { let x = 5; None },
28 let test: bool = true;
43 false => { println!("Noooo!"); }
47 false => { println!("Noooo!"); }
52 false => { println!("Noooo!"); }
57 false => { println!("Noooo!"); }
58 true => { println!("Yes!"); }
73 &Some(v) => println!("{:?}", v),
74 &None => println!("none"),
76 match v { // this doesn't trigger, we have a different pattern
77 &Some(v) => println!("some"),
78 other => println!("other"),
83 &(v, 1) => println!("{}", v),
84 _ => println!("none"),
86 // special case: using & both in expr and pats
89 &Some(v) => println!("{:?}", v),
90 &None => println!("none"),
92 // false positive: only wildcard pattern
95 _ => println!("none"),
113 0 ... 10 => println!("0 ... 10"),
114 0 ... 11 => println!("0 ... 11"),
119 0 ... 5 => println!("0 ... 5"),
120 6 ... 7 => println!("6 ... 7"),
121 FOO ... 11 => println!("0 ... 11"),
127 0 ... 5 => println!("0 ... 5"),
133 0 ... 2 => println!("0 ... 2"),
138 0 ... 10 => println!("0 ... 10"),
139 11 ... 50 => println!("11 ... 50"),
145 0 .. 2 => println!("0 .. 2"),
150 0 .. 10 => println!("0 .. 10"),
151 10 .. 50 => println!("10 .. 50"),
156 0 .. 11 => println!("0 .. 11"),
157 0 ... 11 => println!("0 ... 11"),
161 if let None = Some(42) {
163 } else if let None = Some(42) {
164 // another nothing :-)
168 fn match_wild_err_arm() {
169 let x: Result<i32, &str> = Ok(3);
172 Ok(3) => println!("ok"),
173 Ok(_) => println!("ok"),
174 Err(_) => panic!("err")
178 Ok(3) => println!("ok"),
179 Ok(_) => println!("ok"),
184 Ok(3) => println!("ok"),
185 Ok(_) => println!("ok"),
186 Err(_) => {panic!();}
189 // allowed when not with `panic!` block
191 Ok(3) => println!("ok"),
192 Ok(_) => println!("ok"),
193 Err(_) => println!("err")
196 // allowed when used with `unreachable!`
198 Ok(3) => println!("ok"),
199 Ok(_) => println!("ok"),
200 Err(_) => {unreachable!()}
204 Ok(3) => println!("ok"),
205 Ok(_) => println!("ok"),
206 Err(_) => unreachable!()
210 Ok(3) => println!("ok"),
211 Ok(_) => println!("ok"),
212 Err(_) => {unreachable!();}
215 // no warning because of the guard
217 Ok(x) if x*x == 64 => println!("ok"),
218 Ok(_) => println!("ok"),
219 Err(_) => println!("err")
222 // this used to be a false positive, see #1996
224 Ok(3) => println!("ok"),
225 Ok(x) if x*x == 64 => println!("ok 64"),
226 Ok(_) => println!("ok"),
227 Err(_) => println!("err")
230 match (x, Some(1i32)) {
231 (Ok(x), Some(_)) => println!("ok {}", x),
232 (Ok(_), Some(x)) => println!("ok {}", x),
236 // no warning because of the different types for x
237 match (x, Some(1.0f64)) {
238 (Ok(x), Some(_)) => println!("ok {}", x),
239 (Ok(_), Some(x)) => println!("ok {}", x),
243 // because of a bug, no warning was generated for this case before #2251
245 Ok(_tmp) => println!("ok"),
246 Ok(3) => println!("ok"),
247 Ok(_) => println!("ok"),
248 Err(_) => {unreachable!();}
253 let owned: Option<()> = None;
254 let borrowed: Option<&()> = match owned {
256 Some(ref v) => Some(v),
259 let mut mut_owned: Option<()> = None;
260 let borrow_mut: Option<&mut ()> = match mut_owned {
262 Some(ref mut v) => Some(v),