library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:69:38: Error: New expression is not a constant expression.
//   const B7.foo({super.x}) : super(y: new Test.foo()); // Error.
//                                      ^^^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:70:38: Error: New expression is not a constant expression.
//   const B7.bar({super.x}) : super(y: new Test.bar()); // Error.
//                                      ^^^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:78:36: Error: New expression is not a constant expression.
//   const B8.foo(super.x) : super(y: new Test.foo()); // Error.
//                                    ^^^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:79:36: Error: New expression is not a constant expression.
//   const B8.bar(super.x) : super(y: new Test.bar()); // Error.
//                                    ^^^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:87:35: Error: New expression is not a constant expression.
//   const B9.foo({super.y}) : super(new Test.foo()); // Error.
//                                   ^^^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:88:35: Error: New expression is not a constant expression.
//   const B9.bar({super.y}) : super(new Test.bar()); // Error.
//                                   ^^^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:70:42: Error: Cannot invoke a non-'const' factory where a const expression is expected.
// Try using a constructor or factory that is 'const'.
//   const B7.bar({super.x}) : super(y: new Test.bar()); // Error.
//                                          ^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:79:40: Error: Cannot invoke a non-'const' factory where a const expression is expected.
// Try using a constructor or factory that is 'const'.
//   const B8.bar(super.x) : super(y: new Test.bar()); // Error.
//                                        ^
//
// pkg/front_end/testcases/super_parameters/issue48642.dart:88:39: Error: Cannot invoke a non-'const' factory where a const expression is expected.
// Try using a constructor or factory that is 'const'.
//   const B9.bar({super.y}) : super(new Test.bar()); // Error.
//                                       ^
//
import self as self;
import "dart:core" as core;

class Test extends core::Object {
  constructor foo() → self::Test
    ;
  static factory bar() → self::Test
    ;
}
class A1 extends core::Object {
  constructor •({dynamic x = null, dynamic y = null}) → self::A1
    ;
}
class B1 extends self::A1 {
  constructor foo({dynamic x = null}) → self::B1
    ;
  constructor bar({dynamic x = null}) → self::B1
    ;
}
class A2 extends core::Object {
  constructor •(dynamic x, {dynamic y = null}) → self::A2
    ;
}
class B2 extends self::A2 {
  constructor foo(dynamic x) → self::B2
    ;
  constructor bar(dynamic x) → self::B2
    ;
}
class A3 extends core::Object {
  constructor •(dynamic x, {dynamic y = null}) → self::A3
    ;
}
class B3 extends self::A3 {
  constructor foo({dynamic y = null}) → self::B3
    ;
  constructor bar({dynamic y = null}) → self::B3
    ;
}
class A4 extends core::Object /*hasConstConstructor*/  {
  const constructor •({dynamic x = null, dynamic y = null}) → self::A4
    : super core::Object::•()
    ;
}
class B4 extends self::A4 {
  constructor foo({dynamic x = null}) → self::B4
    ;
  constructor bar({dynamic x = null}) → self::B4
    ;
}
class A5 extends core::Object /*hasConstConstructor*/  {
  const constructor •(dynamic x, {dynamic y = null}) → self::A5
    : super core::Object::•()
    ;
}
class B5 extends self::A5 {
  constructor foo(dynamic x) → self::B5
    ;
  constructor bar(dynamic x) → self::B5
    ;
}
class A6 extends core::Object /*hasConstConstructor*/  {
  const constructor •(dynamic x, {dynamic y = null}) → self::A6
    : super core::Object::•()
    ;
}
class B6 extends self::A6 {
  constructor foo({dynamic y = null}) → self::B6
    ;
  constructor bar({dynamic y = null}) → self::B6
    ;
}
class A7 extends core::Object /*hasConstConstructor*/  {
  const constructor •({dynamic x = null, dynamic y = null}) → self::A7
    : super core::Object::•()
    ;
}
class B7 extends self::A7 /*hasConstConstructor*/  {
  const constructor foo({dynamic x = null}) → self::B7
    : super self::A7::•(y: new self::Test::foo(), x: x)
    ;
  const constructor bar({dynamic x = null}) → self::B7
    : super self::A7::•(y: invalid-expression "pkg/front_end/testcases/super_parameters/issue48642.dart:70:42: Error: Cannot invoke a non-'const' factory where a const expression is expected.
Try using a constructor or factory that is 'const'.
  const B7.bar({super.x}) : super(y: new Test.bar()); // Error.
                                         ^", x: x)
    ;
}
class A8 extends core::Object /*hasConstConstructor*/  {
  const constructor •(dynamic x, {dynamic y = null}) → self::A8
    : super core::Object::•()
    ;
}
class B8 extends self::A8 /*hasConstConstructor*/  {
  const constructor foo(dynamic x) → self::B8
    : super self::A8::•(x, y: new self::Test::foo())
    ;
  const constructor bar(dynamic x) → self::B8
    : super self::A8::•(x, y: invalid-expression "pkg/front_end/testcases/super_parameters/issue48642.dart:79:40: Error: Cannot invoke a non-'const' factory where a const expression is expected.
Try using a constructor or factory that is 'const'.
  const B8.bar(super.x) : super(y: new Test.bar()); // Error.
                                       ^")
    ;
}
class A9 extends core::Object /*hasConstConstructor*/  {
  const constructor •(dynamic x, {dynamic y = null}) → self::A9
    : super core::Object::•()
    ;
}
class B9 extends self::A9 /*hasConstConstructor*/  {
  const constructor foo({dynamic y = null}) → self::B9
    : super self::A9::•(new self::Test::foo(), y: y)
    ;
  const constructor bar({dynamic y = null}) → self::B9
    : super self::A9::•(invalid-expression "pkg/front_end/testcases/super_parameters/issue48642.dart:88:39: Error: Cannot invoke a non-'const' factory where a const expression is expected.
Try using a constructor or factory that is 'const'.
  const B9.bar({super.y}) : super(new Test.bar()); // Error.
                                      ^", y: y)
    ;
}
static method main() → dynamic
  ;
