blob: 98c4b6e965ba5c78d55bce2f7014df1f6ece4e4c [file] [log] [blame]
//@aux-build:proc_macros.rs
#![warn(clippy::duration_suboptimal_units)]
use std::time::Duration;
const SIXTY: u64 = 60;
macro_rules! mac {
(slow_rythm) => {
3600
};
(duration) => {
Duration::from_mins(5)
//~^ duration_suboptimal_units
};
(arg => $e:expr) => {
Duration::from_secs($e)
};
}
fn main() {
let dur = Duration::from_secs(0);
let dur = Duration::from_secs(42);
let dur = Duration::from_hours(3);
let dur = Duration::from_mins(1);
//~^ duration_suboptimal_units
let dur = Duration::from_mins(3);
//~^ duration_suboptimal_units
let dur = Duration::from_mins(10);
//~^ duration_suboptimal_units
let dur = Duration::from_hours(24);
//~^ duration_suboptimal_units
let dur = Duration::from_secs(5);
//~^ duration_suboptimal_units
let dur = Duration::from_hours(13);
//~^ duration_suboptimal_units
// Constants are intentionally not resolved, as we don't want to recommend a literal value over
// using constants.
let dur = Duration::from_secs(SIXTY);
// Technically it would be nice to use Duration::from_mins(SIXTY) here, but that is a follow-up
let dur = Duration::from_secs(SIXTY * 60);
const {
let dur = Duration::from_secs(0);
let dur = Duration::from_secs(5);
//~^ duration_suboptimal_units
let dur = Duration::from_mins(3);
//~^ duration_suboptimal_units
let dur = Duration::from_hours(24);
//~^ duration_suboptimal_units
let dur = Duration::from_secs(SIXTY);
}
// Qualified Durations must be kept
std::time::Duration::from_mins(1);
//~^ duration_suboptimal_units
// We lint in normal macros
assert_eq!(Duration::from_hours(1), Duration::from_mins(6));
//~^ duration_suboptimal_units
// We lint in normal macros (marker is in macro itself)
let dur = mac!(duration);
// We don't lint in macros if duration comes from outside
let dur = mac!(arg => 3600);
// We don't lint in external macros
let dur = proc_macros::external! { Duration::from_secs(3_600) };
// We don't lint values coming from macros
let dur = Duration::from_secs(mac!(slow_rythm));
}
mod my_duration {
struct Duration {}
impl Duration {
pub const fn from_secs(_secs: u64) -> Self {
Self {}
}
}
fn test() {
// Only suggest the change for std::time::Duration, not for other Duration structs
let dur = Duration::from_secs(60);
}
}