| 1 | // RUN: %check_clang_tidy %s abseil-duration-division %t |
| 2 | |
| 3 | namespace absl { |
| 4 | |
| 5 | class Duration {}; |
| 6 | |
| 7 | int operator/(Duration lhs, Duration rhs); |
| 8 | |
| 9 | double FDivDuration(Duration num, Duration den); |
| 10 | |
| 11 | } // namespace absl |
| 12 | |
| 13 | void TakesDouble(double); |
| 14 | |
| 15 | #define MACRO_EQ(x, y) (x == y) |
| 16 | #define MACRO_DIVEQ(x,y,z) (x/y == z) |
| 17 | #define CHECK(x) (x) |
| 18 | |
| 19 | void Positives() { |
| 20 | absl::Duration d; |
| 21 | |
| 22 | const double num_double = d/d; |
| 23 | // CHECK-MESSAGES: [[@LINE-1]]:30: warning: operator/ on absl::Duration objects performs integer division; did you mean to use FDivDuration()? [abseil-duration-division] |
| 24 | // CHECK-FIXES: const double num_double = absl::FDivDuration(d, d); |
| 25 | const float num_float = d/d; |
| 26 | // CHECK-MESSAGES: [[@LINE-1]]:28: warning: operator/ on absl::Duration objects |
| 27 | // CHECK-FIXES: const float num_float = absl::FDivDuration(d, d); |
| 28 | const auto SomeVal = 1.0 + d/d; |
| 29 | // CHECK-MESSAGES: [[@LINE-1]]:31: warning: operator/ on absl::Duration objects |
| 30 | // CHECK-FIXES: const auto SomeVal = 1.0 + absl::FDivDuration(d, d); |
| 31 | if (MACRO_EQ(d/d, 0.0)) {} |
| 32 | // CHECK-MESSAGES: [[@LINE-1]]:17: warning: operator/ on absl::Duration objects |
| 33 | // CHECK-FIXES: if (MACRO_EQ(absl::FDivDuration(d, d), 0.0)) {} |
| 34 | if (CHECK(MACRO_EQ(d/d, 0.0))) {} |
| 35 | // CHECK-MESSAGES: [[@LINE-1]]:23: warning: operator/ on absl::Duration objects |
| 36 | // CHECK-FIXES: if (CHECK(MACRO_EQ(absl::FDivDuration(d, d), 0.0))) {} |
| 37 | |
| 38 | // This one generates a message, but no fix. |
| 39 | if (MACRO_DIVEQ(d, d, 0.0)) {} |
| 40 | // CHECK-MESSAGES: [[@LINE-1]]:7: warning: operator/ on absl::Duration objects |
| 41 | // CHECK-FIXES: if (MACRO_DIVEQ(d, d, 0.0)) {} |
| 42 | |
| 43 | TakesDouble(d/d); |
| 44 | // CHECK-MESSAGES: [[@LINE-1]]:16: warning: operator/ on absl::Duration objects |
| 45 | // CHECK-FIXES: TakesDouble(absl::FDivDuration(d, d)); |
| 46 | } |
| 47 | |
| 48 | void TakesInt(int); |
| 49 | template <class T> |
| 50 | void TakesGeneric(T); |
| 51 | |
| 52 | void Negatives() { |
| 53 | absl::Duration d; |
| 54 | const int num_int = d/d; |
| 55 | const long num_long = d/d; |
| 56 | const short num_short = d/d; |
| 57 | const char num_char = d/d; |
| 58 | const auto num_auto = d/d; |
| 59 | const auto SomeVal = 1 + d/d; |
| 60 | |
| 61 | TakesInt(d/d); |
| 62 | TakesGeneric(d/d); |
| 63 | // Explicit cast should disable the warning. |
| 64 | const double num_cast1 = static_cast<double>(d/d); |
| 65 | const double num_cast2 = (double)(d/d); |
| 66 | } |
| 67 | |
| 68 | template <class T> |
| 69 | double DoubleDivision(T t1, T t2) {return t1/t2;} |
| 70 | |
| 71 | //This also won't trigger a warning |
| 72 | void TemplateDivision() { |
| 73 | absl::Duration d; |
| 74 | DoubleDivision(t1: d, t2: d); |
| 75 | } |
| 76 | |