// 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.

void main() {}

void f1(NotGeneric x) {
  x[0] + 1;
  x[0] = 1;
  useNonNullable(x[0] = 1);
  x[0] += 1;
  useNonNullable(x[0] += 1);
  x[0]++;
  useNonNullable(x[0]++);
  ++x[0];
  useNonNullable(++x[0]);
}

void f2(NotGeneric? x) {
  x?[0] + 1;
//      ^
// [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// [cfe] unspecified
  x?[0] = 1;
  useNonNullable(x?[0] = 1);
//               ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] unspecified
  x?[0] += 1;
  useNonNullable(x?[0] += 1);
//               ^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] unspecified
  x?[0]++;
  useNonNullable(x?[0]++);
//               ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] unspecified
  ++x?[0];
  useNonNullable(++x?[0]);
//               ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] unspecified
}

void f3<T extends num>(Generic<T>? x) {
  x?[0] + 1;
//      ^
// [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// [cfe] unspecified
}

void f4<T extends num>(Generic<T?> x) {
  x[0] + 1;
//     ^
// [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// [cfe] unspecified
}

class NotGeneric {
  int operator [](int index) => throw 'unreachable';
  void operator []=(int index, int value) => throw 'unreachable';
}

class Generic<T> {
  T operator [](int index) => throw 'unreachable';
  void operator []=(int index, T value) => throw 'unreachable';
}

void useNonNullable(int a) {}
