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