library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
//   A.new();
//     ^^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
//   factory A.redirectingFactory() = A.new;
//                                      ^^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
//   factory A.redirectingFactoryChild() = B.new;
//                                           ^^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:41: Error: Redirection constructor target not found: 'B.new'
//   factory A.redirectingFactoryChild() = B.new;
//                                         ^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
//   A Function() f1 = A.redirectingFactory;
//                       ^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
//   A Function() f2 = A.redirectingFactoryChild;
//                       ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
//   A Function() f3 = A.redirectingTwice;
//                       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
//   A x3 f3();
//     ^^
//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
// class B extends A {}
//       ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
  constructor new() → self::A
    : super core::Object::•()
    ;
  static factory redirectingFactory() → self::A
    let dynamic #redirecting_factory = self::A::new in invalid-expression;
  static factory redirectingFactoryChild() → self::A
    let dynamic #redirecting_factory = "B.new" in invalid-expression;
  static factory redirectingTwice() → self::A
    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
}
class B extends self::A {
  synthetic constructor •() → self::B
    : invalid-initializer
    ;
}
static method test() → dynamic {
  () → self::A f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
  A Function() f1 = A.redirectingFactory;
                      ^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
  () → self::A f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
  A Function() f2 = A.redirectingFactoryChild;
                      ^^^^^^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
  () → self::A f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
  A Function() f3 = A.redirectingTwice;
                      ^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
  self::A x1 = f1(){() → self::A};
  self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
  self::A x3;
  f3(){() → self::A};
}
static method main() → dynamic
  return self::test();
