| //@aux-build:proc_macros.rs | |
| #![warn(clippy::duration_suboptimal_units)] | |
| use std::time::Duration; | |
| const SIXTY: u64 = 60; | |
| macro_rules! mac { | |
| (slow_rhythm) => { | |
| 60 * 60 | |
| }; | |
| (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(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_millis(5_000); | |
| let dur = Duration::from_secs(5); | |
| //~^ duration_suboptimal_units | |
| let dur = Duration::from_secs(11); | |
| //~^ duration_suboptimal_units | |
| let dur = Duration::from_secs(180); | |
| // 39600 secs = 11 hours | |
| let dur = Duration::from_hours(11); | |
| //~^ 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(12); | |
| //~^ duration_suboptimal_units | |
| // We lint in normal macros | |
| assert_eq!(Duration::from_secs(3_600), Duration::from_mins(6)); | |
| 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 => 60 * 60); | |
| // We don't lint in external macros | |
| let dur = proc_macros::external! { Duration::from_secs(60 * 60) }; | |
| // We don't lint values coming from macros | |
| let dur = Duration::from_secs(mac!(slow_rhythm)); | |
| } | |
| 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); | |
| } | |
| } | |
| fn issue16457() { | |
| // Methods taking something else than `u64` are not covered | |
| _ = Duration::from_nanos_u128(1 << 90); | |
| } | |
| #[clippy::msrv = "1.90"] | |
| fn insufficient_msrv() { | |
| _ = Duration::from_secs(67_768_040_922_076_800); | |
| } | |
| #[clippy::msrv = "1.91"] | |
| fn sufficient_msrv() { | |
| _ = Duration::from_hours(18824455811688); | |
| //~^ duration_suboptimal_units | |
| } | |
| fn issue16532() { | |
| // Literals with small promoted values should not lint (issue #16532) | |
| let dur = Duration::from_secs(60); | |
| let dur = Duration::from_secs(180); | |
| let dur = Duration::from_millis(5_000); | |
| let dur = Duration::from_millis(1_000); | |
| let dur = Duration::from_secs(3_600); | |
| let dur = Duration::from_secs(600); | |
| // Literals with larger promoted values should lint | |
| let dur = Duration::from_secs(20); | |
| //~^ duration_suboptimal_units | |
| let dur = Duration::from_hours(12); | |
| //~^ duration_suboptimal_units | |
| let dur = Duration::from_mins(11); | |
| //~^ duration_suboptimal_units | |
| // Expressions should always be promoted, as they show intent to use a larger unit | |
| // 5 minutes | |
| let dur = Duration::from_mins(5); | |
| //~^ duration_suboptimal_units | |
| // 2 Hours | |
| let dur = Duration::from_hours(2); | |
| //~^ duration_suboptimal_units | |
| // Daily | |
| let dur = Duration::from_hours(24); | |
| //~^ duration_suboptimal_units | |
| } |