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 | |