library;
//
// Problems in library:
//
// pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
//   const factory B() = C.named;
//                       ^
//
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  static const factory •() → self::A
    return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
  const factory B() = C.named;
                      ^";
  static synthetic method _#new#tearOff() → self::A
    return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
  const factory B() = C.named;
                      ^";
}
abstract class B extends core::Object implements self::A {
  static const factory •() → self::B
    return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
  const factory B() = C.named;
                      ^";
  static synthetic method _#new#tearOff() → self::B
    return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
  const factory B() = C.named;
                      ^";
}
class C extends core::Object implements self::B {
  synthetic constructor •() → self::C
    ;
  static method named() → self::C
    ;
  static synthetic method _#new#tearOff() → self::C
    return new self::C::•();
}
static method test() → dynamic
  ;
static method main() → dynamic
  ;
