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

/*@testedFeatures=checks*/

class C<T> {
  C(this.field1)
      : field2 = (() => field1),
        field3 = ((T t) {}),
        field4 = ((T t) => t),
        field5 = (() => () => field1),
        field6 = ((T Function() f) {}),
        field7 = ((T Function() f) => field1),
        field8 = ((void Function(T) f) {}),
        field9 = ((void Function(T) f) => field1),
        field10 = ((T Function(T) f) {}),
        field11 = ((T Function(T) f) => field1),
        field12 = <S extends T>() => throw '',
        field13 = <S extends T>(S s) {},
        field14 = <S extends T>(S s) => s,
        field15 = ((S Function<S extends T>() f) {});

  T field1;
  T Function() field2;
  void Function(/*contravariant*/ T) field3;
  T Function(/*contravariant*/ T) field4;
  T Function() Function() field5;
  void Function(/*contravariant*/ T Function()) field6;
  T Function(/*contravariant*/ T Function()) field7;
  void Function(void Function(T)) field8;
  T Function(void Function(T)) field9;
  void Function(/*contravariant*/ T Function(T)) field10;
  T Function(/*contravariant*/ T Function(T)) field11;

  S Function<S extends /*invariant*/ T>() field12;
  void Function<S extends /*invariant*/ T>(S) field13;
  S Function<S extends /*invariant*/ T>(S) field14;
  void Function(S Function<S extends /*invariant*/ T>()) field15;

  T get getter1 => field1;
  T Function() get getter2 => field2;
  void Function(/*contravariant*/ T) get getter3 => field3;
  T Function(/*contravariant*/ T) get getter4 => field4;
  T Function() Function() get getter5 => field5;
  void Function(/*contravariant*/ T Function()) get getter6 => field6;
  T Function(/*contravariant*/ T Function()) get getter7 => field7;
  void Function(void Function(T)) get getter8 => field8;
  T Function(void Function(T)) get getter9 => field9;
  void Function(/*contravariant*/ T Function(T)) get getter10 => field10;
  T Function(/*contravariant*/ T Function(T)) get getter11 => field11;

  S Function<S extends /*invariant*/ T>() get getter12 => field12;
  void Function<S extends /*invariant*/ T>(S) get getter13 => field13;
  S Function<S extends /*invariant*/ T>(S) get getter14 => field14;
  void Function(S Function<S extends /*invariant*/ T>()) get getter15 =>
      field15;

  void set setter1(/*covariant*/ T value) {
    field1 = value;
  }

  void set setter2(/*covariant*/ T Function() value) {
    field2 = value;
  }

  void set setter3(void Function(T) value) {
    field3 = value;
  }

  void set setter4(/*covariant*/ T Function(T) value) {
    field4 = value;
  }

  void set setter5(/*covariant*/ T Function() Function() value) {
    field5 = value;
  }

  void set setter6(void Function(T Function()) value) {
    field6 = value;
  }

  void set setter7(/*covariant*/ T Function(T Function()) value) {
    field7 = value;
  }

  void set setter8(void Function(void Function(/*covariant*/ T)) value) {
    field8 = value;
  }

  void set setter9(
      /*covariant*/ T Function(void Function(/*covariant*/ T)) value) {
    field9 = value;
  }

  void set setter10(void Function(T Function(/*covariant*/ T)) value) {
    field10 = value;
  }

  void set setter11(
      /*covariant*/ T Function(T Function(/*covariant*/ T)) value) {
    field11 = value;
  }

  void set setter12(S Function<S extends /*invariant*/ T>() value) {
    field12 = value;
  }

  void set setter13(void Function<S extends /*invariant*/ T>(S) value) {
    field13 = value;
  }

  void set setter14(S Function<S extends /*invariant*/ T>(S) value) {
    field14 = value;
  }

  void set setter15(
      void Function(S Function<S extends /*invariant*/ T>()) value) {
    field15 = value;
  }

  void method1(/*covariant*/ T value) {
    field1 = value;
  }

  void method2(/*covariant*/ T Function() value) {
    field2 = value;
  }

  void method3(void Function(T) value) {
    field3 = value;
  }

  void method4(/*covariant*/ T Function(T) value) {
    field4 = value;
  }

  void method5(/*covariant*/ T Function() Function() value) {
    field5 = value;
  }

  void method6(void Function(T Function()) value) {
    field6 = value;
  }

  void method7(/*covariant*/ T Function(T Function()) value) {
    field7 = value;
  }

  void method8(void Function(void Function(/*covariant*/ T)) value) {
    field8 = value;
  }

  void method9(/*covariant*/ T Function(void Function(/*covariant*/ T)) value) {
    field9 = value;
  }

  void method10(void Function(T Function(/*covariant*/ T)) value) {
    field10 = value;
  }

  void method11(/*covariant*/ T Function(T Function(/*covariant*/ T)) value) {
    field11 = value;
  }

  void method12(S Function<S extends /*invariant*/ T>() value) {
    field12 = value;
  }

  void method13(void Function<S extends /*invariant*/ T>(S) value) {
    field13 = value;
  }

  void method14(S Function<S extends /*invariant*/ T>(S) value) {
    field14 = value;
  }

  void method15(void Function(S Function<S extends /*invariant*/ T>()) value) {
    field15 = value;
  }
}

main() {
  C<num> c = new C<int>(0);
  c.field1;
  c.field2;
  try {
    c. /*@checkReturn=(num) -> void*/ field3;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=(num) -> num*/ field4;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.field5;
  try {
    c. /*@checkReturn=(() -> num) -> void*/ field6;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=(() -> num) -> num*/ field7;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.field8;
  c.field9;
  try {
    c. /*@checkReturn=((num) -> num) -> void*/ field10;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=((num) -> num) -> num*/ field11;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=<S extends num = dynamic>() -> S*/ field12;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=<S extends num = dynamic>(S) -> void*/ field13;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=<S extends num = dynamic>(S) -> S*/ field14;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=(<S extends num = dynamic>() -> S) -> void*/ field15;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }

  c.getter1;
  c.getter2;
  try {
    c. /*@checkReturn=(num) -> void*/ getter3;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=(num) -> num*/ getter4;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.getter5;
  try {
    c. /*@checkReturn=(() -> num) -> void*/ getter6;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=(() -> num) -> num*/ getter7;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.getter8;
  c.getter9;
  try {
    c. /*@checkReturn=((num) -> num) -> void*/ getter10;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=((num) -> num) -> num*/ getter11;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=<S extends num = dynamic>() -> S*/ getter12;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=<S extends num = dynamic>(S) -> void*/ getter13;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=<S extends num = dynamic>(S) -> S*/ getter14;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c. /*@checkReturn=(<S extends num = dynamic>() -> S) -> void*/ getter15;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }

  try {
    c.setter1 = 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter2 = () => 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.setter3 = (num n) {};
  try {
    c.setter4 = (num n) => 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter5 = () => () => 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.setter6 = (num Function() f) {};
  try {
    c.setter7 = (num Function() f) => 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter8 = (void Function(double) f) {};
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter9 = (void Function(double) f) => 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter10 = (num Function(double) f) {};
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter11 = (num Function(double) f) => 0.5;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter12 = <S extends num>() => throw '';
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter13 = <S extends num>(S s) {};
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter14 = <S extends num>(S s) => s;
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.setter15 = (S Function<S extends num>() f) {};
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }

  try {
    c.method1(0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method2(() => 0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.method3((num n) {});
  try {
    c.method4((num n) => 0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method5(() => () => 0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  c.method6((num Function() f) {});
  try {
    c.method7((num Function() f) => 0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method8((void Function(double) f) {});
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method9((void Function(double) f) => 0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method10((num Function(double) f) {});
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method11((num Function(double) f) => 0.5);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method12(<S extends num>() => throw '');
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method13(<S extends num>(S s) {});
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method14(<S extends num>(S s) => s);
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
  try {
    c.method15((S Function<S extends num>() f) {});
    throw 'TypeError expected';
  } on TypeError catch (e) {
    print(e);
  }
}
