diff options
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Analysis/constant-folding.c | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/clang/test/Analysis/constant-folding.c b/clang/test/Analysis/constant-folding.c index a6d2b749427..8189868be2e 100644 --- a/clang/test/Analysis/constant-folding.c +++ b/clang/test/Analysis/constant-folding.c @@ -76,3 +76,42 @@ void testMixedTypeComparisons (char a, unsigned long b) {    clang_analyzer_eval(b >= a); // expected-warning{{TRUE}}    clang_analyzer_eval(a != b); // expected-warning{{TRUE}}  } + +void testBitwiseRules(unsigned int a, int b) { +  clang_analyzer_eval((a | 1) >= 1); // expected-warning{{TRUE}} +  clang_analyzer_eval((a | -1) >= -1); // expected-warning{{TRUE}} +  clang_analyzer_eval((a | 2) >= 2); // expected-warning{{TRUE}} +  clang_analyzer_eval((a | 5) >= 5); // expected-warning{{TRUE}} +  clang_analyzer_eval((a | 10) >= 10); // expected-warning{{TRUE}} + +  // Argument order should not influence this +  clang_analyzer_eval((1 | a) >= 1); // expected-warning{{TRUE}} + +  clang_analyzer_eval((a & 1) <= 1); // expected-warning{{TRUE}} +  clang_analyzer_eval((a & 2) <= 2); // expected-warning{{TRUE}} +  clang_analyzer_eval((a & 5) <= 5); // expected-warning{{TRUE}} +  clang_analyzer_eval((a & 10) <= 10); // expected-warning{{TRUE}} +  clang_analyzer_eval((a & -10) <= 10); // expected-warning{{UNKNOWN}} + +  // Again, check for different argument order. +  clang_analyzer_eval((1 & a) <= 1); // expected-warning{{TRUE}} + +  unsigned int c = a; +  c |= 1; +  clang_analyzer_eval((c | 0) == 0); // expected-warning{{FALSE}} + +  // Rules don't apply to signed typed, as the values might be negative. +  clang_analyzer_eval((b | 1) > 0); // expected-warning{{UNKNOWN}} + +  // Even for signed values, bitwise OR with a non-zero is always non-zero. +  clang_analyzer_eval((b | 1) == 0); // expected-warning{{FALSE}} +  clang_analyzer_eval((b | -2) == 0); // expected-warning{{FALSE}} +  clang_analyzer_eval((b | 10) == 0); // expected-warning{{FALSE}} +  clang_analyzer_eval((b | 0) == 0); // expected-warning{{UNKNOWN}} +  clang_analyzer_eval((b | -2) >= 0); // expected-warning{{UNKNOWN}} + +  // Check that dynamically computed constants also work. +  int constant = 1 << 3; +  unsigned int d = a | constant; +  clang_analyzer_eval(constant > 0); // expected-warning{{TRUE}} +} | 

