library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:28:25: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'DA2'.
// Try changing type arguments so that they conform to the bounds.
// A Function() test5() => DA2<String>.new; // Error.
//                         ^
// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:15:13: Context: This is the type variable whose bound isn't conformed to.
// typedef DA2<X extends num> = A;
//             ^
//
// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:33:30: Error: A value of type 'B<String> Function()' can't be returned from a function with return type 'B<num> Function()'.
//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
// B<num> Function() test9() => DB1.new; // Error.
//                              ^
//
// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:42:32: Error: A value of type 'B<X> Function<X extends num>()' can't be returned from a function with return type 'B<Y> Function<Y>()'.
//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
// B<Y> Function<Y>() test17() => DB2.new; // Error.
//                                ^
//
// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:49:35: Error: A value of type 'B<X> Function<X extends num, Y extends String>()' can't be returned from a function with return type 'B<Y> Function<Y, Z>()'.
//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
// B<Y> Function<Y, Z>() test23() => DB3.new; // Error.
//                                   ^
//
import self as self;
import "dart:core" as core;

typedef DA1 = self::A;
typedef DA2<unrelated X extends core::num> = self::A;
typedef DB1 = self::B<core::String>;
typedef DB2<X extends core::num> = self::B<X>;
typedef DB3<X extends core::num, unrelated Y extends core::String> = self::B<X>;
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class B<X extends core::Object? = dynamic> extends core::Object {
  constructor •() → self::B<self::B::X%>
    : super core::Object::•()
    ;
  constructor foo() → self::B<self::B::X%>
    : super core::Object::•()
    ;
  static factory bar<X extends core::Object? = dynamic>() → self::B<self::B::bar::X%>
    return new self::B::•<self::B::bar::X%>();
}
static method test1() → () → self::A
  return #C1;
static method test2() → () → self::A
  return #C1;
static method test3() → () → self::A
  return #C2;
static method test4() → () → self::A
  return #C2;
static method test5() → () → self::A
  return #C1;
static method test6() → () → self::A
  return #C1;
static method test7() → () → self::B<core::String>
  return #C4;
static method test8() → () → self::B<core::String>
  return #C4;
static method test9() → () → self::B<core::num>
  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:33:30: Error: A value of type 'B<String> Function()' can't be returned from a function with return type 'B<num> Function()'.
 - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
B<num> Function() test9() => DB1.new; // Error.
                             ^" in (#C4) as{TypeError,ForNonNullableByDefault} () → self::B<core::num>;
static method test10() → () → self::B<core::String>
  return #C6;
static method test11() → () → self::B<core::String>
  return #C8;
static method test12() → () → self::B<core::num>
  return #C9;
static method test13() → () → self::B<core::num>
  return #C10;
static method test14() → () → self::B<core::num>
  return #C11;
static method test15() → () → self::B<core::num>
  return #C9;
static method test16() → <Y extends core::num = dynamic>() → self::B<Y>
  return #C12;
static method test17() → <Y extends core::Object? = dynamic>() → self::B<Y%>
  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:42:32: Error: A value of type 'B<X> Function<X extends num>()' can't be returned from a function with return type 'B<Y> Function<Y>()'.
 - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
B<Y> Function<Y>() test17() => DB2.new; // Error.
                               ^" in (#C12) as{TypeError,ForNonNullableByDefault} <Y extends core::Object? = dynamic>() → self::B<Y%>;
static method test18() → () → self::B<core::num>
  return #C9;
static method test19() → () → self::B<core::num>
  return #C10;
static method test20() → () → self::B<core::num>
  return #C11;
static method test21() → () → self::B<core::num>
  return #C9;
static method test22() → <Y extends core::num = dynamic, Z extends core::String = dynamic>() → self::B<Y>
  return #C13;
static method test23() → <Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>() → self::B<Y%>
  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:49:35: Error: A value of type 'B<X> Function<X extends num, Y extends String>()' can't be returned from a function with return type 'B<Y> Function<Y, Z>()'.
 - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
B<Y> Function<Y, Z>() test23() => DB3.new; // Error.
                                  ^" in (#C13) as{TypeError,ForNonNullableByDefault} <Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>() → self::B<Y%>;
static method test24() → () → self::B<core::String>
  return #C14;
static method main() → dynamic {}
static method _#DA2#new#tearOff<unrelated X extends core::num>() → self::A
  return new self::A::•();
static method _#DB2#new#tearOff<X extends core::num>() → self::B<self::_#DB2#new#tearOff::X>
  return new self::B::•<self::_#DB2#new#tearOff::X>();
static method _#DB2#foo#tearOff<X extends core::num>() → self::B<self::_#DB2#foo#tearOff::X>
  return new self::B::foo<self::_#DB2#foo#tearOff::X>();
static method _#DB2#bar#tearOff<X extends core::num>() → self::B<self::_#DB2#bar#tearOff::X>
  return self::B::bar<self::_#DB2#bar#tearOff::X>();
static method _#DB3#new#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#DB3#new#tearOff::X>
  return new self::B::•<self::_#DB3#new#tearOff::X>();
static method _#DB3#foo#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#DB3#foo#tearOff::X>
  return new self::B::foo<self::_#DB3#foo#tearOff::X>();
static method _#DB3#bar#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#DB3#bar#tearOff::X>
  return self::B::bar<self::_#DB3#bar#tearOff::X>();

constants  {
  #C1 = constructor-tearoff self::A::•
  #C2 = instantiation self::A::• <>
  #C3 = constructor-tearoff self::B::•
  #C4 = instantiation self::B::• <core::String*>
  #C5 = constructor-tearoff self::B::foo
  #C6 = instantiation self::B::foo <core::String*>
  #C7 = static-tearoff self::B::bar
  #C8 = instantiation self::B::bar <core::String*>
  #C9 = instantiation self::B::• <core::num*>
  #C10 = instantiation self::B::foo <core::num*>
  #C11 = instantiation self::B::bar <core::num*>
  #C12 = static-tearoff self::_#DB2#new#tearOff
  #C13 = static-tearoff self::_#DB3#new#tearOff
  #C14 = instantiation self::B::• <Never*>
}
