library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'method'.
//   nonStruct.method();
//             ^^^^^^
//
// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
//   nonStruct.property = nonStruct.property;
//             ^^^^^^^^
//
// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
//   nonStruct.property = nonStruct.property;
//                                  ^^^^^^^^
//
// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'method'.
//   new NonStruct().method();
//                   ^^^^^^
//
// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
//   new NonStruct().property;
//                   ^^^^^^^^
//
// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
//   new NonStruct().property = null;
//                   ^^^^^^^^
//
import self as self;
import "dart:core" as core;

class Struct extends core::Object {
  synthetic constructor •() → self::Struct*
    : super core::Object::•()
    ;
}
class StructA extends self::Struct {
  synthetic constructor •() → self::StructA*
    : super self::Struct::•()
    ;
}
class StructB extends self::Struct {
  synthetic constructor •() → self::StructB*
    : super self::Struct::•()
    ;
}
class NonStruct extends core::Object {
  synthetic constructor •() → self::NonStruct*
    : super core::Object::•()
    ;
}
extension Extension<T extends self::Struct* = dynamic> on T* {
  method method = self::Extension|method;
  tearoff method = self::Extension|get#method;
  get property = self::Extension|get#property;
  set property = self::Extension|set#property;
}
static method Extension|method<T extends self::Struct* = dynamic>(final self::Extension|method::T* #this) → self::Extension|method::T*
  return #this;
static method Extension|get#method<T extends self::Struct* = dynamic>(final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
  return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
static method Extension|get#property<T extends self::Struct* = dynamic>(final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
  return #this;
static method Extension|set#property<T extends self::Struct* = dynamic>(final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → self::Extension|set#property::T* {
  final self::Extension|set#property::T* #t1 = value;
  return #t1;
}
static method main() → dynamic {
  self::Struct* struct;
  self::StructA* structA;
  self::StructB* structB;
  self::Extension|method<self::Struct*>(struct);
  self::Extension|set#property<self::Struct*>(struct, self::Extension|get#property<self::StructA*>(structA));
  self::Extension|method<self::StructA*>(structA);
  self::Extension|set#property<self::StructA*>(structA, self::Extension|get#property<self::Struct*>(struct));
  self::Extension|method<self::StructB*>(structB);
  self::Extension|set#property<self::StructB*>(structB, self::Extension|get#property<self::StructB*>(structB));
  self::Extension|method<self::Struct*>(new self::Struct::•());
  self::Extension|get#property<self::Struct*>(new self::Struct::•());
  self::Extension|set#property<self::Struct*>(new self::Struct::•(), null);
  self::Extension|method<self::StructA*>(new self::StructA::•());
  self::Extension|get#property<self::StructA*>(new self::StructA::•());
  self::Extension|set#property<self::StructA*>(new self::StructA::•(), null);
  self::Extension|method<self::StructB*>(new self::StructB::•());
  self::Extension|get#property<self::StructB*>(new self::StructB::•());
  self::Extension|set#property<self::StructB*>(new self::StructB::•(), null);
}
static method testNonStruct() → dynamic {
  self::NonStruct* nonStruct;
  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
 - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'method'.
  nonStruct.method();
            ^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
  nonStruct.property = nonStruct.property;
            ^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
 - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'method'.
  new NonStruct().method();
                  ^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
  new NonStruct().property;
                  ^^^^^^^^";
  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
  new NonStruct().property = null;
                  ^^^^^^^^";
}
