library;
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  operator +(core::int i) → core::String
    return "";
}
static method test(core::int i, core::String s, self::A a) → dynamic {
  i = 1;
  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
Try changing the type of the left hand side, or casting the right hand side to 'int'.
  i = /*@error=InvalidAssignment*/ s;
                                   ^" in s as{TypeError} core::int;
  i.{core::num::==}(null) ?{core::int} i = 1 : null;
  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
Try changing the type of the left hand side, or casting the right hand side to 'int'.
  i ??= /*@error=InvalidAssignment*/ s;
                                     ^" in s as{TypeError} core::int : null;
  a = new self::A::•();
  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
 - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
Try changing the type of the left hand side, or casting the right hand side to 'A'.
  a /*@error=InvalidAssignment*/ += 1;
                                 ^" in a.{self::A::+}(1) as{TypeError} self::A;
}
static method main() → dynamic {}
