196ec9b6fSGabor Marton // RUN: %clang_analyze_cc1 %s \
296ec9b6fSGabor Marton // RUN:   -Wno-conversion -Wno-tautological-constant-compare \
396ec9b6fSGabor Marton // RUN:   -analyzer-checker=core,apiModeling,alpha.core.Conversion \
496ec9b6fSGabor Marton // RUN:   -analyzer-output=text \
596ec9b6fSGabor Marton // RUN:   -verify
696ec9b6fSGabor Marton 
796ec9b6fSGabor Marton unsigned char U8;
896ec9b6fSGabor Marton signed char S8;
996ec9b6fSGabor Marton 
track_assign(void)10*0dd49a56SAaron Ballman void track_assign(void) {
1196ec9b6fSGabor Marton   unsigned long L = 1000; // expected-note {{'L' initialized to 1000}}
1296ec9b6fSGabor Marton   int I = -1;             // expected-note {{'I' initialized to -1}}
1396ec9b6fSGabor Marton   U8 *= L; // expected-warning {{Loss of precision in implicit conversion}}
1496ec9b6fSGabor Marton            // expected-note@-1 {{Loss of precision in implicit conversion}}
1596ec9b6fSGabor Marton   L *= I;  // expected-warning {{Loss of sign in implicit conversion}}
1696ec9b6fSGabor Marton            // expected-note@-1 {{Loss of sign in implicit conversion}}
1796ec9b6fSGabor Marton }
1896ec9b6fSGabor Marton 
track_relational(unsigned U,signed S)1996ec9b6fSGabor Marton void track_relational(unsigned U, signed S) {
2096ec9b6fSGabor Marton   if (S < -10) { // expected-note    {{Taking true branch}}
2196ec9b6fSGabor Marton                  // expected-note@-1 {{Assuming the condition is true}}
2296ec9b6fSGabor Marton     if (U < S) { // expected-warning {{Loss of sign in implicit conversion}}
2396ec9b6fSGabor Marton                  // expected-note@-1 {{Loss of sign in implicit conversion}}
2496ec9b6fSGabor Marton     }
2596ec9b6fSGabor Marton   }
2696ec9b6fSGabor Marton }
27