1// RUN: %check_clang_tidy %s bugprone-integer-division %t
2
3// Functions expecting a floating-point parameter.
4void floatArg(float x) {}
5void doubleArg(double x) {}
6void longDoubleArg(long double x) {}
7
8// Functions expected to return a floating-point value.
9float singleDiv() {
10 int x = -5;
11 int y = 2;
12 return x/y;
13// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: result of integer division used in
14}
15
16double wrongOrder(int x, int y) {
17 return x/y/0.1;
18// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: result of integer division used in
19}
20
21long double rightOrder(int x, int y) {
22 return 0.1/x/y; // OK
23}
24
25// Typical mathematical functions.
26float sin(float);
27double acos(double);
28long double tanh(long double);
29
30namespace std {
31 using ::sin;
32}
33
34template <typename T>
35void intDivSin(T x) {
36 sin(x);
37}
38
39int intFunc(int);
40
41struct X {
42 int n;
43 void m() {
44 sin(n / 3);
45// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: result of integer division used in
46 }
47};
48
49void integerDivision() {
50 char a = 2;
51 short b = -5;
52 int c = 9784;
53 enum third { x, y, z=2 };
54 third d = z;
55 char e[] = {'a', 'b', 'c'};
56 char f = *(e + 1 / a);
57 bool g = 1;
58
59 sin(1 + c / (2 + 2));
60// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: result of integer division used in
61 sin(c / (1 + .5));
62 sin((c + .5) / 3);
63
64 sin(intFunc(3) / 5);
65// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: result of integer division used in
66 acos(2 / intFunc(7));
67// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
68
69 floatArg(x: 1 + 2 / 3);
70// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: result of integer division used in
71 sin(1 + 2 / 3);
72// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: result of integer division used in
73 intFunc(sin(1 + 2 / 3));
74// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: result of integer division used in
75
76 floatArg(x: 1 + intFunc(1 + 2 / 3));
77 floatArg(x: 1 + 3 * intFunc(a / b));
78
79 1 << (2 / 3);
80 1 << intFunc(2 / 3);
81
82#define M_SIN sin(a / b);
83 M_SIN
84// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: result of integer division used in
85
86 intDivSin<float>(x: a / b);
87// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: result of integer division used in
88 intDivSin<double>(x: c / d);
89// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: result of integer division used in
90 intDivSin<long double>(x: f / g);
91// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: result of integer division used in
92
93 floatArg(x: 1 / 3);
94// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: result of integer division used in
95 doubleArg(x: a / b);
96// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: result of integer division used in
97 longDoubleArg(x: 3 / d);
98// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: result of integer division used in
99 floatArg(x: a / b / 0.1);
100// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: result of integer division used in
101 doubleArg(x: 1 / 3 / 0.1);
102// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: result of integer division used in
103 longDoubleArg(x: 2 / 3 / 5);
104// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: result of integer division used in
105
106 std::sin(2 / 3);
107// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: result of integer division used in
108 ::acos(7 / d);
109// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: result of integer division used in
110 tanh(f / g);
111// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
112
113 floatArg(x: 0.1 / a / b);
114 doubleArg(x: 0.1 / 3 / 1);
115
116 singleDiv();
117 wrongOrder(x: a,y: b);
118 rightOrder(x: a,y: b);
119
120 sin(a / b);
121// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: result of integer division used in
122 acos(f / d);
123// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
124 tanh(c / g);
125// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
126
127 sin(3.0 / a);
128 acos(b / 3.14);
129 tanh(3.14 / f / g);
130}
131

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/integer-division.cpp