// 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. // Tests closures with const functions. // SharedOptions=--enable-experiment=const-functions import "package:expect/expect.dart"; const var1 = foo(); // ^^^^^ // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE int foo() { var f = () { int count = 0; int baz() { ++count; return count; } return baz; }; var c1 = f(); var c2 = f(); var c1_val1 = c1(); assert(c1_val1 == 1); var c1_val2 = c1(); assert(c1_val2 == 2); var c1_val3 = c1(); assert(c1_val3 == 3); var c2_val1 = c2(); assert(c1_val1 == 1); var c2_val2 = c2(); assert(c1_val2 == 2); var c2_val3 = c2(); assert(c1_val3 == 3); return 0; } const var2 = fn(); // ^^^^ // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE int fn() { return (() => 0)(); } const y = 1; const var3 = fn3(); // ^^^^^ // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE int fn3() { int y = 2; return y; } const var4 = fn4(); // ^^^^^ // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE int fn4() { var x = 0; int innerFn() { return x; } return innerFn(); } const var5 = fn5(3); // ^^^^^^ // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE int fn5(int a) { int recurse(int b) { if (b == 1) return 1; int result = recurse(b - 1); return b * result; } return recurse(a); } const var6 = fn6(4); // ^^^^^^ // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE int fn6(int a) { int recurse() { a--; if (a == 1) return 1; return a * recurse(); } return recurse(); } void main() { Expect.equals(var1, 0); Expect.equals(var2, 0); Expect.equals(var3, 2); Expect.equals(var4, 0); Expect.equals(var5, 6); Expect.equals(var6, 6); }