library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/field_access.dart:83:36: Error: Each extension type should have exactly one representation field.
// extension type ErroneousInlineClass(int a, String b) {
//                                    ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:15:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//     var b1 = this.it<int>; // Error
//                     ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:16:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//     var b2 = it<int>; // Error
//                ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:17:19: Error: The setter 'it' isn't defined for the class 'InlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c1 = this.it = 42; // Error, should not resolve to extension method.
//                   ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:18:14: Error: The setter 'it' isn't defined for the class 'InlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c2 = it = 42; // Error, should not resolve to extension method.
//              ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:26:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
// Try changing the operand or remove the type arguments.
//     var b1 = this.it<int>; // Error
//                     ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:27:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
// Try changing the operand or remove the type arguments.
//     var b2 = it<int>; // Error
//                ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:28:19: Error: The setter 'it' isn't defined for the class 'GenericInlineClass<T>'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c1 = this.it = t; // Error, should not resolve to extension method.
//                   ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:29:14: Error: The setter 'it' isn't defined for the class 'GenericInlineClass<T>'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c2 = it = t; // Error, should not resolve to extension method.
//              ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:37:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T Function()'.
// Try changing the operand or remove the type arguments.
//     var b1 = this.it<int>; // Error
//                     ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:38:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T Function()'.
// Try changing the operand or remove the type arguments.
//     var b2 = it<int>; // Error
//                ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:39:19: Error: The setter 'it' isn't defined for the class 'FunctionInlineClass<T>'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c1 = this.it = t; // Error, should not resolve to extension method.
//                   ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:40:14: Error: The setter 'it' isn't defined for the class 'FunctionInlineClass<T>'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c2 = it = t; // Error, should not resolve to extension method.
//              ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:56:24: Error: The getter 't' isn't defined for the class 'GenericFunctionInlineClass'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 't'.
//     var c1 = this.it = t; // Error, should not resolve to extension method.
//                        ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:56:19: Error: The setter 'it' isn't defined for the class 'GenericFunctionInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c1 = this.it = t; // Error, should not resolve to extension method.
//                   ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:57:19: Error: The getter 't' isn't defined for the class 'GenericFunctionInlineClass'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 't'.
//     var c2 = it = t; // Error, should not resolve to extension method.
//                   ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:57:14: Error: The setter 'it' isn't defined for the class 'GenericFunctionInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c2 = it = t; // Error, should not resolve to extension method.
//              ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:72:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
//     var b1 = this.it<int>; // Error
//                     ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:73:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
//     var b2 = it<int>; // Error
//                ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:74:19: Error: The setter 'it' isn't defined for the class 'DynamicInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c1 = this.it = 42; // Error, should not resolve to extension method.
//                   ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:75:14: Error: The setter 'it' isn't defined for the class 'DynamicInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//     var c2 = it = 42; // Error, should not resolve to extension method.
//              ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:89:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//     var b1 = this.a<int>; // Error
//                    ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:90:15: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//     var b2 = a<int>; // Error
//               ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:91:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
//     var b3 = this.b<int>; // Error
//                    ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:92:15: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
//     var b4 = b<int>; // Error
//               ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:93:19: Error: The setter 'a' isn't defined for the class 'ErroneousInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'a'.
//     var c1 = this.a = 42; // Error
//                   ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:94:14: Error: The setter 'a' isn't defined for the class 'ErroneousInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'a'.
//     var c2 = a = 42; // Error
//              ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:95:19: Error: The setter 'b' isn't defined for the class 'ErroneousInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'b'.
//     var c3 = this.b = '42'; // Error
//                   ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:96:14: Error: The setter 'b' isn't defined for the class 'ErroneousInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'b'.
//     var c4 = b = '42'; // Error
//              ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:97:20: Error: The method 'call' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var d1 = this.a(); // Error
//                    ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:98:15: Error: The method 'call' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var d2 = a(); // Error
//               ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:99:21: Error: The method 'call' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var d3 = this.a.call(); // Error
//                     ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:100:16: Error: The method 'call' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var d4 = a.call(); // Error
//                ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:101:20: Error: The method 'call' isn't defined for the class 'String'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var e1 = this.b(); // Error
//                    ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:102:15: Error: The method 'call' isn't defined for the class 'String'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var e2 = b(); // Error
//               ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:103:21: Error: The method 'call' isn't defined for the class 'String'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var e3 = this.b.call(); // Error
//                     ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:104:16: Error: The method 'call' isn't defined for the class 'String'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
//     var e4 = b.call(); // Error
//                ^^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:118:26: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//   var a2 = inlineClass.it<int>; // Error
//                          ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:119:24: Error: The setter 'it' isn't defined for the class 'InlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//   var a3 = inlineClass.it = 42; // Error,
//                        ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:123:33: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
//   var b2 = genericInlineClass.it<int>; // Error
//                                 ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:124:31: Error: The setter 'it' isn't defined for the class 'GenericInlineClass<String>'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//   var b3 = genericInlineClass.it = '42'; // Error, should not
//                               ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:128:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String Function()'.
// Try changing the operand or remove the type arguments.
//   var c2 = functionInlineClass.it<int>; // Error
//                                  ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:131:32: Error: The setter 'it' isn't defined for the class 'FunctionInlineClass<String>'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//   var c5 = functionInlineClass.it = () => '42'; // Error, should not
//                                ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:139:39: Error: The setter 'it' isn't defined for the class 'GenericFunctionInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//   var d6 = genericFunctionInlineClass.it = <T>() => throw ''; // Error, should
//                                       ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:143:33: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
//   var e2 = dynamicInlineClass.it<int>; // Error
//                                 ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:145:31: Error: The setter 'it' isn't defined for the class 'DynamicInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
//   var e4 = dynamicInlineClass.it = '42'; // Error, should not resolve
//                               ^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:149:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//   var f2 = erroneousInlineClass.a<int>; // Error
//                                  ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:150:33: Error: The setter 'a' isn't defined for the class 'ErroneousInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'a'.
//   var f3 = erroneousInlineClass.a = 42; // Error, should not resolve
//                                 ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:153:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//   var g2 = erroneousInlineClass.a<int>; // Error
//                                  ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:154:33: Error: The setter 'b' isn't defined for the class 'ErroneousInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'b'.
//   var g3 = erroneousInlineClass.b = '42'; // Error, should not resolve
//                                 ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:157:31: Error: The getter '_it' isn't defined for the class 'PrivateInlineClass'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named '_it'.
//   var h1 = privateInlineClass._it; // Error
//                               ^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:158:31: Error: The getter '_it' isn't defined for the class 'PrivateInlineClass'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named '_it'.
//   var h2 = privateInlineClass._it<int>; // Error
//                               ^^^
//
// pkg/front_end/testcases/extension_types/field_access.dart:158:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
//   var h2 = privateInlineClass._it<int>; // Error
//                                  ^
//
// pkg/front_end/testcases/extension_types/field_access.dart:159:31: Error: The setter '_it' isn't defined for the class 'PrivateInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named '_it'.
//   var h3 = privateInlineClass._it = 42; // Error
//                               ^^^
//
import self as self;
import "dart:core" as core;

import "org-dartlang-testcase:///field_access_lib.dart";

extension /* unnamed */ _extension#0 on dynamic {
  set it = self::_extension#0|set#it;
}
extension type InlineClass(core::int it) {
  abstract extension-type-member representation-field get it() → core::int;
  method test = self::InlineClass|test;
  method tearoff test = self::InlineClass|get#test;
  constructor • = self::InlineClass|constructor#;
  constructor tearoff • = self::InlineClass|constructor#_#new#tearOff;
}
extension type GenericInlineClass<T extends core::Object? = dynamic>(T% it) {
  abstract extension-type-member representation-field get it() → T%;
  method test = self::GenericInlineClass|test;
  method tearoff test = self::GenericInlineClass|get#test;
  constructor • = self::GenericInlineClass|constructor#;
  constructor tearoff • = self::GenericInlineClass|constructor#_#new#tearOff;
}
extension type FunctionInlineClass<T extends core::Object? = dynamic>(() → T% it) {
  abstract extension-type-member representation-field get it() → () → T%;
  method test = self::FunctionInlineClass|test;
  method tearoff test = self::FunctionInlineClass|get#test;
  constructor • = self::FunctionInlineClass|constructor#;
  constructor tearoff • = self::FunctionInlineClass|constructor#_#new#tearOff;
}
extension type GenericFunctionInlineClass(<T extends core::Object? = dynamic>() → T% it) {
  abstract extension-type-member representation-field get it() → <T extends core::Object? = dynamic>() → T%;
  method test = self::GenericFunctionInlineClass|test;
  method tearoff test = self::GenericFunctionInlineClass|get#test;
  constructor • = self::GenericFunctionInlineClass|constructor#;
  constructor tearoff • = self::GenericFunctionInlineClass|constructor#_#new#tearOff;
}
extension type DynamicInlineClass(dynamic it) {
  abstract extension-type-member representation-field get it() → dynamic;
  method test = self::DynamicInlineClass|test;
  method tearoff test = self::DynamicInlineClass|get#test;
  constructor • = self::DynamicInlineClass|constructor#;
  constructor tearoff • = self::DynamicInlineClass|constructor#_#new#tearOff;
}
extension type ErroneousInlineClass(core::int a) {
  abstract extension-type-member representation-field get a() → core::int;
  abstract extension-type-member representation-field get b() → core::String;
  method test = self::ErroneousInlineClass|test;
  method tearoff test = self::ErroneousInlineClass|get#test;
  constructor • = self::ErroneousInlineClass|constructor#;
  constructor tearoff • = self::ErroneousInlineClass|constructor#_#new#tearOff;
}
static extension-member method _extension#0|set#it(lowered final dynamic #this, dynamic value) → void {}
static extension-type-member method InlineClass|constructor#(core::int it) → self::InlineClass% /* erasure=core::int, declared=! */ {
  lowered final self::InlineClass% /* erasure=core::int, declared=! */ #this = it;
  return #this;
}
static extension-type-member method InlineClass|constructor#_#new#tearOff(core::int it) → self::InlineClass% /* erasure=core::int, declared=! */
  return self::InlineClass|constructor#(it);
static extension-type-member method InlineClass|test(lowered final self::InlineClass% /* erasure=core::int, declared=! */ #this) → void {
  core::int a1 = #this as{Unchecked} core::int;
  core::int a2 = #this as{Unchecked} core::int;
  invalid-type b1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:15:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
    var b1 = this.it<int>; // Error
                    ^";
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:16:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
    var b2 = it<int>; // Error
               ^";
  core::int c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:17:19: Error: The setter 'it' isn't defined for the class 'InlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c1 = this.it = 42; // Error, should not resolve to extension method.
                  ^^" in #this.{<unresolved>}it = 42;
  core::int c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:18:14: Error: The setter 'it' isn't defined for the class 'InlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c2 = it = 42; // Error, should not resolve to extension method.
             ^^" in #this.{<unresolved>}it = 42;
}
static extension-type-member method InlineClass|get#test(lowered final self::InlineClass% /* erasure=core::int, declared=! */ #this) → () → void
  return () → void => self::InlineClass|test(#this);
static extension-type-member method GenericInlineClass|constructor#<T extends core::Object? = dynamic>(self::GenericInlineClass|constructor#::T% it) → self::GenericInlineClass<self::GenericInlineClass|constructor#::T%>% /* erasure=self::GenericInlineClass|constructor#::T%, declared=! */ {
  lowered final self::GenericInlineClass<self::GenericInlineClass|constructor#::T%>% /* erasure=self::GenericInlineClass|constructor#::T%, declared=! */ #this = it;
  return #this;
}
static extension-type-member method GenericInlineClass|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::GenericInlineClass|constructor#_#new#tearOff::T% it) → self::GenericInlineClass<self::GenericInlineClass|constructor#_#new#tearOff::T%>% /* erasure=self::GenericInlineClass|constructor#_#new#tearOff::T%, declared=! */
  return self::GenericInlineClass|constructor#<self::GenericInlineClass|constructor#_#new#tearOff::T%>(it);
static extension-type-member method GenericInlineClass|test<T extends core::Object? = dynamic>(lowered final self::GenericInlineClass<self::GenericInlineClass|test::T%>% /* erasure=self::GenericInlineClass|test::T%, declared=! */ #this, self::GenericInlineClass|test::T% t) → void {
  self::GenericInlineClass|test::T% a1 = #this as{Unchecked} self::GenericInlineClass|test::T%;
  self::GenericInlineClass|test::T% a2 = #this as{Unchecked} self::GenericInlineClass|test::T%;
  invalid-type b1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:26:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
Try changing the operand or remove the type arguments.
    var b1 = this.it<int>; // Error
                    ^";
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:27:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
Try changing the operand or remove the type arguments.
    var b2 = it<int>; // Error
               ^";
  self::GenericInlineClass|test::T% c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:28:19: Error: The setter 'it' isn't defined for the class 'GenericInlineClass<T>'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c1 = this.it = t; // Error, should not resolve to extension method.
                  ^^" in #this.{<unresolved>}it = t;
  self::GenericInlineClass|test::T% c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:29:14: Error: The setter 'it' isn't defined for the class 'GenericInlineClass<T>'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c2 = it = t; // Error, should not resolve to extension method.
             ^^" in #this.{<unresolved>}it = t;
}
static extension-type-member method GenericInlineClass|get#test<T extends core::Object? = dynamic>(lowered final self::GenericInlineClass<self::GenericInlineClass|get#test::T%>% /* erasure=self::GenericInlineClass|get#test::T%, declared=! */ #this) → (self::GenericInlineClass|get#test::T%) → void
  return (self::GenericInlineClass|get#test::T% t) → void => self::GenericInlineClass|test<self::GenericInlineClass|get#test::T%>(#this, t);
static extension-type-member method FunctionInlineClass|constructor#<T extends core::Object? = dynamic>(() → self::FunctionInlineClass|constructor#::T% it) → self::FunctionInlineClass<self::FunctionInlineClass|constructor#::T%>% /* erasure=() → self::FunctionInlineClass|constructor#::T%, declared=! */ {
  lowered final self::FunctionInlineClass<self::FunctionInlineClass|constructor#::T%>% /* erasure=() → self::FunctionInlineClass|constructor#::T%, declared=! */ #this = it;
  return #this;
}
static extension-type-member method FunctionInlineClass|constructor#_#new#tearOff<T extends core::Object? = dynamic>(() → self::FunctionInlineClass|constructor#_#new#tearOff::T% it) → self::FunctionInlineClass<self::FunctionInlineClass|constructor#_#new#tearOff::T%>% /* erasure=() → self::FunctionInlineClass|constructor#_#new#tearOff::T%, declared=! */
  return self::FunctionInlineClass|constructor#<self::FunctionInlineClass|constructor#_#new#tearOff::T%>(it);
static extension-type-member method FunctionInlineClass|test<T extends core::Object? = dynamic>(lowered final self::FunctionInlineClass<self::FunctionInlineClass|test::T%>% /* erasure=() → self::FunctionInlineClass|test::T%, declared=! */ #this, () → self::FunctionInlineClass|test::T% t) → void {
  () → self::FunctionInlineClass|test::T% a1 = #this as{Unchecked} () → self::FunctionInlineClass|test::T%;
  () → self::FunctionInlineClass|test::T% a2 = #this as{Unchecked} () → self::FunctionInlineClass|test::T%;
  invalid-type b1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:37:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T Function()'.
Try changing the operand or remove the type arguments.
    var b1 = this.it<int>; // Error
                    ^";
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:38:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T Function()'.
Try changing the operand or remove the type arguments.
    var b2 = it<int>; // Error
               ^";
  () → self::FunctionInlineClass|test::T% c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:39:19: Error: The setter 'it' isn't defined for the class 'FunctionInlineClass<T>'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c1 = this.it = t; // Error, should not resolve to extension method.
                  ^^" in #this.{<unresolved>}it = t;
  () → self::FunctionInlineClass|test::T% c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:40:14: Error: The setter 'it' isn't defined for the class 'FunctionInlineClass<T>'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c2 = it = t; // Error, should not resolve to extension method.
             ^^" in #this.{<unresolved>}it = t;
  self::FunctionInlineClass|test::T% d1 = (#this as{Unchecked} () → self::FunctionInlineClass|test::T%)(){() → self::FunctionInlineClass|test::T%};
  self::FunctionInlineClass|test::T% d2 = (#this as{Unchecked} () → self::FunctionInlineClass|test::T%)(){() → self::FunctionInlineClass|test::T%};
  self::FunctionInlineClass|test::T% d3 = (#this as{Unchecked} () → self::FunctionInlineClass|test::T%)(){() → self::FunctionInlineClass|test::T%};
  self::FunctionInlineClass|test::T% d4 = (#this as{Unchecked} () → self::FunctionInlineClass|test::T%)(){() → self::FunctionInlineClass|test::T%};
}
static extension-type-member method FunctionInlineClass|get#test<T extends core::Object? = dynamic>(lowered final self::FunctionInlineClass<self::FunctionInlineClass|get#test::T%>% /* erasure=() → self::FunctionInlineClass|get#test::T%, declared=! */ #this) → (() → self::FunctionInlineClass|get#test::T%) → void
  return (() → self::FunctionInlineClass|get#test::T% t) → void => self::FunctionInlineClass|test<self::FunctionInlineClass|get#test::T%>(#this, t);
static extension-type-member method GenericFunctionInlineClass|constructor#(<T extends core::Object? = dynamic>() → T% it) → self::GenericFunctionInlineClass% /* erasure=<T extends core::Object? = dynamic>() → T%, declared=! */ {
  lowered final self::GenericFunctionInlineClass% /* erasure=<T extends core::Object? = dynamic>() → T%, declared=! */ #this = it;
  return #this;
}
static extension-type-member method GenericFunctionInlineClass|constructor#_#new#tearOff(<T extends core::Object? = dynamic>() → T% it) → self::GenericFunctionInlineClass% /* erasure=<T extends core::Object? = dynamic>() → T%, declared=! */
  return self::GenericFunctionInlineClass|constructor#(it);
static extension-type-member method GenericFunctionInlineClass|test(lowered final self::GenericFunctionInlineClass% /* erasure=<T extends core::Object? = dynamic>() → T%, declared=! */ #this) → void {
  <T extends core::Object? = dynamic>() → T% a1 = #this as{Unchecked} <T extends core::Object? = dynamic>() → T%;
  <T extends core::Object? = dynamic>() → T% a2 = #this as{Unchecked} <T extends core::Object? = dynamic>() → T%;
  () → core::int a3 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>;
  () → core::int a4 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>;
  () → core::int b1 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>;
  () → core::int b2 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>;
  dynamic c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:56:19: Error: The setter 'it' isn't defined for the class 'GenericFunctionInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c1 = this.it = t; // Error, should not resolve to extension method.
                  ^^" in #this.{<unresolved>}it = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:56:24: Error: The getter 't' isn't defined for the class 'GenericFunctionInlineClass'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 't'.
    var c1 = this.it = t; // Error, should not resolve to extension method.
                       ^" in #this{<unresolved>}.t;
  dynamic c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:57:14: Error: The setter 'it' isn't defined for the class 'GenericFunctionInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c2 = it = t; // Error, should not resolve to extension method.
             ^^" in #this.{<unresolved>}it = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:57:19: Error: The getter 't' isn't defined for the class 'GenericFunctionInlineClass'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 't'.
    var c2 = it = t; // Error, should not resolve to extension method.
                  ^" in #this{<unresolved>}.t;
  dynamic d1 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<dynamic>(){() → dynamic};
  dynamic d2 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<dynamic>(){() → dynamic};
  dynamic d3 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<dynamic>(){() → dynamic};
  dynamic d4 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<dynamic>(){() → dynamic};
  core::int e1 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>(){() → core::int};
  core::int e2 = (#this as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>(){() → core::int};
}
static extension-type-member method GenericFunctionInlineClass|get#test(lowered final self::GenericFunctionInlineClass% /* erasure=<T extends core::Object? = dynamic>() → T%, declared=! */ #this) → () → void
  return () → void => self::GenericFunctionInlineClass|test(#this);
static extension-type-member method DynamicInlineClass|constructor#(dynamic it) → self::DynamicInlineClass% /* erasure=dynamic, declared=! */ {
  lowered final self::DynamicInlineClass% /* erasure=dynamic, declared=! */ #this = it;
  return #this;
}
static extension-type-member method DynamicInlineClass|constructor#_#new#tearOff(dynamic it) → self::DynamicInlineClass% /* erasure=dynamic, declared=! */
  return self::DynamicInlineClass|constructor#(it);
static extension-type-member method DynamicInlineClass|test(lowered final self::DynamicInlineClass% /* erasure=dynamic, declared=! */ #this) → void {
  dynamic a1 = #this as{Unchecked} dynamic;
  dynamic a2 = #this as{Unchecked} dynamic;
  invalid-type b1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:72:21: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
    var b1 = this.it<int>; // Error
                    ^";
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:73:16: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
    var b2 = it<int>; // Error
               ^";
  core::int c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:74:19: Error: The setter 'it' isn't defined for the class 'DynamicInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c1 = this.it = 42; // Error, should not resolve to extension method.
                  ^^" in #this.{<unresolved>}it = 42;
  core::int c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:75:14: Error: The setter 'it' isn't defined for the class 'DynamicInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
    var c2 = it = 42; // Error, should not resolve to extension method.
             ^^" in #this.{<unresolved>}it = 42;
  dynamic d1 = (#this as{Unchecked} dynamic){dynamic}();
  dynamic d2 = (#this as{Unchecked} dynamic){dynamic}();
  dynamic d3 = (#this as{Unchecked} dynamic){dynamic}.call();
  dynamic d4 = (#this as{Unchecked} dynamic){dynamic}.call();
}
static extension-type-member method DynamicInlineClass|get#test(lowered final self::DynamicInlineClass% /* erasure=dynamic, declared=! */ #this) → () → void
  return () → void => self::DynamicInlineClass|test(#this);
static extension-type-member method ErroneousInlineClass|constructor#(core::int a, core::String b) → self::ErroneousInlineClass% /* erasure=core::int, declared=! */ {
  lowered final self::ErroneousInlineClass% /* erasure=core::int, declared=! */ #this = b;
  return #this;
}
static extension-type-member method ErroneousInlineClass|constructor#_#new#tearOff(core::int a, core::String b) → self::ErroneousInlineClass% /* erasure=core::int, declared=! */
  return self::ErroneousInlineClass|constructor#(a, b);
static extension-type-member method ErroneousInlineClass|test(lowered final self::ErroneousInlineClass% /* erasure=core::int, declared=! */ #this) → void {
  core::int a1 = #this as{Unchecked} core::int;
  core::int a2 = #this as{Unchecked} core::int;
  core::String a3 = #this as{Unchecked} core::String;
  core::String a4 = #this as{Unchecked} core::String;
  invalid-type b1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:89:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
    var b1 = this.a<int>; // Error
                   ^";
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:90:15: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
    var b2 = a<int>; // Error
              ^";
  invalid-type b3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:91:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
    var b3 = this.b<int>; // Error
                   ^";
  invalid-type b4 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:92:15: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
    var b4 = b<int>; // Error
              ^";
  core::int c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:93:19: Error: The setter 'a' isn't defined for the class 'ErroneousInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'a'.
    var c1 = this.a = 42; // Error
                  ^" in #this.{<unresolved>}a = 42;
  core::int c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:94:14: Error: The setter 'a' isn't defined for the class 'ErroneousInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'a'.
    var c2 = a = 42; // Error
             ^" in #this.{<unresolved>}a = 42;
  core::String c3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:95:19: Error: The setter 'b' isn't defined for the class 'ErroneousInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'b'.
    var c3 = this.b = '42'; // Error
                  ^" in #this.{<unresolved>}b = "42";
  core::String c4 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:96:14: Error: The setter 'b' isn't defined for the class 'ErroneousInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'b'.
    var c4 = b = '42'; // Error
             ^" in #this.{<unresolved>}b = "42";
  dynamic d1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:97:20: Error: The method 'call' isn't defined for the class 'int'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var d1 = this.a(); // Error
                   ^^^^" in (#this as{Unchecked} core::int){<unresolved>}.call();
  dynamic d2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:98:15: Error: The method 'call' isn't defined for the class 'int'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var d2 = a(); // Error
              ^^^^" in (#this as{Unchecked} core::int){<unresolved>}.call();
  dynamic d3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:99:21: Error: The method 'call' isn't defined for the class 'int'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var d3 = this.a.call(); // Error
                    ^^^^" in (#this as{Unchecked} core::int){<unresolved>}.call();
  dynamic d4 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:100:16: Error: The method 'call' isn't defined for the class 'int'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var d4 = a.call(); // Error
               ^^^^" in (#this as{Unchecked} core::int){<unresolved>}.call();
  dynamic e1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:101:20: Error: The method 'call' isn't defined for the class 'String'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var e1 = this.b(); // Error
                   ^^^^" in (#this as{Unchecked} core::String){<unresolved>}.call();
  dynamic e2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:102:15: Error: The method 'call' isn't defined for the class 'String'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var e2 = b(); // Error
              ^^^^" in (#this as{Unchecked} core::String){<unresolved>}.call();
  dynamic e3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:103:21: Error: The method 'call' isn't defined for the class 'String'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var e3 = this.b.call(); // Error
                    ^^^^" in (#this as{Unchecked} core::String){<unresolved>}.call();
  dynamic e4 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:104:16: Error: The method 'call' isn't defined for the class 'String'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
    var e4 = b.call(); // Error
               ^^^^" in (#this as{Unchecked} core::String){<unresolved>}.call();
}
static extension-type-member method ErroneousInlineClass|get#test(lowered final self::ErroneousInlineClass% /* erasure=core::int, declared=! */ #this) → () → void
  return () → void => self::ErroneousInlineClass|test(#this);
static method test(self::InlineClass% /* erasure=core::int, declared=! */ inlineClass, self::GenericInlineClass<core::String>% /* erasure=core::String, declared=! */ genericInlineClass, self::FunctionInlineClass<core::String>% /* erasure=() → core::String, declared=! */ functionInlineClass, self::GenericFunctionInlineClass% /* erasure=<T extends core::Object? = dynamic>() → T%, declared=! */ genericFunctionInlineClass, self::DynamicInlineClass% /* erasure=dynamic, declared=! */ dynamicInlineClass, self::ErroneousInlineClass% /* erasure=core::int, declared=! */ erroneousInlineClass, #lib1::PrivateInlineClass% /* erasure=core::int, declared=! */ privateInlineClass) → void {
  core::int a1 = inlineClass as{Unchecked} core::int;
  invalid-type a2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:118:26: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
  var a2 = inlineClass.it<int>; // Error
                         ^";
  core::int a3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:119:24: Error: The setter 'it' isn't defined for the class 'InlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
  var a3 = inlineClass.it = 42; // Error,
                       ^^" in inlineClass.{<unresolved>}it = 42;
  core::String b1 = genericInlineClass as{Unchecked} core::String;
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:123:33: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
  var b2 = genericInlineClass.it<int>; // Error
                                ^";
  core::String b3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:124:31: Error: The setter 'it' isn't defined for the class 'GenericInlineClass<String>'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
  var b3 = genericInlineClass.it = '42'; // Error, should not
                              ^^" in genericInlineClass.{<unresolved>}it = "42";
  () → core::String c1 = functionInlineClass as{Unchecked} () → core::String;
  invalid-type c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:128:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String Function()'.
Try changing the operand or remove the type arguments.
  var c2 = functionInlineClass.it<int>; // Error
                                 ^";
  core::String c3 = (functionInlineClass as{Unchecked} () → core::String)(){() → core::String};
  core::String c4 = (functionInlineClass as{Unchecked} () → core::String)(){() → core::String};
  () → core::String c5 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:131:32: Error: The setter 'it' isn't defined for the class 'FunctionInlineClass<String>'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
  var c5 = functionInlineClass.it = () => '42'; // Error, should not
                               ^^" in functionInlineClass.{<unresolved>}it = () → core::String => "42";
  <T extends core::Object? = dynamic>() → T% d1 = genericFunctionInlineClass as{Unchecked} <T extends core::Object? = dynamic>() → T%;
  () → core::int d2 = (genericFunctionInlineClass as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>;
  () → core::int d3 = (genericFunctionInlineClass as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>;
  core::int d4 = (genericFunctionInlineClass as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>(){() → core::int};
  core::int d5 = (genericFunctionInlineClass as{Unchecked} <T extends core::Object? = dynamic>() → T%)<core::int>(){() → core::int};
  <T extends core::Object? = dynamic>() → Never d6 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:139:39: Error: The setter 'it' isn't defined for the class 'GenericFunctionInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
  var d6 = genericFunctionInlineClass.it = <T>() => throw ''; // Error, should
                                      ^^" in genericFunctionInlineClass.{<unresolved>}it = <T extends core::Object? = dynamic>() → Never => throw "";
  dynamic e1 = dynamicInlineClass as{Unchecked} dynamic;
  invalid-type e2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:143:33: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
  var e2 = dynamicInlineClass.it<int>; // Error
                                ^";
  dynamic e3 = (dynamicInlineClass as{Unchecked} dynamic){dynamic}();
  core::String e4 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:145:31: Error: The setter 'it' isn't defined for the class 'DynamicInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'it'.
  var e4 = dynamicInlineClass.it = '42'; // Error, should not resolve
                              ^^" in dynamicInlineClass.{<unresolved>}it = "42";
  core::int f1 = erroneousInlineClass as{Unchecked} core::int;
  invalid-type f2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:149:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
  var f2 = erroneousInlineClass.a<int>; // Error
                                 ^";
  core::int f3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:150:33: Error: The setter 'a' isn't defined for the class 'ErroneousInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'a'.
  var f3 = erroneousInlineClass.a = 42; // Error, should not resolve
                                ^" in erroneousInlineClass.{<unresolved>}a = 42;
  core::String g1 = erroneousInlineClass as{Unchecked} core::String;
  invalid-type g2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:153:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
  var g2 = erroneousInlineClass.a<int>; // Error
                                 ^";
  core::String g3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:154:33: Error: The setter 'b' isn't defined for the class 'ErroneousInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'b'.
  var g3 = erroneousInlineClass.b = '42'; // Error, should not resolve
                                ^" in erroneousInlineClass.{<unresolved>}b = "42";
  dynamic h1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:157:31: Error: The getter '_it' isn't defined for the class 'PrivateInlineClass'.
Try correcting the name to the name of an existing getter, or defining a getter or field named '_it'.
  var h1 = privateInlineClass._it; // Error
                              ^^^" in privateInlineClass{<unresolved>}._it;
  invalid-type h2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:158:34: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
  var h2 = privateInlineClass._it<int>; // Error
                                 ^";
  core::int h3 = invalid-expression "pkg/front_end/testcases/extension_types/field_access.dart:159:31: Error: The setter '_it' isn't defined for the class 'PrivateInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named '_it'.
  var h3 = privateInlineClass._it = 42; // Error
                              ^^^" in privateInlineClass.{<unresolved>}_it = 42;
}

library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/field_access_lib.dart:9:22: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//     var b1 = this._it<int>; // Error
//                      ^
//
// pkg/front_end/testcases/extension_types/field_access_lib.dart:10:17: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
// Try changing the operand or remove the type arguments.
//     var b2 = _it<int>; // Error
//                 ^
//
// pkg/front_end/testcases/extension_types/field_access_lib.dart:11:19: Error: The setter '_it' isn't defined for the class 'PrivateInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named '_it'.
//     var c1 = this._it = 42; // Error, should not resolve to extension method.
//                   ^^^
//
// pkg/front_end/testcases/extension_types/field_access_lib.dart:12:14: Error: The setter '_it' isn't defined for the class 'PrivateInlineClass'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named '_it'.
//     var c2 = _it = 42; // Error, should not resolve to extension method.
//              ^^^
//
import self as self2;
import "dart:core" as core;

extension type PrivateInlineClass(core::int _it) {
  abstract extension-type-member representation-field get _it() → core::int;
  method test = self2::PrivateInlineClass|test;
  method tearoff test = self2::PrivateInlineClass|get#test;
  constructor • = self2::PrivateInlineClass|constructor#;
  constructor tearoff • = self2::PrivateInlineClass|constructor#_#new#tearOff;
}
static extension-type-member method PrivateInlineClass|constructor#(core::int _it) → self2::PrivateInlineClass% /* erasure=core::int, declared=! */ {
  lowered final self2::PrivateInlineClass% /* erasure=core::int, declared=! */ #this = _it;
  return #this;
}
static extension-type-member method PrivateInlineClass|constructor#_#new#tearOff(core::int _it) → self2::PrivateInlineClass% /* erasure=core::int, declared=! */
  return self2::PrivateInlineClass|constructor#(_it);
static extension-type-member method PrivateInlineClass|test(lowered final self2::PrivateInlineClass% /* erasure=core::int, declared=! */ #this) → void {
  core::int a1 = #this as{Unchecked} core::int;
  core::int a2 = #this as{Unchecked} core::int;
  invalid-type b1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access_lib.dart:9:22: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
    var b1 = this._it<int>; // Error
                     ^";
  invalid-type b2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access_lib.dart:10:17: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
Try changing the operand or remove the type arguments.
    var b2 = _it<int>; // Error
                ^";
  core::int c1 = invalid-expression "pkg/front_end/testcases/extension_types/field_access_lib.dart:11:19: Error: The setter '_it' isn't defined for the class 'PrivateInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named '_it'.
    var c1 = this._it = 42; // Error, should not resolve to extension method.
                  ^^^" in #this.{<unresolved>}_it = 42;
  core::int c2 = invalid-expression "pkg/front_end/testcases/extension_types/field_access_lib.dart:12:14: Error: The setter '_it' isn't defined for the class 'PrivateInlineClass'.
Try correcting the name to the name of an existing setter, or defining a setter or field named '_it'.
    var c2 = _it = 42; // Error, should not resolve to extension method.
             ^^^" in #this.{<unresolved>}_it = 42;
}
static extension-type-member method PrivateInlineClass|get#test(lowered final self2::PrivateInlineClass% /* erasure=core::int, declared=! */ #this) → () → void
  return () → void => self2::PrivateInlineClass|test(#this);
