library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class C extends core::Object {
  field core::int value = 0;
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
}
extension Extension1 on self::C {
  operator [] = self::Extension1|[];
  operator []= = self::Extension1|[]=;
  operator - = self::Extension1|-;
}
static method Extension1|[](lowered final self::C #this, core::int index) → self::C
  return let final self::C #t1 = #this in block {
    #t1.{self::C::value} = #t1.{self::C::value}{core::int}.{core::num::+}(index.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
  } =>#t1;
static method Extension1|[]=(lowered final self::C #this, core::int index, self::C other) → void
  return #this.{self::C::value} = #this.{self::C::value}{core::int}.{core::num::+}(other.{self::C::value}{core::int}.{core::num::+}(index){(core::num) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
static method Extension1|-(lowered final self::C #this, core::int val) → self::C
  return #this;
static method main() → dynamic {
  self::C c = new self::C::•();
  let final self::C #t2 = c in let final core::int #t3 = 42 in let final self::C #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
  let final self::C #t6 = c in let final core::int #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
  self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
}


Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:19:19 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:19:19 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:22:17 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:22:17 -> IntConstant(42)
Extra constant evaluation: evaluated: 52, effectively constant: 4
