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

public class VoidUse {

  private Class<?> main_class1 = Void.TYPE;

  private Class<? extends @Nullable Object> main_class2 = Void.TYPE;

  public Void voidReturn(Void p) {
    voidReturn(null);
    return null;
  }

  // Void is treated as Nullable.  Is there a value on having it be NonNull?
  public abstract static class VoidTestNode<T extends Object> {}

  public static class VoidTestInvNode extends VoidTestNode<@NonNull Void> {}

  class Scanner<P extends Object> {
    public void scan(Object tree, P p) {}
  }

  // :: error: (type.argument)
  class MyScanner extends Scanner<Void> {
    void use(MyScanner ms) {
      ms.scan(new Object(), null);
    }
  }

  // :: error: (type.argument)
  class MyScanner2 extends Scanner<@Nullable Object> {
    void use(MyScanner2 ms) {
      ms.scan(new Object(), null);
    }
  }

  // Test case for issue #230
  Class<? extends @Nullable Object> voidClass() {
    return void.class;
  }

  Class<? extends @Nullable Object> VoidClass() {
    return Void.class;
  }

  Class<?> intClass() {
    return int.class;
  }

  Class<?> ListClass() {
    return java.util.List.class;
  }
}
