189a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-incorrect-roundings %t 289a1d03eSRichard b(int x)389a1d03eSRichardvoid b(int x) {} 489a1d03eSRichard f1()589a1d03eSRichardvoid f1() { 689a1d03eSRichard float f; 789a1d03eSRichard double d; 889a1d03eSRichard long double ld; 989a1d03eSRichard int x; 1089a1d03eSRichard 1189a1d03eSRichard x = (d + 0.5); 1289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) to integer leads to incorrect rounding; consider using lround (#include <cmath>) instead [bugprone-incorrect-roundings] 1389a1d03eSRichard x = (d + 0.5f); 1489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 15*aa1642f6SPiotr Zegar x = (d + 0.5L); 16*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 1789a1d03eSRichard x = (f + 0.5); 1889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 1989a1d03eSRichard x = (f + 0.5f); 2089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 21*aa1642f6SPiotr Zegar x = (f + 0.5L); 22*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 2389a1d03eSRichard x = (0.5 + d); 2489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 2589a1d03eSRichard x = (0.5f + d); 2689a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 27*aa1642f6SPiotr Zegar x = (0.5L + d); 28*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 2989a1d03eSRichard x = (0.5 + ld); 3089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 3189a1d03eSRichard x = (0.5f + ld); 3289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 33*aa1642f6SPiotr Zegar x = (0.5L + ld); 34*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 3589a1d03eSRichard x = (0.5 + f); 3689a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 3789a1d03eSRichard x = (0.5f + f); 3889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 39*aa1642f6SPiotr Zegar x = (0.5L + f); 40*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5) 4189a1d03eSRichard x = (int)(d + 0.5); 4289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 4389a1d03eSRichard x = (int)(d + 0.5f); 4489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 45*aa1642f6SPiotr Zegar x = (int)(d + 0.5L); 46*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 4789a1d03eSRichard x = (int)(ld + 0.5); 4889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 4989a1d03eSRichard x = (int)(ld + 0.5f); 5089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 51*aa1642f6SPiotr Zegar x = (int)(ld + 0.5L); 52*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 5389a1d03eSRichard x = (int)(f + 0.5); 5489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 5589a1d03eSRichard x = (int)(f + 0.5f); 5689a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 57*aa1642f6SPiotr Zegar x = (int)(f + 0.5L); 58*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 5989a1d03eSRichard x = (int)(0.5 + d); 6089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 6189a1d03eSRichard x = (int)(0.5f + d); 6289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 63*aa1642f6SPiotr Zegar x = (int)(0.5L + d); 64*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 6589a1d03eSRichard x = (int)(0.5 + ld); 6689a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 6789a1d03eSRichard x = (int)(0.5f + ld); 6889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 69*aa1642f6SPiotr Zegar x = (int)(0.5L + ld); 70*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 7189a1d03eSRichard x = (int)(0.5 + f); 7289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 7389a1d03eSRichard x = (int)(0.5f + f); 7489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 75*aa1642f6SPiotr Zegar x = (int)(0.5L + f); 76*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5) 7789a1d03eSRichard x = static_cast<int>(d + 0.5); 7889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 7989a1d03eSRichard x = static_cast<int>(d + 0.5f); 8089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 81*aa1642f6SPiotr Zegar x = static_cast<int>(d + 0.5L); 82*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 8389a1d03eSRichard x = static_cast<int>(ld + 0.5); 8489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 8589a1d03eSRichard x = static_cast<int>(ld + 0.5f); 8689a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 87*aa1642f6SPiotr Zegar x = static_cast<int>(ld + 0.5L); 88*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 8989a1d03eSRichard x = static_cast<int>(f + 0.5); 9089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 9189a1d03eSRichard x = static_cast<int>(f + 0.5f); 9289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 93*aa1642f6SPiotr Zegar x = static_cast<int>(f + 0.5L); 94*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 9589a1d03eSRichard x = static_cast<int>(0.5 + d); 9689a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 9789a1d03eSRichard x = static_cast<int>(0.5f + d); 9889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 99*aa1642f6SPiotr Zegar x = static_cast<int>(0.5L + d); 100*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 10189a1d03eSRichard x = static_cast<int>(0.5 + ld); 10289a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 10389a1d03eSRichard x = static_cast<int>(0.5f + ld); 10489a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 105*aa1642f6SPiotr Zegar x = static_cast<int>(0.5L + ld); 106*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 10789a1d03eSRichard x = static_cast<int>(0.5 + f); 10889a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 10989a1d03eSRichard x = static_cast<int>(0.5f + f); 11089a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 111*aa1642f6SPiotr Zegar x = static_cast<int>(0.5L + f); 112*aa1642f6SPiotr Zegar // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5) 11389a1d03eSRichard 11489a1d03eSRichard // Don't warn if constant is not 0.5. 115*aa1642f6SPiotr Zegar x = (int)(d + 0.4999); 116*aa1642f6SPiotr Zegar x = (int)(d + 0.4999f); 117*aa1642f6SPiotr Zegar x = (int)(d + 0.4999L); 118*aa1642f6SPiotr Zegar x = (int)(0.4999 + d); 119*aa1642f6SPiotr Zegar x = (int)(0.4999f + d); 120*aa1642f6SPiotr Zegar x = (int)(0.4999L + d); 121*aa1642f6SPiotr Zegar 122*aa1642f6SPiotr Zegar x = (int)(d + -0.5); 123*aa1642f6SPiotr Zegar x = (int)(-0.5 + d); 124*aa1642f6SPiotr Zegar x = (int)(d + -0.5f); 125*aa1642f6SPiotr Zegar x = (int)(-0.5f + d); 126*aa1642f6SPiotr Zegar x = (int)(d + -0.5L); 127*aa1642f6SPiotr Zegar x = (int)(-0.5L + d); 128*aa1642f6SPiotr Zegar 129*aa1642f6SPiotr Zegar x = (int)(d + 0.5001); 130*aa1642f6SPiotr Zegar x = (int)(d + 0.5001f); 131*aa1642f6SPiotr Zegar x = (int)(d + 0.5001L); 132*aa1642f6SPiotr Zegar x = (int)(0.5001 + d); 133*aa1642f6SPiotr Zegar x = (int)(0.5001f + d); 134*aa1642f6SPiotr Zegar x = (int)(0.5001L + d); 13589a1d03eSRichard 13689a1d03eSRichard // Don't warn if binary operator is not directly beneath cast. 13789a1d03eSRichard x = (int)(1 + (0.5 + f)); 13889a1d03eSRichard } 139