/*
 * 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 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-weak
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);
}
