/*
 * 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. Test legacy
 * pre-NNBD types
 * @author sgrekhov@unipro.ru
 */
// Requirements=nnbd-weak
import "legacy_lib.dart";

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

  static void test11({required A? x, String y = "", required A? z}) {}
  void test22({required A? x, String y = "", required A? z}) {}
}

void test3({required A x, String y = "", required A z}) {}
void test33({required A? x, String y = "", required A? z}) {}

typedef void Foo({required A x, String y, required A z});
typedef void Foo2({required A? x, String y, required A? z});

main() {
  A a = new A();
  Foo foo = ({required A x, String y = "", required A z}) {};
  Foo2 foo2 = ({required A? x, String y = "", required A? z}) {};

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

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

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

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

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

  test33(x: a, y: "");
//                  ^
// [analyzer] unspecified
// [cfe] unspecified

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

  foo2(x: a, y: "");
//                ^
// [analyzer] unspecified
// [cfe] unspecified

  C.test1(z: a, y: "woman");
//                           ^
// [analyzer] unspecified
// [cfe] unspecified

  C.test11(z: a, y: "cry");
//                          ^
// [analyzer] unspecified
// [cfe] unspecified

  C().test2(z: a, y: "woman");
//                             ^
// [analyzer] unspecified
// [cfe] unspecified

  C().test22(z: null, y: "cry");
//                            ^
// [analyzer] unspecified
// [cfe] unspecified

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

  test33(z: null, y: "cry");
//                        ^
// [analyzer] unspecified
// [cfe] unspecified

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

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