// Unhandled errors:
//
// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<T>' of the type variable 'T' on 'Pair'.
//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
//                                                                                                              ^
//
// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<U>' of the type variable 'U' on 'Pair'.
//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
//                                                                                                              ^

library test;
import self as self;
import "dart:core" as core;

class Clonable<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::Clonable<self::Clonable::T>
    : super core::Object::•()
    ;
}
class Pair<T extends self::Clonable<self::Pair::T> = self::Clonable<dynamic>, U extends self::Clonable<self::Pair::U> = self::Clonable<dynamic>> extends core::Object {
  generic-covariant-impl field self::Pair::T t;
  generic-covariant-impl field self::Pair::U u;
  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
    : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
    ;
  constructor _() → self::Pair<self::Pair::T, self::Pair::U>
    : self::Pair::u = null, self::Pair::t = null, super core::Object::•()
    ;
  get reversed() → self::Pair<self::Pair::U, self::Pair::T>
    return new self::Pair::•<self::Pair::U, self::Pair::T>(this.{self::Pair::u}, this.{self::Pair::t});
}
static method main() → dynamic {
  final self::Pair<self::Clonable<dynamic>, self::Clonable<dynamic>> x = new self::Pair::_<self::Clonable<dynamic>, self::Clonable<dynamic>>();
}
