// Formatted problems:
//
// 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();
//                            ^^^^^

library;
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 = self::Super with 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 {}
