/*
 * Copyright (c) 2019, 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 A toplevel or static variable with an initializer is evaluated as
 * if it was marked late. Note that this is a change from pre-NNBD semantics in
 * that:
 *  - Throwing an exception during initializer evaluation no longer sets the
 *    variable to null
 *  - Reading the variable during initializer evaluation is no longer checked
 *    for, and does not cause an error.
 *
 * @description Check that throwing an exception during initializer evaluation
 * no longer sets a toplevel or static variable no null
 * @author sgrekhov@unipro.ru
 * @issue 40390
 */
// Requirements=nnbd-strong
import "../../Utils/expect.dart";

String _log = "";
int _counter = 0;

String init(String val, void readme()) {
  _counter++;
  _log = "init('$val'), counter: $_counter";
  if (_counter == 1) {
    readme();
    throw new Exception();
  }
  return val;
}

void clear() {
  _counter = 0;
}

class C {
  static final String? s1 = init("No", (){C.s1;});
  static String? s2 = init("woman", (){C.s2;});
}

final String? g1 = init("no", (){g1;});
String? g2 = init("cry", (){g2;});

main() {
  Expect.equals("", _log);
  Expect.throws(() {C.s1;});
  Expect.equals("No", C.s1);
  Expect.equals("init('No'), counter: 2", _log);
  clear();

  Expect.throws(() {C.s2;});
  Expect.equals("woman", C.s2);
  Expect.equals("init('woman'), counter: 2", _log);
  clear();

  Expect.throws(() {g1;});
  Expect.equals("no", g1);
  Expect.equals("init('no'), counter: 2", _log);
  clear();

  Expect.throws(() {g2;});
  Expect.equals("cry", g2);
  Expect.equals("init('cry'), counter: 2", _log);
}
