abstract class A {
  const A();
  const factory A.redir() = B;
}

class B extends A {
  const B();
}

class C {
  C({A a = const A.redir()});
  factory C.f({A a = const A.redir()}) => C(a: a);
  const C.c({A a = const A.redir()});
  foo({A a = const A.redir()}) {}
  static bar({A a = const A.redir()}) {}
}

extension E on C {
  foo({A a = const A.redir()}) {}
}

extension type ET(C c) {
  ET.named(C c, {A a = const A.redir()}) : this(c);
  foo({A a = const A.redir()}) {}
}

foo({A a = const A.redir()}) {}
