library;
//
// Problems in library:
//
// pkg/front_end/testcases/missing_constructor.dart:10:11: Error: Superclass has no constructor named 'Super'.
//   Sub() : super();
//           ^^^^^
//
// pkg/front_end/testcases/missing_constructor.dart:11:15: Error: Superclass has no constructor named 'Super.foo'.
//   Sub.foo() : super.foo();
//               ^^^^^
//
// pkg/front_end/testcases/missing_constructor.dart:15:15: Error: Couldn't find constructor 'Bad'.
//   Bad.foo() : this();
//               ^^^^
//
// pkg/front_end/testcases/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
//   Bad.bar() : this.baz();
//               ^^^^
//
// pkg/front_end/testcases/missing_constructor.dart:22:24: Error: Superclass has no constructor named 'Super'.
//   MixinApplication() : super();
//                        ^^^^^
//
// pkg/front_end/testcases/missing_constructor.dart:23:28: Error: Superclass has no constructor named 'Super.foo'.
//   MixinApplication.foo() : super.foo();
//                            ^^^^^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  constructor _() → self::Super
    : super core::Object::•()
    ;
}
class Sub extends self::Super {
  constructor •() → self::Sub
    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/missing_constructor.dart:10:11: Error: Superclass has no constructor named 'Super'.
  Sub() : super();
          ^^^^^"
    ;
  constructor foo() → self::Sub
    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/missing_constructor.dart:11:15: Error: Superclass has no constructor named 'Super.foo'.
  Sub.foo() : super.foo();
              ^^^^^"
    ;
}
class Bad extends core::Object {
  constructor foo() → self::Bad
    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/missing_constructor.dart:15:15: Error: Couldn't find constructor 'Bad'.
  Bad.foo() : this();
              ^^^^"
    ;
  constructor bar() → self::Bad
    : final dynamic #t4 = invalid-expression "pkg/front_end/testcases/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
  Bad.bar() : this.baz();
              ^^^^"
    ;
}
class M extends core::Object {
  synthetic constructor •() → self::M
    : super core::Object::•()
    ;
}
abstract class _MixinApplication&Super&M extends self::Super implements self::M {
  synthetic constructor _() → self::_MixinApplication&Super&M
    : super self::Super::_()
    ;
}
class MixinApplication extends self::_MixinApplication&Super&M {
  constructor •() → self::MixinApplication
    : final dynamic #t5 = invalid-expression "pkg/front_end/testcases/missing_constructor.dart:22:24: Error: Superclass has no constructor named 'Super'.
  MixinApplication() : super();
                       ^^^^^"
    ;
  constructor foo() → self::MixinApplication
    : final dynamic #t6 = invalid-expression "pkg/front_end/testcases/missing_constructor.dart:23:28: Error: Superclass has no constructor named 'Super.foo'.
  MixinApplication.foo() : super.foo();
                           ^^^^^"
    ;
}
static method main() → dynamic {}
