library test;
//
// Problems in library:
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:39: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
// var v_prefix_pp = (/*@ target=A::+ */ ++new /*@ type=B* */ B()
//                                       ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:39: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
// var v_prefix_mm = (/*@ target=A::- */ --new /*@ type=B* */ B()
//                                       ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:23:45: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
//         /*@ type=int* */ /*@ target=A::+ */ ++);
//                                             ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:26:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
//         /*@ type=double* */ /*@ target=A::- */ --);
//                                                ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
  operator +(dynamic other) → core::int*
    return 1;
  operator -(dynamic other) → core::double*
    return 2.0;
}
class B extends core::Object {
  field self::A* a = null;
  synthetic constructor •() → self::B*
    : super core::Object::•()
    ;
}
static field core::int* v_prefix_pp = let final self::B* #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:39: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
 - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
var v_prefix_pp = (/*@ target=A::+ */ ++new /*@ type=B* */ B()
                                      ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A*;
static field core::double* v_prefix_mm = let final self::B* #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:39: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
 - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
var v_prefix_mm = (/*@ target=A::- */ --new /*@ type=B* */ B()
                                      ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A*;
static field self::A* v_postfix_pp = let final self::B* #t5 = new self::B::•() in let final self::A* #t6 = #t5.{self::B::a} in let final core::int* #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:23:45: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
 - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
        /*@ type=int* */ /*@ target=A::+ */ ++);
                                            ^" in #t6.{self::A::+}(1) as{TypeError} self::A* in #t6;
static field self::A* v_postfix_mm = let final self::B* #t9 = new self::B::•() in let final self::A* #t10 = #t9.{self::B::a} in let final core::double* #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:26:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
 - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
        /*@ type=double* */ /*@ target=A::- */ --);
                                               ^" in #t10.{self::A::-}(1) as{TypeError} self::A* in #t10;
static method main() → dynamic {}
