// Test case for Issue 319:
// https://github.com/typetools/checker-framework/issues/319

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

public class Issue319 {
  class Foo<T> {
    Foo(@Nullable T t) {}
  }

  <T> Foo<T> newFoo(@Nullable T t) {
    return new Foo<>(t);
  }

  void pass() {
    Foo<Boolean> f = newFoo(Boolean.FALSE);
  }

  void fail() {
    Foo<Boolean> f = newFoo(null);
  }

  void workaround() {
    Foo<Boolean> f = Issue319.this.<Boolean>newFoo(null);
  }
}

class Issue319NN {
  class Foo<T> {
    Foo(@NonNull T t) {}
  }

  <T> Foo<T> newFoo(@NonNull T t) {
    return new Foo<>(t);
  }

  void pass() {
    Foo<Boolean> f = newFoo(Boolean.FALSE);
  }

  void fail() {
    // :: error: (argument)
    Foo<Boolean> f = newFoo(null);
  }

  void pass2() {
    Foo<@Nullable Boolean> f = newFoo(Boolean.FALSE);
  }
}
