library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/call.dart:8:26: Error: The static type of the explicit instantiation operand must be a generic function type but is 'E'.
// Try changing the operand or remove the type arguments.
//   int Function(int) a = e<int>; // Error
//                          ^
//
// pkg/front_end/testcases/extension_types/call.dart:9:25: Error: A value of type 'E' can't be assigned to a variable of type 'int Function(int)'.
//   int Function(int) b = e; // Error
//                         ^
//
import self as self;
import "dart:core" as core;

extension type E(<T extends core::Object? = dynamic>(T%) → T% call) {
  abstract extension-type-member representation-field get call() → <T extends core::Object? = dynamic>(T%) → T%;
  constructor • = self::E|constructor#;
  constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static extension-type-member method E|constructor#(<T extends core::Object? = dynamic>(T%) → T% call) → self::E% /* erasure=<T extends core::Object? = dynamic>(T%) → T%, declared=! */ {
  lowered final self::E% /* erasure=<T extends core::Object? = dynamic>(T%) → T%, declared=! */ #this = call;
  return #this;
}
static extension-type-member method E|constructor#_#new#tearOff(<T extends core::Object? = dynamic>(T%) → T% call) → self::E% /* erasure=<T extends core::Object? = dynamic>(T%) → T%, declared=! */
  return self::E|constructor#(call);
static method method(self::E% /* erasure=<T extends core::Object? = dynamic>(T%) → T%, declared=! */ e) → dynamic {
  (core::int) → core::int a = invalid-expression "pkg/front_end/testcases/extension_types/call.dart:8:26: Error: The static type of the explicit instantiation operand must be a generic function type but is 'E'.
Try changing the operand or remove the type arguments.
  int Function(int) a = e<int>; // Error
                         ^";
  (core::int) → core::int b = invalid-expression "pkg/front_end/testcases/extension_types/call.dart:9:25: Error: A value of type 'E' can't be assigned to a variable of type 'int Function(int)'.
  int Function(int) b = e; // Error
                        ^" in e as{TypeError} (core::int) → core::int;
}
