// Copyright (c) 2020, 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 an optional parameter (named or otherwise) with
/// no default value has a potentially non-nullable type except in the parameter
/// list of an abstract method declaration.
///
/// @description Check that it is not an error if an abstract method optional
/// parameter (named or otherwise) with no default value has a potentially
/// non-nullable type
/// @author sgrekhov@unipro.ru
/// @issue 40287
/// @issue 40954

// Requirements=nnbd-strong
import "dart:async";

typedef void Foo();

class X {}

abstract class C {
  void test1(var v, [Never n]);
  void test2(var v, {Never n});

  void test3(var v, [Function f]);
  void test4(var v, {Function f});

  void test5(var v, [Foo f]);
  void test6(var v, {Foo f});

  void test7(var v, [X x]);
  void test8(var v, {X x});

  void test11<T extends Object>(var v, [T t]);
  void test12<T extends Object>(var v, {T t});

  void test13<T extends Object?>(var v, [T t]);
  void test14<T extends Object?>(var v, {T t});

  void test15(var v, [FutureOr<Never> n]);
  void test16(var v, {FutureOr<Never> n});

  void test17(var v, [FutureOr<Function> f]);
  void test18(var v, {FutureOr<Function> f});

  void test19(var v, [FutureOr<Foo> f]);
  void test20(var v, {FutureOr<Foo> f});

  void test21(var v, [FutureOr<X> x]);
  void test22(var v, {FutureOr<X> x});

  void test25(var v, [FutureOr<FutureOr<X>> x]);
  void test26(var v, {FutureOr<FutureOr<X>> x});
}

main() {}
