1*67e74705SXin Li // This test checks that intersecting ranges does not cause 'system is over constrained' assertions in the case of eg: 32 bits unsigned integers getting their range from 64 bits signed integers. 2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s 3*67e74705SXin Li 4*67e74705SXin Li void clang_analyzer_warnIfReached(); 5*67e74705SXin Li f1(long foo)6*67e74705SXin Livoid f1(long foo) 7*67e74705SXin Li { 8*67e74705SXin Li unsigned index = -1; 9*67e74705SXin Li if (index < foo) index = foo; 10*67e74705SXin Li if (index + 1 == 0) // because of foo range, index is in range [0; UINT_MAX] 11*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 12*67e74705SXin Li else 13*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 14*67e74705SXin Li } 15*67e74705SXin Li f2(unsigned long foo)16*67e74705SXin Livoid f2(unsigned long foo) 17*67e74705SXin Li { 18*67e74705SXin Li int index = -1; 19*67e74705SXin Li if (index < foo) index = foo; // index equals ULONG_MAX 20*67e74705SXin Li if (index + 1 == 0) 21*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 22*67e74705SXin Li else 23*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 24*67e74705SXin Li } 25*67e74705SXin Li f3(unsigned long foo)26*67e74705SXin Livoid f3(unsigned long foo) 27*67e74705SXin Li { 28*67e74705SXin Li unsigned index = -1; 29*67e74705SXin Li if (index < foo) index = foo; 30*67e74705SXin Li if (index + 1 == 0) 31*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 32*67e74705SXin Li else 33*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 34*67e74705SXin Li } 35*67e74705SXin Li f4(long foo)36*67e74705SXin Livoid f4(long foo) 37*67e74705SXin Li { 38*67e74705SXin Li int index = -1; 39*67e74705SXin Li if (index < foo) index = foo; 40*67e74705SXin Li if (index + 1 == 0) 41*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 42*67e74705SXin Li else 43*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 44*67e74705SXin Li } 45*67e74705SXin Li f5(long foo)46*67e74705SXin Livoid f5(long foo) 47*67e74705SXin Li { 48*67e74705SXin Li unsigned index = -1; 49*67e74705SXin Li if (index < foo) index = foo; 50*67e74705SXin Li if (index == -1) 51*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 52*67e74705SXin Li else 53*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 54*67e74705SXin Li } 55*67e74705SXin Li f6(long foo)56*67e74705SXin Livoid f6(long foo) 57*67e74705SXin Li { 58*67e74705SXin Li unsigned index = -1; 59*67e74705SXin Li if (index < foo) index = foo; 60*67e74705SXin Li if (index == -1) 61*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 62*67e74705SXin Li else 63*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 64*67e74705SXin Li } 65*67e74705SXin Li f7(long foo)66*67e74705SXin Livoid f7(long foo) 67*67e74705SXin Li { 68*67e74705SXin Li unsigned index = -1; 69*67e74705SXin Li if (index < foo) index = foo; 70*67e74705SXin Li if (index - 1 == 0) // Was not reached prior fix. 71*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 72*67e74705SXin Li else 73*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 74*67e74705SXin Li } 75*67e74705SXin Li f8(long foo)76*67e74705SXin Livoid f8(long foo) 77*67e74705SXin Li { 78*67e74705SXin Li unsigned index = -1; 79*67e74705SXin Li if (index < foo) index = foo; 80*67e74705SXin Li if (index + 1L == 0L) 81*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 82*67e74705SXin Li else 83*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 84*67e74705SXin Li } 85*67e74705SXin Li f9(long foo)86*67e74705SXin Livoid f9(long foo) 87*67e74705SXin Li { 88*67e74705SXin Li unsigned index = -1; 89*67e74705SXin Li if (index < foo) index = foo; 90*67e74705SXin Li if (index - 1L == 0L) // Was not reached prior fix. 91*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 92*67e74705SXin Li else 93*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 94*67e74705SXin Li } 95*67e74705SXin Li f10(long foo)96*67e74705SXin Livoid f10(long foo) 97*67e74705SXin Li { 98*67e74705SXin Li unsigned index = -1; 99*67e74705SXin Li if (index < foo) index = foo; 100*67e74705SXin Li if (index + 1 == 0L) 101*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 102*67e74705SXin Li else 103*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 104*67e74705SXin Li } 105*67e74705SXin Li f11(long foo)106*67e74705SXin Livoid f11(long foo) 107*67e74705SXin Li { 108*67e74705SXin Li unsigned index = -1; 109*67e74705SXin Li if (index < foo) index = foo; 110*67e74705SXin Li if (index + 1UL == 0L) 111*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 112*67e74705SXin Li else 113*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 114*67e74705SXin Li } 115*67e74705SXin Li f12(long foo)116*67e74705SXin Livoid f12(long foo) 117*67e74705SXin Li { 118*67e74705SXin Li unsigned index = -1; 119*67e74705SXin Li if (index < foo) index = foo; 120*67e74705SXin Li if (index - 1UL == 0L) // Was not reached prior fix. 121*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 122*67e74705SXin Li else 123*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 124*67e74705SXin Li } 125*67e74705SXin Li f13(int foo)126*67e74705SXin Livoid f13(int foo) 127*67e74705SXin Li { 128*67e74705SXin Li unsigned short index = -1; 129*67e74705SXin Li if (index < foo) index = foo; 130*67e74705SXin Li if (index + 1 == 0) 131*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 132*67e74705SXin Li else 133*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 134*67e74705SXin Li } 135*67e74705SXin Li f14(long foo)136*67e74705SXin Livoid f14(long foo) 137*67e74705SXin Li { 138*67e74705SXin Li unsigned index = -1; 139*67e74705SXin Li if (index < foo) index = foo; 140*67e74705SXin Li long bar = foo; 141*67e74705SXin Li if (index + 1 == 0) 142*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 143*67e74705SXin Li else 144*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 145*67e74705SXin Li } 146*67e74705SXin Li f15(long foo)147*67e74705SXin Livoid f15(long foo) 148*67e74705SXin Li { 149*67e74705SXin Li unsigned index = -1; 150*67e74705SXin Li if (index < foo) index = foo; 151*67e74705SXin Li unsigned int tmp = index + 1; 152*67e74705SXin Li if (tmp == 0) 153*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 154*67e74705SXin Li else 155*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 156*67e74705SXin Li } 157