// 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 potenentially 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:
}
