/*
 * Copyright (c) 2019, 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 A simple member invocation on a target expression X is an
 * expression of one of the forms:
 *           Member invocation on target X	     Corresponding member name
 * X[expr1]++, X[expr1]--, ++X[expr1], --X[expr1]	            []
 * @description Check explicit extension member invocation in form of X[expr1]++
 * @issue 39198
 * @issue 39254
 * @author sgrekhov@unipro.ru
 */


class C {
  int value;
  C() : value = 0 {}
  init() {
    value = 0;
  }
  C operator [](int index) {
    this.value += index;
    return this;
  }
  void operator []=(int index, C other) {
    this.value += other.value + index;
  }
  C operator +(int val) {
    this.value += val;
    return this;
  }
}

extension Ext1 on C {
  C operator [](int index) {
    this.value += index + 1;
    return this;
  }
}

extension Ext2 on C {
  void operator []=(int index, C other) {
    this.value += other.value + index + 2;
  }
}

main() {
  C c = C();
  Ext1(c)[42]++;
//       ^^^^
// [analyzer] unspecified
// [cfe] unspecified

  Ext2(c)[42]++;
//       ^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
