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