// RUN: %check_clang_tidy %s bugprone-integer-division %t
// Functions expecting a floating-point parameter.
void floatArg(float x) {}
void doubleArg(double x) {}
void longDoubleArg(long double x) {}
// Functions expected to return a floating-point value.
float singleDiv() {
int x = -5;
int y = 2;
return x/y;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: result of integer division used in
}
double wrongOrder(int x, int y) {
return x/y/0.1;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: result of integer division used in
}
long double rightOrder(int x, int y) {
return 0.1/x/y; // OK
}
// Typical mathematical functions.
float sin(float);
double acos(double);
long double tanh(long double);
namespace std {
using ::sin;
}
template <typename T>
void intDivSin(T x) {
sin(x);
}
int intFunc(int);
struct X {
int n;
void m() {
sin(n / 3);
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: result of integer division used in
}
};
void integerDivision() {
char a = 2;
short b = -5;
int c = 9784;
enum third { x, y, z=2 };
third d = z;
char e[] = {'a', 'b', 'c'};
char f = *(e + 1 / a);
bool g = 1;
sin(1 + c / (2 + 2));
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: result of integer division used in
sin(c / (1 + .5));
sin((c + .5) / 3);
sin(intFunc(3) / 5);
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: result of integer division used in
acos(2 / intFunc(7));
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
floatArg(1 + 2 / 3);
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: result of integer division used in
sin(1 + 2 / 3);
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: result of integer division used in
intFunc(sin(1 + 2 / 3));
// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: result of integer division used in
floatArg(1 + intFunc(1 + 2 / 3));
floatArg(1 + 3 * intFunc(a / b));
1 << (2 / 3);
1 << intFunc(2 / 3);
#define M_SIN sin(a / b);
M_SIN
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: result of integer division used in
intDivSin<float>(a / b);
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: result of integer division used in
intDivSin<double>(c / d);
// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: result of integer division used in
intDivSin<long double>(f / g);
// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: result of integer division used in
floatArg(1 / 3);
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: result of integer division used in
doubleArg(a / b);
// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: result of integer division used in
longDoubleArg(3 / d);
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: result of integer division used in
floatArg(a / b / 0.1);
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: result of integer division used in
doubleArg(1 / 3 / 0.1);
// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: result of integer division used in
longDoubleArg(2 / 3 / 5);
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: result of integer division used in
std::sin(2 / 3);
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: result of integer division used in
::acos(7 / d);
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: result of integer division used in
tanh(f / g);
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
floatArg(0.1 / a / b);
doubleArg(0.1 / 3 / 1);
singleDiv();
wrongOrder(a,b);
rightOrder(a,b);
sin(a / b);
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: result of integer division used in
acos(f / d);
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
tanh(c / g);
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: result of integer division used in
sin(3.0 / a);
acos(b / 3.14);
tanh(3.14 / f / g);
}