Index: test/Analysis/div-zero.cpp =================================================================== --- test/Analysis/div-zero.cpp +++ test/Analysis/div-zero.cpp @@ -11,3 +11,301 @@ return (a % (qX-1)); // expected-warning {{Division by zero}} } + + +void testDiv1() { + (void)(42 / 0); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv2() { + (void)(42 / false); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv3() { + (void)(42 / !1); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv4() { + (void)(42 / (1 - 1)); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv5() { + (void)(42 / !(1 + 1)); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv6a() { + (void)(42 / (int)0.0); + // expected-warning@-1 {{division by zero is undefined}} + // Missing Division by zero warning +} + + +void testDiv6b() { + int x = (int)0.0; + (void)(42 / x); + // Missing Division by zero warning +} + + +void testDiv6c() { + float y = 0.2; + float z = 0.1; + int x = (int)(z + y); + (void)(42 / x); + // Missing Division by zero warning +} + + +void testDiv7() { + (void)(true / 0); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv8() { + (void)(!1 / 0); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv9() { + (void)((int)(9.0) / 0); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testDiv10() { + (void)((10 - 1) / 0); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testRem() { + (void)(42 % 0); + // expected-warning@-1 {{remainder by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +int testDivAssign(int x) { + return (x /= 0); + // expected-warning@-1 {{division by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +int testRemAssign(int x) { + return (x %= 0); + // expected-warning@-1 {{remainder by zero is undefined}} + // expected-warning@-2 {{Division by zero}} +} + + +void testFloatDiv() { + (void)(42.0 / 0); + // No warning, the checker handles scalar types only +} + + +void testDivPath() { + int x = 2; + int y = 2; + int z = 10; + + x = y / z; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testDivPath2() { + int x = 2; + int y = 0; + int z = 10; + + x = y / z; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testRemPath() { + int x = 2; + int y = 2; + int z = 10; + + x = z % y; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testRemPath2() { + int x = 2; + int y = 2; + int z = 0; + + x = z % y; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testAdditionPath() { + int x = 2; + int y = 2; + int z = -2; + + x = z + y; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testSubtractionPath() { + int x = 2; + int y = 2; + int z = 2; + + x = z - y; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testNegationPath() { + int x = 2; + int y = 2; + int z = 2; + + x = - y; + x = x + z; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testIfThenPath() { + int x = 2; + int y = 2; + int z = 2; + + if(y > 0) + x = z - y; + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testIfElsePath() { + int x = 2; + int y = 2; + int z = 2; + + if(y < 0) { + x = z - y + 1; + } else { + x = z - y; + } + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testSwitchPath() { + int x = 2; + int y = 2; + int z = 2; + + switch(y) { + case 1: x = y; break; + case 3: x = z; break; + default: x %= z; break; + } + + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testForLoopPath1() { + int x = 5; + + for(int i = 0; i < 5; ++i) { + x = x - 1; + } + (void)(42 / x); // Missing warning +} + + +void testForLoopPath2() { + int x = 0; + + for(int i = 0; i < 5; ++i) {} + (void)(42 / x); // Missing warning +} + + +void testForLoopPath3() { + int x = 0; + + for(int i = 0; i < 1; ++i) {} + + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +void testWhileLoopPath() { + int x = 0; + + int i = 0; + while(i < 5) { + ++i; + } + (void)(42 / x); // Missing warning +} + + +void testWhileLoopPath2() { + int x = 0; + + int i = 0; + do { + ++i; + } while(i < 5); + (void)(42 / x); // Missing warning +} + + +void testWhileLoopPath3() { + int x = 0; + + int i = 0; + while(i < 1) { + ++i; + } + (void)(42 / x); // expected-warning {{Division by zero}} +} + + +class BigInt { +}; + +BigInt operator/(const BigInt& x, int y) { + (void)(10 / y); // expected-warning {{Division by zero}} + return x; +} + +BigInt testOverwrittenOperator(BigInt x) { + return x / 0; // no warning +} +