// 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:
 * Left Null: if T0 is Null then:
 * - if T1 is a type variable (promoted or not) the query is false
 * - If T1 is FutureOr<S> for some S, then the query is true iff Null <: S.
 * - If T1 is Null, S? or S* for some S, then the query is true.
 * - Otherwise, the query is false
 * @description Check that if type T0 is Null and If T1 is S? then T0 is
 * subtype of T1
 * @author sgrekhov@unipro.ru
 */
/**
 * @description Check that if type T0 is a subtype of a type T1, then instance
 * of T0 can be be assigned to the to local variable of type T1
 * @author sgrekhov@unipro.ru
 */
/*
 * This test is generated from left_null_A05.dart and 
 * local_variable_x01.dart.
 * Don't modify it. If you want to change this file, change one of the files 
 * above and then run generator.dart to regenerate the tests.
 */



class S {
  const S();
}

Null t0Instance = null;
S? t1Instance = new S();

const t1Default = const S();




class LocalVariableTest {

  LocalVariableTest() {
    S? t1 = t0Instance;
    t1 = t0Instance;
  }

  static staticTest() {
    S? t1 = t0Instance;
    t1 = t0Instance;
  }

  test() {
    S? t1 = t0Instance;
    t1 = t0Instance;
  }
}

main() {
  foo() {
    S? t1 = t0Instance;
    t1 = t0Instance;
  }

  S? t1 = t0Instance;
  t1 = t0Instance;
  foo();
  LocalVariableTest x = new LocalVariableTest();
  x.test();
  LocalVariableTest.staticTest();
}
