blob: 72b5c97cdcc4af5070314b74fb10777bb9f5d71b [file] [log] [blame]
// 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 read of a field or variable which is marked as late which has
/// not yet been written to causes the initializer expression of the variable to
/// be evaluated to a value, assigned to the variable or field, and returned as
/// the value of the read.
/// ...
/// Evaluating the initializer expression may cause an exception to be thrown. If
/// the variable was written to before the exception was thrown, the value of the
/// variable on subsequent reads is the last written value. If the variable was
/// not written before the exception was thrown, then the next read attempts to
/// evaluate the initializer expression again.
///
/// @description Check that if evaluating of the initializer expression throws an
/// exception and the value of the variable was not written to then next read
/// attempts to evaluate the initializer expression again
/// @author sgrekhov@unipro.ru
/// @issue 40390
// Requirements=nnbd-weak
import "../../../Utils/expect.dart";
String _log = "";
bool _called = false;
String init(String val) {
_log += "init('$val')";
if (!_called) {
_called = true;
throw new Exception();
}
return val;
}
void clearLog() {
_log = "";
_called = false;
}
class C {
static late String? s = init("Lily");
covariant late String? v1 = init("was");
late String? v2 = init("here");
}
late String? g = init("Let it be");
main() {
Expect.equals("", _log);
Expect.throws(() {C.s;});
Expect.equals("Lily", C.s);
Expect.equals("init('Lily')init('Lily')", _log);
clearLog();
C c = new C();
Expect.equals("", _log);
Expect.throws(() {c.v1;});
Expect.equals("was", c.v1);
Expect.equals("init('was')init('was')", _log);
clearLog();
Expect.throws(() {g;});
Expect.equals("Let it be", g);
Expect.equals("init('Let it be')init('Let it be')", _log);
clearLog();
}