// Test case for issue 3668:
// https://github.com/typetools/checker-framework/issues/3668

import org.checkerframework.checker.signedness.qual.*;

public class ObjectCasts {

  Integer castObjectToInteger1(Object o) {
    // :: error: (return)
    return (Integer) o;
  }

  Integer castObjectToInteger2(@Unsigned Object o) {
    // :: error: (return)
    return (Integer) o;
  }

  Integer castObjectToInteger3(@Signed Object o) {
    return (Integer) o;
  }

  @Signed Integer castObjectToInteger4(Object o) {
    // :: error: (return)
    return (Integer) o;
  }

  @Signed Integer castObjectToInteger5(@Unsigned Object o) {
    // :: error: (return)
    return (Integer) o;
  }

  @Signed Integer castObjectToInteger6(@Signed Object o) {
    return (Integer) o;
  }

  @Unsigned Integer castObjectToInteger7(Object o) {
    // :: error: (return)
    return (Integer) o;
  }

  @Unsigned Integer castObjectToInteger8(@Unsigned Object o) {
    return (Integer) o;
  }

  @Unsigned Integer castObjectToInteger9(@Signed Object o) {
    // :: error: (return)
    return (Integer) o;
  }

  Object castIntegerToObject1(Integer o) {
    return (Object) o;
  }

  Object castIntegerToObject2(@Unsigned Integer o) {
    return (Object) o;
  }

  Object castIntegerToObject3(@Signed Integer o) {
    return (Object) o;
  }

  @Signed Object castIntegerToObject4(Integer o) {
    return (Object) o;
  }

  @Signed Object castIntegerToObject5(@Unsigned Integer o) {
    // :: error: (return)
    return (Object) o;
  }

  @Signed Object castIntegerToObject6(@Signed Integer o) {
    return (Object) o;
  }

  @Unsigned Object castIntegerToObject7(Integer o) {
    // :: error: (return)
    return (Object) o;
  }

  @Unsigned Object castIntegerToObject8(@Unsigned Integer o) {
    return (Object) o;
  }

  @Unsigned Object castIntegerToObject9(@Signed Integer o) {
    // :: error: (return)
    return (Object) o;
  }

  void castObjectToBoxedVariants() {
    byte b1 = 1;
    short s1 = 1;
    int i1 = 1;
    long l1 = 1;
    Object[] obj = new Object[] {b1, s1, i1, l1};
    // :: error: (argument)
    byteParameter((Byte) obj[0]);
    // :: error: (argument)
    shortParameter((Short) obj[1]);
    // :: error: (argument)
    integralParameter((Integer) obj[2]);
    // :: error: (argument)
    longParameter((Long) obj[3]);
  }

  void byteParameter(byte b) {}

  void shortParameter(short s) {}

  void integralParameter(int i) {}

  void longParameter(long l) {}
}
