99 lines · cpp
1// RUN: %check_clang_tidy %s abseil-duration-addition %t -- -- -I%S/Inputs2 3#include "absl/time/time.h"4 5void f() {6 absl::Time t;7 int i;8 9 i = absl::ToUnixHours(t) + 5;10 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]11 // CHECK-FIXES: i = absl::ToUnixHours(t + absl::Hours(5));12 i = absl::ToUnixMinutes(t) + 5;13 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]14 // CHECK-FIXES: i = absl::ToUnixMinutes(t + absl::Minutes(5));15 i = absl::ToUnixSeconds(t) + 5;16 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]17 // CHECK-FIXES: i = absl::ToUnixSeconds(t + absl::Seconds(5));18 i = absl::ToUnixMillis(t) + 5;19 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]20 // CHECK-FIXES: i = absl::ToUnixMillis(t + absl::Milliseconds(5));21 i = absl::ToUnixMicros(t) + 5;22 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]23 // CHECK-FIXES: i = absl::ToUnixMicros(t + absl::Microseconds(5));24 i = absl::ToUnixNanos(t) + 5;25 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]26 // CHECK-FIXES: i = absl::ToUnixNanos(t + absl::Nanoseconds(5));27 28 i = 3 + absl::ToUnixHours(t);29 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]30 // CHECK-FIXES: i = absl::ToUnixHours(absl::Hours(3) + t);31 i = 3 + absl::ToUnixMinutes(t);32 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]33 // CHECK-FIXES: i = absl::ToUnixMinutes(absl::Minutes(3) + t);34 i = 3 + absl::ToUnixSeconds(t);35 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]36 // CHECK-FIXES: i = absl::ToUnixSeconds(absl::Seconds(3) + t);37 i = 3 + absl::ToUnixMillis(t);38 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]39 // CHECK-FIXES: i = absl::ToUnixMillis(absl::Milliseconds(3) + t);40 i = 3 + absl::ToUnixMicros(t);41 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]42 // CHECK-FIXES: i = absl::ToUnixMicros(absl::Microseconds(3) + t);43 i = 3 + absl::ToUnixNanos(t);44 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]45 // CHECK-FIXES: i = absl::ToUnixNanos(absl::Nanoseconds(3) + t);46 47 // Undoing inverse conversions48 i = absl::ToUnixMicros(t) + absl::ToInt64Microseconds(absl::Seconds(1));49 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]50 // CHECK-FIXES: i = absl::ToUnixMicros(t + absl::Seconds(1));51 52 // Parens53 i = 3 + (absl::ToUnixHours(t));54 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]55 // CHECK-FIXES: i = absl::ToUnixHours(absl::Hours(3) + t);56 57 // Float folding58 i = absl::ToUnixSeconds(t) + 5.0;59 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]60 // CHECK-FIXES: i = absl::ToUnixSeconds(t + absl::Seconds(5));61 62 // We can rewrite the argument of the duration conversion63#define THIRTY absl::FromUnixSeconds(30)64 i = absl::ToUnixSeconds(THIRTY) + 1;65 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]66 // CHECK-FIXES: i = absl::ToUnixSeconds(THIRTY + absl::Seconds(1));67#undef THIRTY68 69 // Some other contexts70 if (absl::ToUnixSeconds(t) + 1.0 > 10) {}71 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: perform addition in the duration domain [abseil-duration-addition]72 // CHECK-FIXES: if (absl::ToUnixSeconds(t + absl::Seconds(1)) > 10) {}73 74 // These should not match75 i = 5 + 6;76 i = absl::ToUnixSeconds(t) - 1.0;77 i = absl::ToUnixSeconds(t) * 1.0;78 i = absl::ToUnixSeconds(t) / 1.0;79 i += absl::ToInt64Microseconds(absl::Seconds(1));80 81#define PLUS_FIVE(z) absl::ToUnixSeconds(z) + 582 i = PLUS_FIVE(t);83#undef PLUS_FIVE84}85 86// Within a templated function87template<typename T>88void foo(absl::Time t) {89 int i = absl::ToUnixNanos(t) + T{};90 // CHECK-MESSAGES: [[@LINE-1]]:11: warning: perform addition in the duration domain [abseil-duration-addition]91 // CHECK-FIXES: int i = absl::ToUnixNanos(t + absl::Nanoseconds(T{}));92}93 94void g() {95 absl::Time t;96 foo<int>(t);97 foo<double>(t);98}99