/*
 * 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.
 */
/**
 * @assertion It is an error if a named parameter that is part of a required
 * group is not bound to an argument at a call site
 *
 * @description Check that it is an error if a named parameter that is part of a
 * required group is not bound to an argument at a call site
 * @author sgrekhov@unipro.ru
 */

class C {
  static void test1({required int x, String y = "", required String z}) {}
  void test2({required int x, String y = "", required String z}) {}
}

void test3({required int x, String y = "", required String z}) {}

typedef void Foo({required int x, String y, required String z});

main() {
  Foo foo = ({required int x, String y = "", required String z}) {};

  C.test1(x: 3, y: "");
//  ^^^^^
// [analyzer] unspecified
// [cfe] unspecified

  C().test2(x: 1, y: "");
//    ^^^^^
// [analyzer] unspecified
// [cfe] unspecified

    test3(x: 4, y: "");
//  ^^^^^
// [analyzer] unspecified
// [cfe] unspecified

    foo(x: 5, y: "");
//  ^^^
// [analyzer] unspecified
// [cfe] unspecified

  C.test1(z: "No", y: "woman");
//  ^^^^^
// [analyzer] unspecified
// [cfe] unspecified
  C().test2(z: "no", y: "cry");
//    ^^^^^
// [analyzer] unspecified
// [cfe] unspecified

  test3(z: "No", y: "woman");
//^^^^^
// [analyzer] unspecified
// [cfe] unspecified

  foo(z: "No", y: "woman");
//^^^
// [analyzer] unspecified
// [cfe] unspecified
}
