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