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

import java.util.ArrayList;
import java.util.List;
import org.checkerframework.checker.nullness.qual.UnknownKeyFor;

public class TestInfer {
  <T extends Object> T getValue(List<T> l) {
    return l.get(0);
  }

  void bar(Object o) {}

  void foo() {
    List<@UnknownKeyFor ? extends Object> ls = new ArrayList<>();
    bar(getValue(ls)); // this fails, but just getValue(ls) is OK
    // casting is also OK, ie bar((Object)getValue(ls))
    // The constraint should be T<:Object, which should typecheck since ls:List<? extends
    // Object> unifies with List<T> where T<:Object.
  }
}
