| // Copyright (c) 2016, 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 Error thrown when a lazily initialized variable cannot be |
| * initialized. |
| * A static/library variable with an initializer expression is initialized the |
| * first time it is read. If evaluating the initializer expression causes |
| * another read of the variable, this error is thrown. |
| * |
| * @description |
| * From https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/feature-specification.md#late-fields-and-variables: |
| * If a variable or field is read from during the process of evaluating its own |
| * initializer expression, and no write to the variable has occurred, the read |
| * is treated as a first read and the initializer expression is evaluated again. |
| * |
| * 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. |
| * |
| * The test checks that if evaluating the initializer expression causes |
| * another read of the variable, then [CyclicInitializationError] is not thrown |
| * and [StackOverflowError] happens instead. |
| * @Issue 42470 |
| * @issue 42893 |
| * @author sgrekhov@unipro.ru |
| */ |
| import "../../../Utils/expect.dart"; |
| |
| class C { |
| static var x = f(); |
| static f() => x + 1; |
| } |
| |
| main() { |
| try { |
| C.x; |
| Expect.fail("StackOverflowError should be thrown"); |
| } on CyclicInitializationError catch (e) { |
| Expect.fail("StackOverflowError should be thrown"); |
| } on Error catch (e) { |
| // See https://github.com/dart-lang/sdk/issues/42893 |
| } |
| } |