| #![allow(non_local_definitions, clippy::manual_repeat_n)] | |
| #![warn(clippy::manual_str_repeat)] | |
| use std::borrow::Cow; | |
| use std::iter::repeat; | |
| fn main() { | |
| let _: String = "test".repeat(10); | |
| //~^ manual_str_repeat | |
| let _: String = "x".repeat(10); | |
| //~^ manual_str_repeat | |
| let _: String = "'".repeat(10); | |
| //~^ manual_str_repeat | |
| let _: String = "\"".repeat(10); | |
| //~^ manual_str_repeat | |
| let x = "test"; | |
| let count = 10; | |
| let _ = x.repeat(count + 2); | |
| //~^ manual_str_repeat | |
| macro_rules! m { | |
| ($e:expr) => {{ $e }}; | |
| } | |
| // FIXME: macro args are fine | |
| let _: String = repeat(m!("test")).take(m!(count)).collect(); | |
| let x = &x; | |
| let _: String = (*x).repeat(count); | |
| //~^ manual_str_repeat | |
| macro_rules! repeat_m { | |
| ($e:expr) => {{ repeat($e) }}; | |
| } | |
| // Don't lint, repeat is from a macro. | |
| let _: String = repeat_m!("test").take(count).collect(); | |
| let x: Box<str> = Box::from("test"); | |
| let _: String = x.repeat(count); | |
| //~^ manual_str_repeat | |
| #[derive(Clone)] | |
| struct S; | |
| impl FromIterator<Box<S>> for String { | |
| fn from_iter<T: IntoIterator<Item = Box<S>>>(_: T) -> Self { | |
| Self::new() | |
| } | |
| } | |
| // Don't lint, wrong box type | |
| let _: String = repeat(Box::new(S)).take(count).collect(); | |
| let _: String = Cow::Borrowed("test").repeat(count); | |
| //~^ manual_str_repeat | |
| let x = "x".to_owned(); | |
| let _: String = x.repeat(count); | |
| //~^ manual_str_repeat | |
| let x = 'x'; | |
| // Don't lint, not char literal | |
| let _: String = repeat(x).take(count).collect(); | |
| } | |
| #[clippy::msrv = "1.15"] | |
| fn _msrv_1_15() { | |
| // `str::repeat` was stabilized in 1.16. Do not lint this | |
| let _: String = std::iter::repeat("test").take(10).collect(); | |
| } | |
| #[clippy::msrv = "1.16"] | |
| fn _msrv_1_16() { | |
| let _: String = "test".repeat(10); | |
| //~^ manual_str_repeat | |
| } |