import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.checkerframework.checker.nullness.qual.*;

class Utils {

  <A extends @Nullable Object> void test(List<? super A> list, A object) {
    list.add(object);
  }

  interface Consumer<A extends @Nullable Object> {
    public void consume(A object);
  }

  public static <A extends @Nullable Object> Consumer<A> cast(
      final Consumer<@Nullable ? super A> consumer) {
    return new Consumer<A>() {
      @Override
      public void consume(A object) {
        consumer.consume(object);
      }
    };
  }

  public static <A extends @Nullable Object> Consumer<A> getConsumer(
      Consumer<@Nullable Object> nullConsumer) {
    return Utils.<A>cast(nullConsumer);
  }

  Map<String, Set<?>> mss = new HashMap<>();

  Set<Class<? extends Annotation>> foo() {
    Set<Class<? extends Annotation>> l = new HashSet<>(this.foo());
    return l;
  }
}

class MyGeneric<@NonNull T extends @Nullable Number> {}

class UseMyGeneric {
  MyGeneric<?> wildcardUnbounded = new MyGeneric<>();

  // :: error: (assignment)
  MyGeneric<? extends @NonNull Object> wildcardOutsideUB = wildcardUnbounded;
  MyGeneric<? extends @NonNull Number> wildcardInsideUB = wildcardOutsideUB;
  // :: error: (assignment)
  MyGeneric<? extends @NonNull Number> wildcardInsideUB2 = wildcardUnbounded;

  MyGeneric<? extends @Nullable Number> wildcardInsideUBNullable = wildcardOutsideUB;
}

class MyGenericExactBounds<@NonNull T extends @NonNull Number> {}

class UseMyGenericExactBounds {
  // :: error: (type.argument)
  MyGenericExactBounds<? extends @Nullable Object> wildcardOutsideUBError =
      new MyGenericExactBounds<>();
  MyGenericExactBounds<? extends @NonNull Object> wildcardOutside = new MyGenericExactBounds<>();
  MyGenericExactBounds<? extends @NonNull Number> wildcardInsideUB = wildcardOutside;

  MyGenericExactBounds<?> wildcardOutsideUB = wildcardOutside;
}
