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

import 'dart:collection';

/*member: dynamicIndex:Specializer=[!Index]*/
@pragma('dart2js:noInline')
dynamicIndex(list) {
  return list[0]; // This not known to be an indexable primitive.
}

/*member: unknownListIndex:Specializer=[!Index]*/
@pragma('dart2js:noInline')
unknownListIndex(List list) {
  return list[0]; // This not known to be an indexable primitive.
}

/*member: possiblyNullMutableListIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
possiblyNullMutableListIndex(bool b) {
  var list = b ? [0] : null;
  return list![0];
}

/*member: mutableListIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
mutableListIndex() {
  var list = [0];
  return list[0];
}

/*member: mutableListDynamicIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
mutableListDynamicIndex(dynamic index) {
  var list = [0];
  return list[index]; // CFE inserts an implicit cast of the index.
}

/*spec.member: mutableDynamicListDynamicIndex:Specializer=[!Index]*/
/*prod.member: mutableDynamicListDynamicIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
@pragma('dart2js:disableFinal')
mutableDynamicListDynamicIndex(dynamic index) {
  dynamic list = [0];
  return list[index];
}

main() {
  dynamicIndex([]);
  dynamicIndex({});
  unknownListIndex([]);
  unknownListIndex(new MyList());
  possiblyNullMutableListIndex(true);
  possiblyNullMutableListIndex(false);
  mutableListIndex();
  mutableListDynamicIndex(0);
  mutableListDynamicIndex('');
  mutableDynamicListDynamicIndex(0);
  mutableDynamicListDynamicIndex('');
}

class MyList<E> extends ListBase<E?> {
  E? operator [](int index) => null;
  void operator []=(int index, E? value) {}
  int get length => 0;
  void set length(int value) {}
}
