1 // RUN: %check_clang_tidy -std=c++11-or-later %s abseil-duration-unnecessary-conversion %t -- -- -I %S/Inputs
2 
3 #include "absl/time/time.h"
4 
f()5 void f() {
6   absl::Duration d1, d2;
7 
8   // Floating point
9   d2 = absl::Hours(absl::ToDoubleHours(d1));
10   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
11   // CHECK-FIXES: d2 = d1
12   d2 = absl::Minutes(absl::ToDoubleMinutes(d1));
13   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
14   // CHECK-FIXES: d2 = d1
15   d2 = absl::Seconds(absl::ToDoubleSeconds(d1));
16   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
17   // CHECK-FIXES: d2 = d1
18   d2 = absl::Milliseconds(absl::ToDoubleMilliseconds(d1));
19   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
20   // CHECK-FIXES: d2 = d1
21   d2 = absl::Microseconds(absl::ToDoubleMicroseconds(d1));
22   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
23   // CHECK-FIXES: d2 = d1
24   d2 = absl::Nanoseconds(absl::ToDoubleNanoseconds(d1));
25   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
26   // CHECK-FIXES: d2 = d1
27 
28   // Integer point
29   d2 = absl::Hours(absl::ToInt64Hours(d1));
30   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
31   // CHECK-FIXES: d2 = d1
32   d2 = absl::Minutes(absl::ToInt64Minutes(d1));
33   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
34   // CHECK-FIXES: d2 = d1
35   d2 = absl::Seconds(absl::ToInt64Seconds(d1));
36   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
37   // CHECK-FIXES: d2 = d1
38   d2 = absl::Milliseconds(absl::ToInt64Milliseconds(d1));
39   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
40   // CHECK-FIXES: d2 = d1
41   d2 = absl::Microseconds(absl::ToInt64Microseconds(d1));
42   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
43   // CHECK-FIXES: d2 = d1
44   d2 = absl::Nanoseconds(absl::ToInt64Nanoseconds(d1));
45   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
46   // CHECK-FIXES: d2 = d1
47 
48   d2 = absl::Hours(d1 / absl::Hours(1));
49   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
50   // CHECK-FIXES: d2 = d1
51   d2 = absl::Minutes(d1 / absl::Minutes(1));
52   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
53   // CHECK-FIXES: d2 = d1
54   d2 = absl::Seconds(d1 / absl::Seconds(1));
55   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
56   // CHECK-FIXES: d2 = d1
57   d2 = absl::Milliseconds(d1 / absl::Milliseconds(1));
58   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
59   // CHECK-FIXES: d2 = d1
60   d2 = absl::Microseconds(d1 / absl::Microseconds(1));
61   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
62   // CHECK-FIXES: d2 = d1
63   d2 = absl::Nanoseconds(d1 / absl::Nanoseconds(1));
64   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
65   // CHECK-FIXES: d2 = d1
66 
67   d2 = absl::Hours(absl::FDivDuration(d1, absl::Hours(1)));
68   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
69   // CHECK-FIXES: d2 = d1
70   d2 = absl::Minutes(absl::FDivDuration(d1, absl::Minutes(1)));
71   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
72   // CHECK-FIXES: d2 = d1
73   d2 = absl::Seconds(absl::FDivDuration(d1, absl::Seconds(1)));
74   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
75   // CHECK-FIXES: d2 = d1
76   d2 = absl::Milliseconds(absl::FDivDuration(d1, absl::Milliseconds(1)));
77   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
78   // CHECK-FIXES: d2 = d1
79   d2 = absl::Microseconds(absl::FDivDuration(d1, absl::Microseconds(1)));
80   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
81   // CHECK-FIXES: d2 = d1
82   d2 = absl::Nanoseconds(absl::FDivDuration(d1, absl::Nanoseconds(1)));
83   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
84   // CHECK-FIXES: d2 = d1
85 
86   // As macro argument
87 #define PLUS_FIVE_S(x) x + absl::Seconds(5)
88   d2 = PLUS_FIVE_S(absl::Seconds(absl::ToInt64Seconds(d1)));
89   // CHECK-MESSAGES: [[@LINE-1]]:20: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
90   // CHECK-FIXES: PLUS_FIVE_S(d1)
91 #undef PLUS_FIVE_S
92 
93   // Split by macro: should not change
94 #define TOSECONDS(x) absl::Seconds(x)
95   d2 = TOSECONDS(absl::ToInt64Seconds(d1));
96 #undef TOSECONDS
97 
98   // Don't change something inside a macro definition
99 #define VALUE(x) absl::Hours(absl::ToInt64Hours(x));
100   d2 = VALUE(d1);
101 #undef VALUE
102 
103   // Multiplication
104   d2 = absl::Nanoseconds(absl::ToDoubleNanoseconds(d1) * 2);
105   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
106   // CHECK-FIXES: d2 = d1 * 2
107   d2 = absl::Microseconds(absl::ToInt64Microseconds(d1) * 2);
108   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
109   // CHECK-FIXES: d2 = d1 * 2
110   d2 = absl::Milliseconds(absl::ToDoubleMilliseconds(d1) * 2);
111   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
112   // CHECK-FIXES: d2 = d1 * 2
113   d2 = absl::Seconds(absl::ToInt64Seconds(d1) * 2);
114   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
115   // CHECK-FIXES: d2 = d1 * 2
116   d2 = absl::Minutes(absl::ToDoubleMinutes(d1) * 2);
117   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
118   // CHECK-FIXES: d2 = d1 * 2
119   d2 = absl::Hours(absl::ToInt64Hours(d1) * 2);
120   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
121   // CHECK-FIXES: d2 = d1 * 2
122   d2 = absl::Nanoseconds(2 * absl::ToDoubleNanoseconds(d1));
123   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
124   // CHECK-FIXES: d2 = 2 * d1
125   d2 = absl::Microseconds(2 * absl::ToInt64Microseconds(d1));
126   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
127   // CHECK-FIXES: d2 = 2 * d1
128   d2 = absl::Milliseconds(2 * absl::ToDoubleMilliseconds(d1));
129   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
130   // CHECK-FIXES: d2 = 2 * d1
131   d2 = absl::Seconds(2 * absl::ToInt64Seconds(d1));
132   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
133   // CHECK-FIXES: d2 = 2 * d1
134   d2 = absl::Minutes(2 * absl::ToDoubleMinutes(d1));
135   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
136   // CHECK-FIXES: d2 = 2 * d1
137   d2 = absl::Hours(2 * absl::ToInt64Hours(d1));
138   // CHECK-MESSAGES: [[@LINE-1]]:8: warning: remove unnecessary absl::Duration conversions [abseil-duration-unnecessary-conversion]
139   // CHECK-FIXES: d2 = 2 * d1
140 
141   // These should not match
142   d2 = absl::Seconds(absl::ToDoubleMilliseconds(d1));
143   d2 = absl::Seconds(4);
144   int i = absl::ToInt64Milliseconds(d1);
145   d2 = absl::Hours(d1 / absl::Minutes(1));
146   d2 = absl::Seconds(d1 / absl::Seconds(30));
147   d2 = absl::Hours(absl::FDivDuration(d1, absl::Minutes(1)));
148   d2 = absl::Milliseconds(absl::FDivDuration(d1, absl::Milliseconds(20)));
149   d2 = absl::Seconds(absl::ToInt64Milliseconds(d1) * 2);
150   d2 = absl::Milliseconds(absl::ToDoubleSeconds(d1) * 2);
151 }
152