// 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.

// @dart = 2.9

// Tests that the correct places allows, and requires, potentially constant
// expressions.

bool get nonConst => true;

class C {
  final v;
  const C(this.v);

  // Redirecting generative constructor invocation parameters,
  // must be potentially constant.
  const C.r1() : this(const C(null));

  // Only evaluates the true branch when passed `true` as argument.
  const C.r2(bool b) : this(b ? null : 1 ~/ 0);

  const C.rn1() : this(nonConst);
  //                   ^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
  // [cfe] Constant evaluation error:

  const C.rn2(bool b) : this(b ? null : nonConst);
  //                                    ^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
  // [cfe] Constant evaluation error:

  // Initializer list expressions must be potentially constant.
  const C.g1() : v = const C(null);

  const C.g2(bool b) : v = b ? null : 1 ~/ 0;

  const C.gn3() : v = nonConst;
  //                  ^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
  // [cfe] Constant evaluation error:

  const C.gn4(bool b) : v = b ? null : nonConst;
  //                                   ^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
  // [cfe] Constant evaluation error:

  // Constant constructor initializer list assert expressions
  // must be potentially constant (and boolean).
  const C.a1()
      : assert(const C(null) != null),
        v = null;

  const C.a2(bool b)
      : assert(b ? const C(null) != null : ((1 ~/ 0) as bool)),
        v = null;

  const C.an1()
      : assert(nonConst),
        //     ^^^^^^^^
        // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
        // [cfe] Constant evaluation error:
        v = null;

  const C.an2(bool b)
      : assert(b ? true : nonConst),
        //                ^^^^^^^^
        // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
        // [cfe] Constant evaluation error:
        v = null;
}

main() {
  var c = const C(null);
  var cc = const C(C(null));

  var r1 = const C.r1();
  var r2 = const C.r2(true);

  /// Const constructor invocation which would throw.
  /**/ const C.r2(false);
  //   ^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //         ^^^^^^^^^^^
  // [cfe] Constant evaluation error:

  var g1 = const C.g1();
  var g2 = const C.g2(true);
  /**/ const C.g2(false);
  //   ^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //         ^^^^^^^^^^^
  // [cfe] Constant evaluation error:

  var a1 = const C.a1();
  var a2 = const C.a2(true);
  /**/ const C.a2(false);
  //   ^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //         ^^^^^^^^^^^
  // [cfe] Constant evaluation error:
}
