// RUN: %check_clang_tidy %s abseil-duration-factory-scale %t -- -- -I%S/Inputs #include "absl/time/time.h" namespace std { typedef long long int64_t; } using int64_t = std::int64_t; void ScaleTest() { absl::Duration d; // Zeroes d = absl::Hours(0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Minutes(0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Seconds(0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Milliseconds(0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Microseconds(0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Nanoseconds(0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Seconds(0.0); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Seconds(0x0.000001p-126f); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Seconds(int{0}); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Seconds(int64_t{0}); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); d = absl::Seconds(float{0}); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use ZeroDuration() for zero-length time intervals [abseil-duration-factory-scale] // CHECK-FIXES: absl::ZeroDuration(); // Fold seconds into minutes d = absl::Seconds(30 * 60); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Minutes(30); d = absl::Seconds(60 * 30); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Minutes(30); // Try a few more exotic multiplications d = absl::Seconds(60 * 30 * 60); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Minutes(60 * 30); d = absl::Seconds(1e-3 * 30); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Milliseconds(30); d = absl::Milliseconds(30 * 1000); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Seconds(30); d = absl::Milliseconds(30 * 0.001); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Microseconds(30); // Multiple steps d = absl::Seconds(5 * 3600); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Hours(5); d = absl::Microseconds(5 * 1e6); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Seconds(5); d = absl::Seconds(5 * 1e-6); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Microseconds(5); d = absl::Microseconds(5 * 1000000); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Seconds(5); // Division d = absl::Hours(30 / 60.); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Minutes(30); d = absl::Seconds(30 / 1000.); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Milliseconds(30); d = absl::Milliseconds(30 / 1e3); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Microseconds(30); d = absl::Seconds(30 / 1e6); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: internal duration scaling can be removed [abseil-duration-factory-scale] // CHECK-FIXES: absl::Microseconds(30); // None of these should trigger the check d = absl::Seconds(60); d = absl::Seconds(int{60}); d = absl::Seconds(float{60}); d = absl::Seconds(60 + 30); d = absl::Seconds(60 - 30); d = absl::Seconds(50 * 30); d = absl::Hours(60 * 60); d = absl::Nanoseconds(1e-3 * 30); d = absl::Seconds(1000 / 30); // We don't support division by integers, which could cause rounding d = absl::Seconds(10 / 1000); d = absl::Seconds(30 / 50); #define EXPRESSION 30 * 60 d = absl::Seconds(EXPRESSION); #undef EXPRESSION // This should not trigger #define HOURS(x) absl::Minutes(60 * x) d = HOURS(40); #undef HOURS }