rust/tests/ui/copies.rs

367 lines
7.0 KiB
Rust
Raw Normal View History

2018-10-06 11:18:06 -05:00
// Copyright 2014-2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution.
//
// 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.
2018-12-09 16:26:16 -06:00
#![allow(
clippy::blacklisted_name,
clippy::collapsible_if,
clippy::cyclomatic_complexity,
clippy::eq_op,
clippy::needless_continue,
clippy::needless_return,
clippy::never_loop,
clippy::no_effect,
clippy::zero_divided_by_zero,
clippy::unused_unit
)]
2018-07-28 10:34:52 -05:00
2016-02-09 18:22:53 -06:00
fn bar<T>(_: T) {}
2018-12-09 16:26:16 -06:00
fn foo() -> bool {
unimplemented!()
}
struct Foo {
bar: u8,
}
pub enum Abc {
A,
B,
C,
}
2018-07-28 10:34:52 -05:00
#[warn(clippy::if_same_then_else)]
#[warn(clippy::match_same_arms)]
2018-09-27 12:10:20 -05:00
#[allow(clippy::unused_unit)]
fn if_same_then_else() -> Result<&'static str, ()> {
if true {
Foo { bar: 42 };
0..10;
..;
0..;
..10;
2017-09-28 12:40:19 -05:00
0..=10;
foo();
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
Foo { bar: 42 };
0..10;
..;
0..;
..10;
2017-09-28 12:40:19 -05:00
0..=10;
foo();
}
if true {
Foo { bar: 42 };
2018-12-09 16:26:16 -06:00
} else {
Foo { bar: 43 };
}
if true {
();
2018-12-09 16:26:16 -06:00
} else {
()
}
if true {
0..10;
2018-12-09 16:26:16 -06:00
} else {
2017-09-28 12:40:19 -05:00
0..=10;
}
if true {
foo();
foo();
2018-12-09 16:26:16 -06:00
} else {
foo();
}
let _ = match 42 {
42 => {
foo();
let mut a = 42 + [23].len() as i32;
if true {
a += 7;
}
2018-12-09 16:26:16 -06:00
a = -31 - a;
a
2018-12-09 16:26:16 -06:00
},
_ => {
//~ ERROR match arms have same body
foo();
let mut a = 42 + [23].len() as i32;
if true {
a += 7;
}
2018-12-09 16:26:16 -06:00
a = -31 - a;
a
2018-12-09 16:26:16 -06:00
},
};
let _ = match Abc::A {
Abc::A => 0,
Abc::B => 1,
_ => 0, //~ ERROR match arms have same body
};
if true {
foo();
}
let _ = if true {
42
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
42
};
2016-01-30 13:10:14 -06:00
if true {
for _ in &[42] {
let foo: &Option<_> = &Some::<u8>(42);
if true {
break;
} else {
continue;
}
}
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
for _ in &[42] {
let foo: &Option<_> = &Some::<u8>(42);
if true {
break;
} else {
continue;
}
}
}
if true {
2018-12-09 16:26:16 -06:00
let bar = if true { 42 } else { 43 };
2016-01-30 13:10:14 -06:00
2018-12-09 16:26:16 -06:00
while foo() {
break;
2016-01-30 13:10:14 -06:00
}
2018-12-09 16:26:16 -06:00
bar + 1;
} else {
//~ ERROR same body as `if` block
let bar = if true { 42 } else { 43 };
2016-01-30 13:10:14 -06:00
2018-12-09 16:26:16 -06:00
while foo() {
break;
}
2016-01-30 13:10:14 -06:00
bar + 1;
}
if true {
2016-02-09 18:22:53 -06:00
let _ = match 42 {
42 => 1,
a if a > 0 => 2,
2017-09-28 12:40:19 -05:00
10..=15 => 3,
2016-02-09 18:22:53 -06:00
_ => 4,
};
2018-12-09 16:26:16 -06:00
} else if false {
foo();
2018-12-09 16:26:16 -06:00
} else if foo() {
2016-02-09 18:22:53 -06:00
let _ = match 42 {
42 => 1,
a if a > 0 => 2,
2017-09-28 12:40:19 -05:00
10..=15 => 3,
2016-02-09 18:22:53 -06:00
_ => 4,
};
2016-01-30 13:10:14 -06:00
}
if true {
if let Some(a) = Some(42) {}
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
if let Some(a) = Some(42) {}
}
if true {
if let (1, .., 3) = (1, 2, 3) {}
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
if let (1, .., 3) = (1, 2, 3) {}
}
if true {
if let (1, .., 3) = (1, 2, 3) {}
2018-12-09 16:26:16 -06:00
} else {
if let (.., 3) = (1, 2, 3) {}
}
if true {
if let (1, .., 3) = (1, 2, 3) {}
2018-12-09 16:26:16 -06:00
} else {
if let (.., 4) = (1, 2, 3) {}
}
if true {
if let (1, .., 3) = (1, 2, 3) {}
2018-12-09 16:26:16 -06:00
} else {
if let (.., 1, 3) = (1, 2, 3) {}
}
if true {
if let Some(42) = None {}
2018-12-09 16:26:16 -06:00
} else {
if let Option::Some(42) = None {}
}
if true {
if let Some(42) = None::<u8> {}
2018-12-09 16:26:16 -06:00
} else {
if let Some(42) = None {}
}
2016-12-02 15:23:24 -06:00
if true {
if let Some(42) = None::<u8> {}
2018-12-09 16:26:16 -06:00
} else {
2016-12-02 15:23:24 -06:00
if let Some(42) = None::<u32> {}
}
if true {
2016-01-30 13:10:14 -06:00
if let Some(a) = Some(42) {}
2018-12-09 16:26:16 -06:00
} else {
if let Some(a) = Some(43) {}
2016-01-30 13:10:14 -06:00
}
2016-02-09 18:22:53 -06:00
let _ = match 42 {
42 => foo(),
51 => foo(), //~ ERROR match arms have same body
2016-02-09 18:22:53 -06:00
_ => true,
};
let _ = match Some(42) {
Some(_) => 24,
None => 24, //~ ERROR match arms have same body
};
2016-05-31 14:50:13 -05:00
let _ = match Some(42) {
Some(foo) => 24,
None => 24,
};
2016-02-09 18:22:53 -06:00
let _ = match Some(42) {
Some(42) => 24,
Some(a) => 24, // bindings are different
None => 0,
};
let _ = match Some(42) {
Some(a) if a > 0 => 24,
Some(a) => 24, // one arm has a guard
None => 0,
};
2016-02-09 18:22:53 -06:00
match (Some(42), Some(42)) {
(Some(a), None) => bar(a),
(None, Some(a)) => bar(a), //~ ERROR match arms have same body
2016-02-09 18:22:53 -06:00
_ => (),
}
match (Some(42), Some(42)) {
(Some(a), ..) => bar(a),
(.., Some(a)) => bar(a), //~ ERROR match arms have same body
_ => (),
}
match (1, 2, 3) {
(1, .., 3) => 42,
(.., 3) => 42, //~ ERROR match arms have same body
_ => 0,
};
let _ = if true {
0.0
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
0.0
};
let _ = if true {
-0.0
} else {
2018-12-09 16:26:16 -06:00
//~ ERROR same body as `if` block
-0.0
};
2018-12-09 16:26:16 -06:00
let _ = if true { 0.0 } else { -0.0 };
2016-07-13 11:35:31 -05:00
// Different NaNs
2018-12-09 16:26:16 -06:00
let _ = if true { 0.0 / 0.0 } else { std::f32::NAN };
2016-07-13 11:35:31 -05:00
// Same NaNs
let _ = if true {
std::f32::NAN
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
2016-07-13 11:35:31 -05:00
std::f32::NAN
};
let _ = match Some(()) {
Some(()) => 0.0,
2018-12-09 16:26:16 -06:00
None => -0.0,
};
2016-02-09 18:22:53 -06:00
match (Some(42), Some("")) {
(Some(a), None) => bar(a),
(None, Some(a)) => bar(a), // bindings have different types
_ => (),
}
if true {
try!(Ok("foo"));
2018-12-09 16:26:16 -06:00
} else {
//~ ERROR same body as `if` block
try!(Ok("foo"));
}
if true {
2016-01-30 13:10:14 -06:00
let foo = "";
return Ok(&foo[0..]);
2018-12-09 16:26:16 -06:00
} else if false {
let foo = "bar";
return Ok(&foo[0..]);
2018-12-09 16:26:16 -06:00
} else {
2016-01-30 13:10:14 -06:00
let foo = "";
return Ok(&foo[0..]);
2016-01-30 13:10:14 -06:00
}
// false positive if_same_then_else, let(x,y) vs let(y,x), see #3559
if true {
let foo = "";
let (x, y) = (1, 2);
return Ok(&foo[x..y]);
} else {
let foo = "";
let (y, x) = (1, 2);
return Ok(&foo[x..y]);
}
}
fn main() {}
// Issue #2423. This was causing an ICE
fn func() {
if true {
f(&[0; 62]);
f(&[0; 4]);
f(&[0; 3]);
} else {
f(&[0; 62]);
f(&[0; 6]);
f(&[0; 6]);
}
}
fn f(val: &[u8]) {}