// Copyright (c) 2021, 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 Local variables with explicitly written types are given the
/// declared types as written. The declared type of the variable is considered a
/// "type of interest" in the sense defined in the flow analysis specification.
/// If the variable has an initializer (explicit or implicit) and is not final,
/// then the declaration is treated as an assignment for the purposes of
/// promotion.
///
/// @description Checks that if the local variable has an initializer (explicit
/// or implicit) and is not final, then the declaration is treated as an
/// assignment for the purposes of promotion.
///
/// @author sgrekhov@unipro.ru

// Requirements=nnbd-strong
import "../../Utils/expect.dart";

class C {
  static void testStatic() {
    int? x = 42;
    x.isEven;
    x = null;
    Expect.isNull(x?.isEven);

    int? y;
    Expect.isNull(y?.isEven);
    x = 42;
    x.isEven;

    late int? z = 42;
    z.isEven;
    z = null;
    Expect.isNull(z?.isEven);
  }

  test() {
    int? x = 42;
    x.isEven;
    x = null;
    Expect.isNull(x?.isEven);

    int? y;
    Expect.isNull(y?.isEven);
    x = 42;
    x.isEven;

    late int? z = 42;
    z.isEven;
    z = null;
    Expect.isNull(z?.isEven);
  }
}

main() {
  int? x = 42;
  x.isEven;
  x = null;
  Expect.isNull(x?.isEven);

  int? y;
  Expect.isNull(y?.isEven);
  x = 42;
  x.isEven;

  late int? z = 42;
  z.isEven;
  z = null;
  Expect.isNull(z?.isEven);

  C.testStatic();
  C().test();
}
