forked from OSchip/llvm-project
131 lines
3.6 KiB
C++
131 lines
3.6 KiB
C++
// 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);
|
|
}
|