library;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:24:10: Error: A constructor tear-off can't have type arguments after the constructor name.
// Try removing the type arguments or placing them after the class name.
//   A.named<int>.toString(); // error
//          ^
//
import self as self;
import "dart:core" as core;

import "org-dartlang-testcase:///issue46719.dart" as self;

class A<T extends core::Object? = dynamic> extends core::Object {
  constructor •() → self::A<self::A::T%>
    : super core::Object::•()
    ;
  constructor named() → self::A<self::A::T%>
    : super core::Object::•()
    ;
  method m<X extends core::Object? = dynamic>(self::A::m::X% x) → core::List<self::A::m::X%>
    return <self::A::m::X%>[x];
  static method n<X extends core::Object? = dynamic>(self::A::n::X% x) → core::List<self::A::n::X%>
    return <self::A::n::X%>[x];
}
extension FunctionApplier on core::Function {
  method applyAndPrint = self::FunctionApplier|applyAndPrint;
  method tearoff applyAndPrint = self::FunctionApplier|get#applyAndPrint;
}
static method m<X extends core::Object? = dynamic>(self::m::X% x) → core::List<self::m::X%>
  return <self::m::X%>[x];
static extension-member method FunctionApplier|applyAndPrint(lowered final core::Function #this, core::List<core::Object?> positionalArguments) → void
  return core::print(core::Function::apply(#this, positionalArguments, #C1));
static extension-member method FunctionApplier|get#applyAndPrint(lowered final core::Function #this) → (core::List<core::Object?>) → void
  return (core::List<core::Object?> positionalArguments) → void => self::FunctionApplier|applyAndPrint(#this, positionalArguments);
static method test() → dynamic {
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:24:10: Error: A constructor tear-off can't have type arguments after the constructor name.
Try removing the type arguments or placing them after the class name.
  A.named<int>.toString(); // error
         ^";
}
static method main() → void {
  self::A<dynamic> a = new self::A::•<dynamic>();
  self::FunctionApplier|applyAndPrint(a.{self::A::m}{<X extends core::Object? = dynamic>(X%) → core::List<X%>}<core::int>, <core::Object?>[2]);
  self::FunctionApplier|applyAndPrint(a.{self::A::m}{<X extends core::Object? = dynamic>(X%) → core::List<X%>}<core::String>, <core::Object?>["three"]);
  self::FunctionApplier|applyAndPrint(#C3, <core::Object?>[2]);
  self::FunctionApplier|applyAndPrint(#C4, <core::Object?>["three"]);
  self::FunctionApplier|applyAndPrint(#C6, <core::Object?>[2]);
  self::FunctionApplier|applyAndPrint(#C7, <core::Object?>["three"]);
  self::FunctionApplier|applyAndPrint(#C3, <core::Object?>[2]);
  self::FunctionApplier|applyAndPrint(#C4, <core::Object?>["three"]);
  #C8.{core::Object::toString}(){() → core::String};
  #C9.{core::Object::toString}(){() → core::String};
}

constants  {
  #C1 = <core::Symbol, dynamic>{}
  #C2 = static-tearoff self::A::n
  #C3 = instantiation #C2 <core::int>
  #C4 = instantiation #C2 <core::String>
  #C5 = static-tearoff self::m
  #C6 = instantiation #C5 <core::int>
  #C7 = instantiation #C5 <core::String>
  #C8 = constructor-tearoff self::A::named
  #C9 = instantiation #C8 <core::int>
}
