library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
//  - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
//     return t1.method1();
//               ^
//
// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
//     SubClass subClass = t2.method2();
//                            ^
//
// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
//     SubClass subClass = t3.method2();
//                            ^^^^^^^
//
import self as self;
import "dart:core" as core;

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
}
class SubClass extends self::Class {
  synthetic constructor •() → self::SubClass
    : super self::Class::•()
    ;
}
extension Extension<T extends core::Object? = dynamic> on T% {
  method method1 = self::Extension|method1;
  tearoff method1 = self::Extension|get#method1;
}
extension BoundExtension<T extends self::Class = self::Class> on T {
  method method2 = self::BoundExtension|method2;
  tearoff method2 = self::BoundExtension|get#method2;
}
static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
  return #this;
static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
  return #this;
static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
  if(t1 is{ForNonNullableByDefault} self::SubClass) {
    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
 - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
    return t1.method1();
              ^" in self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{TypeError,ForNonNullableByDefault} self::Class;
  }
  return new self::Class::•();
}
static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
  if(self::test2::T.{core::Object::==}(self::SubClass)) {
    self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
 - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
    SubClass subClass = t2.method2();
                           ^" in self::BoundExtension|method2<self::test2::T>(t2) as{TypeError,ForNonNullableByDefault} self::SubClass;
  }
}
static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
  if(t3 is{ForNonNullableByDefault} self::SubClass) {
    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
 - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'method2'.
    SubClass subClass = t3.method2();
                           ^^^^^^^";
  }
}
static method main() → dynamic {}


Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///extension_type_variable_bound.dart:25:12 -> TypeLiteralConstant(SubClass)
Extra constant evaluation: evaluated: 24, effectively constant: 1
