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

// SharedOptions=--enable-experiment=non-nullable

// Test that it is an error to use nullable types in unsound ways.
void main() async {
  int? x;
  bool? cond;
  List? list;
  Function? func;
  List<Function?> funcList = [];
  Stream? stream;
  x.isEven; //# 00: compile-time error
  x.round(); //# 01: compile-time error
  x.toString(); //# 02: ok
  x.hashCode; //# 03: ok
  x.runtimeType; //# 04: ok
  x.noSuchMethod(Invocation.method(#toString, [])); //# 05: ok
  x + 1; //# 06: compile-time error
  -x; //# 06: compile-time error
  x++; //# 07: compile-time error
  ++x; //# 08: compile-time error
  x..isEven; //# 09: compile-time error
  list[0]; //# 10: compile-time error
  list[0] = 0; //# 10: compile-time error
  x += 1; //# 11: compile-time error
  x ??= 1; //# 12: ok
  x.round; //# 13: compile-time error
  x.toString; //# 14: ok
  x.noSuchMethod; //# 15: ok
  func(); //# 16: compile-time error
  funcList[0](); //# 17: compile-time error
  funcList.single(); //# 18: compile-time error
  throw x; //# 19: compile-time error
  cond || true; //# 20: compile-time error
  true || cond; //# 21: compile-time error
  cond && true; //# 22: compile-time error
  true && cond; //# 23: compile-time error
  !cond; //# 24: compile-time error
  cond ? null : null; //# 25: compile-time error
  if (cond) {} //# 26: compile-time error
  while (cond) {} //# 27: compile-time error
  for (;cond;) {} //# 28: compile-time error
  do {} while (cond); //# 29: compile-time error
  cond!; //# 30: ok
  cond ?? null; //# 31: ok
  cond == null; //# 32: ok
  cond != null; //# 33: ok
  x?.isEven; //# 34: ok
  x?.round(); //# 35: ok
  for(var i in list) {}; //# 36: compile-time error
  await for(var i in stream) {}; //# 37: compile-time error
  assert(cond); //# 38: compile-time error
  [...list]; //# 39: compile-time error
  [...?list]; //# 40: ok
}

generator() sync* {
  Iterable? iter;
  yield* iter; //# 41: compile-time error
}

void typeParametersNullableBounds<IQ extends int?, BQ extends bool?, LQ extends List?, FQ extends Function?, SQ extends Stream?>(
    IQ x,
    BQ cond,
    LQ list,
    FQ func,
    List<FQ> funcList,
    SQ stream,
    ) async {
  x.isEven; //# 42: compile-time error
  x.round(); //# 43: compile-time error
  x.toString(); //# 44: ok
  x.hashCode; //# 45: ok
  x.runtimeType; //# 46: ok
  x.noSuchMethod(Invocation.method(#toString, [])); //# 47: ok
  x + 1; //# 48: compile-time error
  -x; //# 49: compile-time error
  x++; //# 50: compile-time error
  ++x; //# 51: compile-time error
  x..isEven; //# 52: compile-time error
  list[0]; //# 53: compile-time error
  list[0] = 0; //# 54: compile-time error
  x += 1; //# 55: compile-time error
  x ??= x; //# 56: ok
  x.round; //# 57: compile-time error
  x.toString; //# 58: ok
  x.noSuchMethod; //# 59: ok
  func(); //# 60: compile-time error
  funcList[0](); //# 61: compile-time error
  funcList.single(); //# 62: compile-time error
  throw x; //# 63: compile-time error
  cond || true; //# 64: compile-time error
  true || cond; //# 65: compile-time error
  cond && true; //# 66: compile-time error
  true && cond; //# 67: compile-time error
  !cond; //# 68: compile-time error
  cond ? null : null; //# 69: compile-time error
  if (cond) {} //# 70: compile-time error
  while (cond) {} //# 71: compile-time error
  for (;cond;){} //# 72: compile-time error
  do {} while (cond); //# 73: compile-time error
  cond!; //# 74: ok
  cond ?? null; //# 75: ok
  cond == null; //# 76: ok
  cond != null; //# 77: ok
  x?.isEven; //# 78: ok
  x?.round(); //# 79: ok
  for(var i in list) {}; //# 80: compile-time error
  await for(var i in stream) {}; //# 81: compile-time error
  assert(cond); //# 41: compile-time error
}

void typeParametersNullableUses<I extends int, B extends bool, L extends List, F extends Function, S extends Stream>(
    I? x,
    B? cond,
    L? list,
    F? func,
    List<F?> funcList,
    S? stream,
    ) async {
  x.isEven; //# 82: compile-time error
  x.round(); //# 83: compile-time error
  x.toString(); //# 84: ok
  x.hashCode; //# 85: ok
  x.runtimeType; //# 86: ok
  x.noSuchMethod(Invocation.method(#toString, [])); //# 87: ok
  x + 1; //# 88: compile-time error
  -x; //# 89: compile-time error
  x++; //# 90: compile-time error
  ++x; //# 91: compile-time error
  x..isEven; //# 92: compile-time error
  list[0]; //# 93: compile-time error
  list[0] = 0; //# 94: compile-time error
  x += 1; //# 95: compile-time error
  x ??= null; //# 96: ok
  x.round; //# 97: compile-time error
  x.toString; //# 98: ok
  x.noSuchMethod; //# 99: ok
  func(); //# 100: compile-time error
  funcList[0](); //# 101: compile-time error
  funcList.single(); //# 102: compile-time error
  throw x; //# 103: compile-time error
  cond || true; //# 104: compile-time error
  true || cond; //# 105: compile-time error
  cond && true; //# 106: compile-time error
  true && cond; //# 107: compile-time error
  !cond; //# 108: compile-time error
  cond ? null : null; //# 109: compile-time error
  if (cond) {} //# 110: compile-time error
  while (cond) {} //# 111: compile-time error
  for (;cond;) {} //# 112: compile-time error
  do {} while (cond); //# 113: compile-time error
  cond!; //# 114: ok
  cond ?? null; //# 115: ok
  cond == null; //# 116: ok
  cond != null; //# 117: ok
  x?.isEven; //# 118: ok
  x?.round(); //# 119: ok
  for(var i in list) {}; //# 120: compile-time error
  await for(var i in stream) {}; //# 121: compile-time error
}

void dynamicUses() async {
  dynamic dyn;
  dyn.isEven; //# 122: ok
  dyn.round(); //# 123: ok
  dyn.toString(); //# 124: ok
  dyn.hashCode; //# 125: ok
  dyn.runtimeType; //# 126: ok
  dyn.noSuchMethod(null); //# 127: ok
  dyn + 1; //# 128: ok
  -dyn; //# 129: ok
  dyn++; //# 130: ok
  ++dyn; //# 131: ok
  dyn..isEven; //# 132: ok
  dyn[0]; //# 133: ok
  dyn[0] = 0; //# 134: ok
  dyn += 1; //# 135: ok
  dyn ??= null; //# 136: ok
  dyn.round; //# 137: ok
  dyn.toString; //# 138: ok
  dyn.noSuchMethod; //# 139: ok
  dyn(); //# 140: ok
  dyn[0](); //# 141: ok
  dyn.single(); //# 142: ok
  throw dyn; //# 143: ok
  dyn || true; //# 144: ok
  true || dyn; //# 145: ok
  dyn && true; //# 146: ok
  true && dyn; //# 147: ok
  !dyn; //# 148: ok
  dyn ? null : null; //# 149: ok
  if (dyn) {} //# 150: ok
  while (dyn) {} //# 151: ok
  for (;dyn;) {} //# 152: ok
  do {} while (dyn); //# 153: ok
  dyn!; //# 154: ok
  dyn ?? null; //# 155: ok
  dyn == null; //# 156: ok
  dyn != null; //# 157: ok
  dyn?.isEven; //# 158: ok
  dyn?.round(); //# 159: ok
  for(var i in dyn) {}; //# 160: ok
  await for(var i in dyn) {}; //# 161: ok
}
