library;
//
// Problems in library:
//
// pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
//   foo<String, String>("hello world");
//   ^
// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Context: Found this candidate, but the arguments don't match.
// void foo<X>(X i) {
//      ^^^
//
// pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
//   Foo.foo<int, int>(42);
//       ^
// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Context: Found this candidate, but the arguments don't match.
//   static foo<X>(X i) {
//          ^^^
//
// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
//   new Bar<String>();
//       ^
// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Context: The class 'Bar' has a constructor that takes no arguments.
// class Bar<X, Y> {}
//       ^
//
// pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
//   f.bar<double, double>(42.42);
//     ^
//
import self as self;
import "dart:core" as core;

class Foo extends core::Object {
  synthetic constructor •() → self::Foo*
    : super core::Object::•()
    ;
  static method foo<X extends core::Object* = dynamic>(self::Foo::foo::X* i) → dynamic {
    core::print(i);
  }
  method bar<X extends core::Object* = dynamic>(self::Foo::bar::X* i) → dynamic {
    core::print(i);
  }
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class Bar<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::Bar<self::Bar::X*, self::Bar::Y*>*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static method foo<X extends core::Object* = dynamic>(self::foo::X* i) → void {
  core::print(i);
}
static method main() → dynamic {
  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
  foo<String, String>(\"hello world\");
  ^";
  self::foo<core::String*>("hello world");
  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
  Foo.foo<int, int>(42);
      ^";
  self::Foo::foo<core::int*>(42);
  self::Foo* f = new self::Foo::•();
  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
  f.bar<double, double>(42.42);
    ^" in f.{self::Foo::bar}<core::double*, core::double*>(42.42);
  f.{self::Foo::bar}<core::double*>(42.42);
  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
  new Bar<String>();
      ^";
  new self::Bar::•<core::String*, core::String*>();
}
