library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue40242.dart:9:5: Error: Can't assign to 'this'.
//     this = new C();
//     ^^^^
//
// pkg/front_end/testcases/general/issue40242.dart:15:3: Error: Can't assign to the final variable 'c1'.
//   c1 = new C();
//   ^^
//
// pkg/front_end/testcases/general/issue40242.dart:16:3: Error: Can't assign to a type literal.
//   C = Object;
//   ^
//
// pkg/front_end/testcases/general/issue40242.dart:20:3: Error: Can't assign to the const variable 'c3'.
//   c3 = null;
//   ^^
//
import self as self;
import "dart:core" as core;

class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
}
extension E on self::C {
  method errors = self::E|errors;
  method tearoff errors = self::E|get#errors;
}
static extension-member method E|errors(lowered final self::C #this) → dynamic {
  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:9:5: Error: Can't assign to 'this'.
    this = new C();
    ^^^^";
}
static extension-member method E|get#errors(lowered final self::C #this) → () → dynamic
  return () → dynamic => self::E|errors(#this);
static method errors() → dynamic {
  final self::C c1 = new self::C::•();
  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:15:3: Error: Can't assign to the final variable 'c1'.
  c1 = new C();
  ^^";
  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:16:3: Error: Can't assign to a type literal.
  C = Object;
  ^";
  self::C c2;
  {
    final synthesized self::C #0#0 = new self::C::•();
    c2 = #0#0;
  }
  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:20:3: Error: Can't assign to the const variable 'c3'.
  c3 = null;
  ^^";
}
static method main() → dynamic {}
