library;
//
// Problems in library:
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart:24:36: Error: The getter 'length' isn't defined for the class 'num'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
//   num method2() => field1 + field2.length;
//                                    ^^^^^^
//
import self as self;
import "dart:core" as core;

class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
  generic-covariant-impl field self::DynamicClass::T* field1;
  generic-covariant-impl field self::DynamicClass::T* field2;
  constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T%, self::DynamicClass::S*>*
    : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
    ;
  method method() → dynamic
    return this.{self::DynamicClass::field1}.*(this.{self::DynamicClass::field2});
}
class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
  generic-covariant-impl field self::NumClass::T* field1;
  generic-covariant-impl field self::NumClass::S* field2;
  constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
    : self::NumClass::field1 = field1, self::NumClass::field2 = field2, super core::Object::•()
    ;
  method method1() → core::num*
    return this.{self::NumClass::field1}.{core::num::*}(this.{self::NumClass::field2});
  method method2() → core::num*
    return this.{self::NumClass::field1}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart:24:36: Error: The getter 'length' isn't defined for the class 'num'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
  num method2() => field1 + field2.length;
                                   ^^^^^^" as{TypeError,ForDynamic} core::num*);
}
static method main() → dynamic {
  new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
  new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
}
