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*89a1d03eSRichardvoid 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