/*
 * Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion It is a compile time error to assign a value to a local variable
 * marked late and final when the variable is definitely assigned. This includes
 * all forms of assignments, including assignments via the composite assignment
 * operators as well as pre and post-fix operators.
 *
 * @description Check that it is a compile time error to assign a value to a
 * local variable marked late and final when the variable is definitely assigned
 * @author sgrekhov@unipro.ru
 */
// Requirements=nnbd-strong

class C {
  C operator +(int val) {
    return this;
  }

  C operator -(int val) {
    return this;
  }

  C operator *(int val) {
    return this;
  }

  C operator /(int val) {
    return this;
  }

  C operator %(int val) {
    return this;
  }

  C operator <<(int val) {
    return this;
  }

  C operator >>(int val) {
    return this;
  }

  C operator ~/(int val) {
    return this;
  }

  C operator &(int val) {
    return this;
  }

  C operator |(int val) {
    return this;
  }

  C operator ^(int val) {
    return this;
  }

}

main() {
  late final C x = new C();

  x += 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x -= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x *= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x /= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x %= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x ~/= 1;
//  ^^^
// [analyzer] unspecified
// [cfe] unspecified

  x <<= 1;
//  ^^^
// [analyzer] unspecified
// [cfe] unspecified

  x >>= 1;
//  ^^^
// [analyzer] unspecified
// [cfe] unspecified

  x &= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x ^= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified

  x |= 1;
//  ^^
// [analyzer] unspecified
// [cfe] unspecified
}
