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