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);
 | 
						|
}
 |