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

// Checks that compile-time errors in the arguments are reported when the named
// arguments are placed before the positional.

// SharedOptions=--enable-experiment=named-arguments-anywhere

const a42 = const A(42);

class A {
  final int value;

  const A(this.value);
}

class B {
  final A a;

  const B(this.a) : assert(identical(a, a42));
}

foo(B x, {required B y}) {}

test() {
  foo(const B(const A(0)), y: const B(new A(42)));
  //  ^^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //        ^
  // [cfe] Constant evaluation error:
  //                          ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //                                  ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
  // [cfe] New expression is not a constant expression.
  //                                      ^
  // [cfe] New expression is not a constant expression.
  foo(y: const B(new A(42)), const B(const A(0)));
  //     ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //             ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
  // [cfe] New expression is not a constant expression.
  //                 ^
  // [cfe] New expression is not a constant expression.
  //                         ^^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
  //                               ^
  // [cfe] Constant evaluation error:
}

main() {}
