import org.checkerframework.common.value.qual.*;

public class TypeCast {

  public void charIntDoubleTest() {
    int a = 98;
    long b = 98;
    double c = 98.0;
    float d = 98.0f;
    char e = 'b';
    short f = 98;
    byte g = 98;

    @IntVal({'b'}) char h = (char) a;
    h = (char) b;
    // :: warning: (cast.unsafe)
    h = (char) c;
    // :: warning: (cast.unsafe)
    h = (char) d;
    h = (char) f;
    h = (char) g;

    @IntVal({98}) int i = (int) b;
    // :: warning: (cast.unsafe)
    i = (int) c;
    // :: warning: (cast.unsafe)
    i = (int) d;
    i = (int) e;
    i = (int) f;
    i = (int) g;

    @DoubleVal({98.0}) double j = (double) a;
    j = (double) b;
    j = (double) d;
    j = (double) e;
    j = (double) f;
    j = (double) g;
  }

  void otherCast() {

    byte[] b = (byte[]) null;
    @BoolVal(true) boolean bool = (boolean) true;
  }

  void rangeCast(@IntRange(from = 127, to = 128) int a, @IntRange(from = 128, to = 129) int b) {
    @IntRange(from = 0, to = 128)
    // :: error: (assignment) :: warning: (cast.unsafe)
    byte c = (byte) a;
    // (byte) a is @IntRange(from = -128, to = 127) because of casting

    @IntRange(from = -128, to = -127)
    // :: warning: (cast.unsafe)
    byte d = (byte) b;
  }
}
