// RUN: %check_clang_tidy %s abseil-duration-addition %t -- -- -I%S/Inputs #include "absl/time/time.h" void f() { absl::Time t; int i; i = absl::ToUnixHours(t) + 5; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixHours(t + absl::Hours(5)) i = absl::ToUnixMinutes(t) + 5; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMinutes(t + absl::Minutes(5)) i = absl::ToUnixSeconds(t) + 5; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixSeconds(t + absl::Seconds(5)) i = absl::ToUnixMillis(t) + 5; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMillis(t + absl::Milliseconds(5)) i = absl::ToUnixMicros(t) + 5; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMicros(t + absl::Microseconds(5)) i = absl::ToUnixNanos(t) + 5; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixNanos(t + absl::Nanoseconds(5)) i = 3 + absl::ToUnixHours(t); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixHours(absl::Hours(3) + t) i = 3 + absl::ToUnixMinutes(t); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMinutes(absl::Minutes(3) + t) i = 3 + absl::ToUnixSeconds(t); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixSeconds(absl::Seconds(3) + t) i = 3 + absl::ToUnixMillis(t); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMillis(absl::Milliseconds(3) + t) i = 3 + absl::ToUnixMicros(t); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMicros(absl::Microseconds(3) + t) i = 3 + absl::ToUnixNanos(t); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixNanos(absl::Nanoseconds(3) + t) // Undoing inverse conversions i = absl::ToUnixMicros(t) + absl::ToInt64Microseconds(absl::Seconds(1)); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixMicros(t + absl::Seconds(1)) // Parens i = 3 + (absl::ToUnixHours(t)); // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixHours(absl::Hours(3) + t) // Float folding i = absl::ToUnixSeconds(t) + 5.0; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixSeconds(t + absl::Seconds(5)) // We can rewrite the argument of the duration conversion #define THIRTY absl::FromUnixSeconds(30) i = absl::ToUnixSeconds(THIRTY) + 1; // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixSeconds(THIRTY + absl::Seconds(1)) #undef THIRTY // Some other contexts if (absl::ToUnixSeconds(t) + 1.0 > 10) {} // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixSeconds(t + absl::Seconds(1)) // These should not match i = 5 + 6; i = absl::ToUnixSeconds(t) - 1.0; i = absl::ToUnixSeconds(t) * 1.0; i = absl::ToUnixSeconds(t) / 1.0; i += absl::ToInt64Microseconds(absl::Seconds(1)); #define PLUS_FIVE(z) absl::ToUnixSeconds(z) + 5 i = PLUS_FIVE(t); #undef PLUS_FIVE } // Within a templated function template<typename T> void foo(absl::Time t) { int i = absl::ToUnixNanos(t) + T{}; // CHECK-MESSAGES: [[@LINE-1]]:11: warning: perform addition in the duration domain [abseil-duration-addition] // CHECK-FIXES: absl::ToUnixNanos(t + absl::Nanoseconds(T{})) } void g() { absl::Time t; foo<int>(t); foo<double>(t); }