// 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 Let d be the declaration of a variable v.  If d is a local or
/// instance variable, then the invocation of the implicit getter of v
/// evaluates to the value stored in v.
/// If d is a static or library variable then the implicit getter method of v
/// executes as follows:
/// - Non-constant variable declaration with initializer. If d is of one of the 
///   forms var v = e; , T v = e; , final v = e; , final T v = e; , static 
///   v = e; , static T v = e; , static final v = e;  or static final T v = e; 
///   and no value has yet been stored into v then the initializer expression 
///   e is evaluated. If, during the evaluation of e, the getter for v is
///   invoked, a CyclicInitializationError is thrown. If the evaluation 
///   succeeded yielding an object o, let r = o, otherwise let r = null. In 
///   any case, r is stored into v. The result of executing the getter is r.
/// - Constant variable declaration. If d is of one of the forms const v = e; ,
///   const T v = e; , static const v = e;  or static const T v = e; the result
///   of the getter is the value of the compile time constant e. Note that a
///   compile time constant cannot depend on itself, so no cyclic references 
///   can occur. Otherwise
/// - Variable declaration without initializer. The result of executing the
///   getter method is the value stored in v.
///
/// @note The language specification says 'If, during the evaluation of [e]
/// (which is the initializing expression for [v]), the getter for [v] is invoked,
/// a [CyclicInitializationError] is thrown', but this is overridden by the
/// following text in the nnbd feature specification: '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.'
/// So CyclicInitializationErrors are gone here when null safety is enabled.
/// In the test, [f] returns [null] (typed as [dynamic]), and the evaluation of
/// the initializing expression for [sVar] as well as [sFinal] discards the
/// function literal (() => sVar respectively () => sFinal) without ever
/// executing it. So we do not have a situation where the getter for
/// [sVar]/[sFinal] is invoked during the evaluation of its initializing
/// expression, and both variables just get initialized to the value [null]. No
/// recursion and no errors.
///
/// @description Checks that an error is not thrown with the null safety turned
/// on.
/// @author sgrekhov@unipro.ru
/// @issue 46086

f(func) {}

class C {
  static var sVar = f(() => sVar);
//           ^^^^
// [analyzer] unspecified
// [cfe] unspecified

  static final sFinal = f(() => sFinal);
//             ^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
  C? c;
}
