// Copyright (c) 2018, 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 T1 is FutureOr<S> for some S,
/// and Null is subtype of 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 assigned to the to local variable of type T1
/// @author sgrekhov@unipro.ru
///
/// This test is generated from left_null_A02.dart and 
/// local_variable_x01.dart.
/// Don't modify it. If you want to change this test, change one of the files 
/// above and then run generator.dart to regenerate the tests.



import "dart:async";

Null t0Instance = null;
FutureOr<Null> t1Instance = null;

const t1Default = null;




class LocalVariableTest {

  LocalVariableTest() {
    FutureOr<Null> t1 = t0Instance;
    t1 = t0Instance;
  }

  static staticTest() {
    FutureOr<Null> t1 = t0Instance;
    t1 = t0Instance;
  }

  test() {
    FutureOr<Null> t1 = t0Instance;
    t1 = t0Instance;
  }
}

main() {
  foo() {
    FutureOr<Null> t1 = t0Instance;
    t1 = t0Instance;
  }

  FutureOr<Null> t1 = t0Instance;
  t1 = t0Instance;
  foo();
  LocalVariableTest x = new LocalVariableTest();
  x.test();
  LocalVariableTest.staticTest();
}
