// Copyright (c) 2017, 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.

/*@testedFeatures=inference*/
library test;

class C<T> {
  C.optional(void func([T x])) {}
  C.named(void func({T x})) {}
}

void optional_toplevel([x = /*@typeArgs=int*/ const [0]]) {}

void named_toplevel({x: /*@typeArgs=int*/ const [0]}) {}

main() {
  void optional_local([/*@ type=dynamic */ x = /*@typeArgs=int*/ const [0]]) {}
  void named_local({/*@ type=dynamic */ x: /*@typeArgs=int*/ const [0]}) {}
  var /*@type=C<dynamic>*/ c_optional_toplevel =
      new /*@ typeArgs=dynamic */ C.optional(optional_toplevel);
  var /*@type=C<dynamic>*/ c_named_toplevel =
      new /*@ typeArgs=dynamic */ C.named(named_toplevel);
  var /*@type=C<dynamic>*/ c_optional_local =
      new /*@ typeArgs=dynamic */ C.optional(optional_local);
  var /*@type=C<dynamic>*/ c_named_local =
      new /*@ typeArgs=dynamic */ C.named(named_local);
  var /*@type=C<Object?>*/ c_optional_closure =
      new /*@typeArgs=Object?*/ C.optional(/*@returnType=void*/ (
          [/*@type=Object?*/ x = /*@typeArgs=int*/ const [0]]) {});
  var /*@type=C<Object?>*/ c_named_closure = new /*@typeArgs=Object?*/ C.named(
      /*@returnType=void*/ (
          {/*@type=Object?*/ x: /*@typeArgs=int*/ const [0]}) {});
}
