library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:10:28: Error: Type argument 'String' doesn't conform to the bound 'int' of the type variable 'X' on 'C'.
// Try changing type arguments so that they conform to the bounds.
// typedef B<X extends int> = C<String>;
//                            ^
// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:11:11: Context: This is the type variable whose bound isn't conformed to.
// typedef C<X extends int> = X;
//           ^
//
// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:9:28: Error: Type argument 'String' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
// Try changing type arguments so that they conform to the bounds.
// typedef A<X extends int> = B<String>;
//                            ^
// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
// typedef B<X extends int> = C<String>;
//           ^
//
import self as self;
import "dart:core" as core;

typedef A<unrelated X extends core::int> = core::String;
typedef B<unrelated X extends core::int> = core::String;
typedef C<X extends core::int> = X;
static method foo() → dynamic
  ;
static method main() → dynamic
  ;
static method _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start, core::int? end]) → core::String
  return core::String::fromCharCodes(charCodes, start, end);
static method _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
  return core::String::fromCharCode(charCode);
static method _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue}) → core::String
  return core::String::fromEnvironment(name, defaultValue: defaultValue);
static method _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start, core::int? end]) → core::String
  return core::String::fromCharCodes(charCodes, start, end);
static method _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
  return core::String::fromCharCode(charCode);
static method _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue}) → core::String
  return core::String::fromEnvironment(name, defaultValue: defaultValue);
