// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// @assertion We say that a type T0 is a subtype of a type T1 (written T0 <: T1)
/// when:
/// Right Nullable: if T1 is S1? then:
///  T0 <: T1 iff any of the following hold:
///  either T0 <: S1
///  or T0 <: Null
///  or T0 is X0 and X0 has bound S0 and S0 <: T1
///  or T0 is X0 & S0 and S0 <: T1
/// @description Check that if type T1 is S1? and T0 is X0 & S0 and S0 <: T1 then
/// T0 is subtype of T1.
/// @author sgrekhov@unipro.ru


class S1 {
  const S1();
}
class X0 {}
class S0 extends X0 implements S1 {}

X0 t0Instance = new S0();
S1? t1Instance = const S1();

const t1Default = const S1();

test<T>(T t0Instance) {
  if (t0Instance is S0) {
    foo() {
      S1? t1 = t0Instance;
      t1 = t0Instance;
      t1Instance = t0Instance;
    }

    S1? t1 = t0Instance;
    t1 = t0Instance;
    t1Instance = t0Instance;
    foo();

    S1? returnValueLocalFunc() => t0Instance;
  }
}

main() {
  test<X0>(t0Instance);
}
