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

class A1 {
  final int foo;
  A1(int this.foo);
}

class B1 extends A1 {
  B1(int super.foo);
}

class A2 {
  final int Function(int) foo;
  A2(int Function(int) this.foo);
}

class B2 extends A2 {
  B2(int Function(int) super.foo);
}

class A3 {
  final int Function(int) foo;
  A3(int this.foo(int));
}

class B3 extends A3 {
  B3(int super.foo(int));
}

class A4 {
  final void Function() Function(void Function()) foo;
  A4(void Function() this.foo(void Function()));
}

class B4 extends A4 {
  B4(void Function() super.foo(void Function()));
}


class A5 {
  final void Function() Function(void Function()) foo;
  A5(void Function() Function(void Function()) this.foo);
}

class B5 extends A5 {
  B5(void Function() Function(void Function()) super.foo);
}

main() {}
