1 // RUN: %check_clang_tidy %s bugprone-incorrect-roundings %t
2 
b(int x)3 void b(int x) {}
4 
f1()5 void f1() {
6   float f;
7   double d;
8   long double ld;
9   int x;
10 
11   x = (d + 0.5);
12   // 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]
13   x = (d + 0.5f);
14   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
15   x = (f + 0.5);
16   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
17   x = (f + 0.5f);
18   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
19   x = (0.5 + d);
20   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
21   x = (0.5f + d);
22   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
23   x = (0.5 + ld);
24   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
25   x = (0.5f + ld);
26   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
27   x = (0.5 + f);
28   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
29   x = (0.5f + f);
30   // CHECK-MESSAGES: [[@LINE-1]]:7: warning: casting (double + 0.5)
31   x = (int)(d + 0.5);
32   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
33   x = (int)(d + 0.5f);
34   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
35   x = (int)(ld + 0.5);
36   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
37   x = (int)(ld + 0.5f);
38   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
39   x = (int)(f + 0.5);
40   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
41   x = (int)(f + 0.5f);
42   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
43   x = (int)(0.5 + d);
44   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
45   x = (int)(0.5f + d);
46   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
47   x = (int)(0.5 + ld);
48   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
49   x = (int)(0.5f + ld);
50   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
51   x = (int)(0.5 + f);
52   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
53   x = (int)(0.5f + f);
54   // CHECK-MESSAGES: [[@LINE-1]]:12: warning: casting (double + 0.5)
55   x = static_cast<int>(d + 0.5);
56   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
57   x = static_cast<int>(d + 0.5f);
58   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
59   x = static_cast<int>(ld + 0.5);
60   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
61   x = static_cast<int>(ld + 0.5f);
62   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
63   x = static_cast<int>(f + 0.5);
64   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
65   x = static_cast<int>(f + 0.5f);
66   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
67   x = static_cast<int>(0.5 + d);
68   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
69   x = static_cast<int>(0.5f + d);
70   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
71   x = static_cast<int>(0.5 + ld);
72   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
73   x = static_cast<int>(0.5f + ld);
74   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
75   x = static_cast<int>(0.5 + f);
76   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
77   x = static_cast<int>(0.5f + f);
78   // CHECK-MESSAGES: [[@LINE-1]]:24: warning: casting (double + 0.5)
79 
80   // Don't warn if constant is not 0.5.
81   x = (int)(d + 0.6);
82   x = (int)(0.6 + d);
83 
84   // Don't warn if binary operator is not directly beneath cast.
85   x = (int)(1 + (0.5 + f));
86 }
87