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

public class Overflows {

  static void bytes() {
    byte max = Byte.MAX_VALUE;
    // :: warning: (cast.unsafe)
    @IntVal(-128) byte maxPlus1 = (byte) (max + 1);
  }

  static void chars() {
    char max = Character.MAX_VALUE;
    // :: warning: (cast.unsafe)
    @IntVal(0) char maxPlus1 = (char) (max + 1);
  }

  static void shorts() {
    short max = Short.MAX_VALUE;
    // :: warning: (cast.unsafe)
    @IntVal(-32768) short maxPlus1 = (short) (max + 1);
  }

  static void ints() {
    int max = Integer.MAX_VALUE;
    @IntVal(-2147483648) int maxPlus1 = max + 1;
  }

  static void longs() {
    long max = Long.MAX_VALUE;
    @IntVal(-9223372036854775808L) long maxPlus1 = max + 1;
  }

  static void doubles() {
    double max = Double.MAX_VALUE;
    @DoubleVal(1.7976931348623157E308) double maxPlus1 = max + 1.0;
  }

  static void floats() {
    float max = Float.MAX_VALUE;
    @DoubleVal(3.4028235E38f) float maxPlus1 = max + 1.0f;
  }
}
