library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:24:5: Error: A constructor invocation 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();
//     ^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:24:16: Error: Couldn't find constructor 'A.named.toString'.
//   A.named<int>.toString();
//                ^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:29:3: Error: Couldn't find constructor 'a.m.applyAndPrint'.
//   a.m<int>.applyAndPrint([2]);
//   ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:30:3: Error: Couldn't find constructor 'a.m.applyAndPrint'.
//   a.m<String>.applyAndPrint(['three']);
//   ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:31:5: Error: A constructor invocation can't have type arguments after the constructor name.
// Try removing the type arguments or placing them after the class name.
//   A.n<int>.applyAndPrint([2]);
//     ^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:31:12: Error: Couldn't find constructor 'A.n.applyAndPrint'.
//   A.n<int>.applyAndPrint([2]);
//            ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:32:5: Error: A constructor invocation can't have type arguments after the constructor name.
// Try removing the type arguments or placing them after the class name.
//   A.n<String>.applyAndPrint(['three']);
//     ^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:32:15: Error: Couldn't find constructor 'A.n.applyAndPrint'.
//   A.n<String>.applyAndPrint(['three']);
//               ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:33:3: Error: Couldn't find constructor 'm.applyAndPrint'.
//   self.m<int>.applyAndPrint([2]);
//   ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:34:3: Error: Couldn't find constructor 'm.applyAndPrint'.
//   self.m<String>.applyAndPrint(['three']);
//   ^^^^^^^^^^^^^
//
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 core::_GrowableList::_literal1<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 core::_GrowableList::_literal1<self::A::n::X%>(x);
}
extension FunctionApplier on core::Function {
  method applyAndPrint = self::FunctionApplier|applyAndPrint;
  tearoff applyAndPrint = self::FunctionApplier|get#applyAndPrint;
}
static method m<X extends core::Object? = dynamic>(self::m::X% x) → core::List<self::m::X%>
  return core::_GrowableList::_literal1<self::m::X%>(x);
static method FunctionApplier|applyAndPrint(lowered final core::Function #this, core::List<core::Object?> positionalArguments) → void
  return core::print(core::Function::apply(#this, positionalArguments, #C2));
static 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:16: Error: Couldn't find constructor 'A.named.toString'.
  A.named<int>.toString();
               ^^^^^^^^";
}
static method main() → void {
  self::A<dynamic> a = new self::A::•<dynamic>();
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:29:3: Error: Couldn't find constructor 'a.m.applyAndPrint'.
  a.m<int>.applyAndPrint([2]);
  ^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:30:3: Error: Couldn't find constructor 'a.m.applyAndPrint'.
  a.m<String>.applyAndPrint(['three']);
  ^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:31:12: Error: Couldn't find constructor 'A.n.applyAndPrint'.
  A.n<int>.applyAndPrint([2]);
           ^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:32:15: Error: Couldn't find constructor 'A.n.applyAndPrint'.
  A.n<String>.applyAndPrint(['three']);
              ^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:33:3: Error: Couldn't find constructor 'm.applyAndPrint'.
  self.m<int>.applyAndPrint([2]);
  ^^^^^^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:34:3: Error: Couldn't find constructor 'm.applyAndPrint'.
  self.m<String>.applyAndPrint(['three']);
  ^^^^^^^^^^^^^";
  self::FunctionApplier|applyAndPrint(#C4, core::_GrowableList::_literal1<core::Object?>(2));
  self::FunctionApplier|applyAndPrint(#C5, core::_GrowableList::_literal1<core::Object?>("three"));
  (#C6).{core::Object::toString}(){() → core::String};
  (#C7).{core::Object::toString}(){() → core::String};
}

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