library test /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart:34:25: Error: A value of type 'A' can't be assigned to a variable of type 'B'.
//  - 'A' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
//  - 'B' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
//         /*@target=B.+*/ += /*@typeArgs=C*/ f();
//                         ^
//
// pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart:55:32: Error: A value of type 'A' can't be assigned to a variable of type 'B'.
//  - 'A' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
//  - 'B' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
//         member /*@target=B.+*/ +=
//                                ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
  operator +(self::C v) → self::A
    return throw "";
  operator -(core::int i) → self::B
    return throw "";
  operator *(self::B v) → self::B
    return throw "";
  operator &(self::A v) → self::C
    return throw "";
}
class C extends self::B {
  synthetic constructor •() → self::C
    : super self::B::•()
    ;
}
class Test extends core::Object {
  field self::B member;
  field self::B? member2;
  constructor •(self::B member, self::B? member2) → self::Test
    : self::Test::member = member, self::Test::member2 = member2, super core::Object::•()
    ;
  method test() → void {
    this.{self::Test::member} = self::f<self::B>();
    this.{self::Test::member2}{self::B?} == null ?{self::B?} this.{self::Test::member2} = self::f<self::B?>() : null;
    this.{self::Test::member} = invalid-expression "pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart:34:25: Error: A value of type 'A' can't be assigned to a variable of type 'B'.
 - 'A' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
 - 'B' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
        /*@target=B.+*/ += /*@typeArgs=C*/ f();
                        ^" in this.{self::Test::member}{self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::A} as{TypeError,ForNonNullableByDefault} self::B;
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    self::B v1 = this.{self::Test::member} = self::f<self::B>();
    self::B? v2 = let final self::B? #t1 = this.{self::Test::member2}{self::B?} in #t1 == null ?{self::B?} this.{self::Test::member2} = self::f<self::B?>() : #t1{self::B};
    self::A v3 = this.{self::Test::member} = invalid-expression "pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart:55:32: Error: A value of type 'A' can't be assigned to a variable of type 'B'.
 - 'A' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
 - 'B' is from 'pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart'.
        member /*@target=B.+*/ +=
                               ^" in this.{self::Test::member}{self::B}.{self::B::+}(self::f<self::C>()){(self::C) → self::A} as{TypeError,ForNonNullableByDefault} self::B;
    self::B v4 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::*}(self::f<self::B>()){(self::B) → self::B};
    self::C v5 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::&}(self::f<self::A>()){(self::A) → self::C};
    self::B v6 = this.{self::Test::member} = this.{self::Test::member}{self::B}.{self::B::-}(1){(core::int) → self::B};
    self::B v7 = let final self::B #t2 = this.{self::Test::member}{self::B} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1){(core::int) → self::B} in #t2;
  }
}
static method f<T extends core::Object? = dynamic>() → self::f::T%
  return throw "";
static method main() → dynamic {}
