abstract class Cls<T1> {
  public Cls() {}
}

abstract class Cls2<T2> extends Cls<T2> {
  public Cls2() {}
}

abstract class Cls3<T3 extends Float> extends Cls2<T3> {
  public Cls3() {}
}

class Cls4<T4 extends Cls3<? super Float>> {
  public Cls4() {}
}

final class Cls5 {
  public Cls5() {}
  public final Cls4<? extends Cls3<Float>> foo() {
    Cls4<? extends Cls3<Float>> y = new Cls4<>();
    var x = y;
    // Cls4<? extends Cls3<Float>> x = y; // This works
    return x;
  }
} 