// 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 erroneous closure situations with const functions.

// SharedOptions=--enable-experiment=const-functions

import "package:expect/expect.dart";

var varVariable = 1;
const var1 = fn();
//           ^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// [cfe] Constant evaluation error:
int fn() {
  return varVariable;
}

final finalVariable = 1;
const var2 = fn2();
//           ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// [cfe] Constant evaluation error:
int fn2() {
  return finalVariable;
}

const var3 = fn3();
//           ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int fn3() {
  int innerFn() {
    return x;
    //     ^
    // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  }

  const x = 0;
  //    ^
  // [cfe] Can't declare 'x' because it was already used in this scope.
  return innerFn();
}

const var4 = fn4();
//           ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int fn4() {
  var a = () {
    return x;
    //     ^
    // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  };
  var x = 1;
  //  ^
  // [cfe] Can't declare 'x' because it was already used in this scope.
  return a();
}

const var5 = fn5(1);
//           ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
fn5(a) {
  var a = () => a;
  //  ^
  // [cfe] Can't declare 'a' because it was already used in this scope.
  //            ^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  return a();
}

const x = 0;
void fn6() {
  var x = 1;
  int a() => x;
  const z = a();
  //        ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  //        ^
  // [cfe] Constant evaluation error:
}
