// Copyright (c) 2017, 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.

// Dart test for type checks on usage of expressions of type void.

void use(dynamic x) { }
void useAsVoid(void x) { }

Object testVoidParam(void x) {
  x;  //# param_stmt: ok
  true ? x : x;  //# param_conditional: ok
  for (x; false; x) {}   //# param_for: ok
  useAsVoid(x); //# param_argument_void: ok
  use(x);   //# param_argument: compile-time error
  use(x as Object);  //# param_as: ok
  void y = x;   //# param_void_init: ok
  dynamic z = x;  //# param_dynamic_init: compile-time error
  x is Object;   //# param_is: compile-time error
  throw x;   //# param_throw: compile-time error
  <void>[x];   //# param_literal_void_list_init: ok
  <Object>[x];   //# param_literal_list_init: compile-time error
  var m1 = <int, void>{4: x};   //# param_literal_map_value_init: ok
  var m2 = <void, int>{x : 4};   //# param_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: x};  //# param_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{x : 4};  //# param_literal_map_key_init2: compile-time error
  x ?? 499;  //# param_null_equals1: compile-time error
  null ?? x;  //# param_null_equals2: ok
  return x;   //# param_return: compile-time error
  while (x) {};  //# param_while: compile-time error
  do {} while (x);  //# param_do_while: compile-time error
  for (var v in x) {}   //# param_for_in: compile-time error
  for (x in [1, 2]) {}  //# param_for_in2: ok
  x += 1;  //# param_plus_eq: compile-time error
  x.toString();  //# param_toString: compile-time error
  x?.toString();  //# param_null_dot: compile-time error
  x..toString();  //# param_cascade: compile-time error
  if (x) {}; //# param_conditional_stmt: compile-time error
  !x; //# param_boolean_negation: compile-time error
  x && true; //# param_boolean_and_left: compile-time error
  true && x; //# param_boolean_and_right: compile-time error
  x || true; //# param_boolean_or_left: compile-time error
  true || x; //# param_boolean_or_right: compile-time error
  x == 3; //# param_equals_left: compile-time error
  3 == x; //# param_equals_right: compile-time error
  identical(3, x); //# param_identical: compile-time error
  3 + x; //# param_addition: compile-time error
  3 * x; //# param_multiplication: compile-time error
  -x; //# param_negation: compile-time error
  x(3); //# param_use_as_function: compile-time error
  "hello$x"; //# param_use_in_string_interpolation: compile-time error
  x ??= 3; //# param_use_in_conditional_assignment_left: compile-time error
  Object xx;  xx ??= x; //# param_use_in_conditional_assignment_right: compile-time error
  var ll = <int>[3]; ll[x]; //# param_use_in_list_subscript: compile-time error
  var mm = <void, void>{}; mm[x]; //# param_use_in_map_lookup: compile-time error
}

testVoidAsync(void x) async {
  await x; //# async_use_in_await: ok
}

testVoidAsyncStar(void x) async* {
  yield x; //# async_use_in_yield: compile-time error
  yield* x; //# async_use_in_yield_star: compile-time error
  await for (var i in x) {} //# async_use_in_await_for: compile-time error
}

testVoidSyncStar(void x) sync* {
  yield x; //# sync_use_in_yield: compile-time error
  yield* x; //# sync_use_in_yield_star: compile-time error
}

const void c = null;

dynamic testVoidDefaultParameter([int y = c]) {} //# void_default_parameter_global: compile-time error

dynamic testVoidDefaultParameterClosure() {
  ([int y = c]) => 3;//# void_default_parameter_closure: compile-time error
}

dynamic testVoidParamDynamic(void x) {
  return x;   //# param_return_dynamic: ok
}

Object testVoidCall(void f()) {
  f();  //# call_stmt: ok
  true ? f() : f();  //# call_conditional: ok
  for (f(); false; f()) {}   //# call_for: ok
  useAsVoid(f()); //# call_argument_void: ok
  use(f());   //# call_argument: compile-time error
  use(f() as Object);  //# call_as: ok
  void y = f();   //# call_void_init: ok
  dynamic z = f();  //# call_dynamic_init: compile-time error
  f() is Object;   //# call_is: compile-time error
  throw f();   //# call_throw: compile-time error
  <void>[f()];   //# call_literal_void_list_init: ok
  <Object>[f()];   //# call_literal_list_init: compile-time error
  var m1 = <int, void>{4: f() };   //# call_literal_map_value_init: ok
  var m2 = <void, int>{ f(): 4};   //# call_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: f() };  //# call_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{ f(): 4};  //# call_literal_map_key_init2: compile-time error
  f() ?? 499;  //# call_null_equals1: compile-time error
  null ?? f();  //# call_null_equals2: ok
  return f();   //# call_return: compile-time error
  while (f()) {};  //# call_while: compile-time error
  do {} while (f());  //# call_do_while: compile-time error
  for (var v in f()) {}   //# call_for_in: compile-time error
  f().toString();  //# call_toString: compile-time error
  f()?.toString();  //# call_null_dot: compile-time error
  f()..toString();  //# call_cascade: compile-time error
  if (f()) {}; //# call_conditional_stmt: compile-time error
  !f(); //# call_boolean_negation: compile-time error
  f() && true; //# call_boolean_and_left: compile-time error
  true && f(); //# call_boolean_and_right: compile-time error
  f() || true; //# call_boolean_or_left: compile-time error
  true || f(); //# call_boolean_or_right: compile-time error
  f() == 3; //# call_equals_left: compile-time error
  3 == f(); //# call_equals_right: compile-time error
  identical(3, f()); //# call_identical: compile-time error
  3 + f(); //# call_addition: compile-time error
  3 * f(); //# call_multiplication: compile-time error
  -f(); //# call_negation: compile-time error
  f()(3); //# call_use_as_function: compile-time error
  "hello${f()}"; //# call_use_in_string_interpolation: compile-time error
  f() ??= 3; //# call_use_in_conditional_assignment_left: compile-time error
  Object xx;  xx ??= f(); //# call_use_in_conditional_assignment_right: compile-time error
  var ll = <int>[3]; ll[f()]; //# call_use_in_list_subscript: compile-time error
  var mm = <void, void>{}; mm[f()]; //# call_use_in_map_lookup: ok
}

dynamic testVoidCallDynamic(void f()) {
  return f();   //# call_return: ok
}

Object testVoidLocal() {
  void x;
  x = 42;   //# local_assign: ok
  x;  //# local_stmt: ok
  true ? x : x;  //# local_conditional: ok
  for (x; false; x) {}   //# local_for: ok
  useAsVoid(x); //# local_argument_void: ok
  use(x);   //# local_argument: compile-time error
  use(x as Object);  //# local_as: ok
  void y = x;   //# local_void_init: ok
  dynamic z = x;  //# local_dynamic_init: compile-time error
  x is Object;   //# local_is: compile-time error
  throw x;   //# local_throw: compile-time error
  <void>[x];   //# local_literal_void_list_init: ok
  <Object>[x];   //# local_literal_list_init: compile-time error
  var m1 = <int, void>{4: x};   //# local_literal_map_value_init: ok
  var m2 = <void, int>{x : 4};   //# local_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: x};  //# local_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{x : 4};  //# local_literal_map_key_init2: compile-time error
  x ?? 499;  //# local_null_equals1: compile-time error
  null ?? x;  //# local_null_equals2: ok
  return x;   //# local_return: compile-time error
  while (x) {};  //# local_while: compile-time error
  do {} while (x);  //# local_do_while: compile-time error
  for (var v in x) {}   //# local_for_in: compile-time error
  for (x in [1, 2]) {}  //# local_for_in2: ok
  x += 1;  //# local_plus_eq: compile-time error
  x.toString();  //# local_toString: compile-time error
  x?.toString();  //# local_null_dot: compile-time error
  x..toString();  //# local_cascade: compile-time error
   if (x) {}; //# local_conditional_stmt: compile-time error
  !x; //# local_boolean_negation: compile-time error
  x && true; //# local_boolean_and_left: compile-time error
  true && x; //# local_boolean_and_right: compile-time error
  x || true; //# local_boolean_or_left: compile-time error
  true || x; //# local_boolean_or_right: compile-time error
  x == 3; //# local_equals_left: compile-time error
  3 == x; //# local_equals_right: compile-time error
  identical(3, x); //# local_identical: compile-time error
  3 + x; //# local_addition: compile-time error
  3 * x; //# local_multiplication: compile-time error
  -x; //# local_negation: compile-time error
  x(3); //# local_use_as_function: compile-time error
  "hello$x"; //# local_use_in_string_interpolation: compile-time error
  x ??= 3; //# local_use_in_conditional_assignment_left: compile-time error
  Object xx;  xx ??= x; //# local_use_in_conditional_assignment_right: compile-time error
  var ll = <int>[3]; ll[x]; //# local_use_in_list_subscript: compile-time error
  var mm = <void, void>{}; mm[x]; //# local_use_in_map_lookup: ok
}

dynamic testVoidLocalDynamic() {
  void x;
  return x;   //# local_return_dynamic: ok
}

Object testVoidFinalLocal() {
  final void x = null;
  x = 42;   //# final_local_assign: compile-time error
  x;  //# final_local_stmt: ok
  true ? x : x;  //# final_local_conditional: ok
  for (x; false; x) {}   //# final_local_for: ok
  useAsVoid(x); //# final_local_argument_void: ok
  use(x);   //# final_local_argument: compile-time error
  use(x as Object);  //# final_local_as: ok
  void y = x;   //# final_local_void_init: ok
  dynamic z = x;  //# final_local_dynamic_init: compile-time error
  x is Object;   //# final_local_is: compile-time error
  throw x;   //# final_local_throw: compile-time error
  <void>[x];   //# final_local_literal_void_list_init: ok
  <Object>[x];   //# final_local_literal_list_init: compile-time error
  var m1 = <int, void>{4: x};   //# final_local_literal_map_value_init: ok
  var m2 = <void, int>{x : 4};   //# final_local_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: x};  //# final_local_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{x : 4};  //# final_local_literal_map_key_init2: compile-time error
  x ?? 499;  //# final_local_null_equals1: compile-time error
  null ?? x;  //# final_local_null_equals2: ok
  return x;   //# final_local_return: compile-time error
  while (x) {};  //# final_local_while: compile-time error
  do {} while (x);  //# final_local_do_while: compile-time error
  for (var v in x) {}   //# final_local_for_in: compile-time error
  for (x in [1, 2]) {}  //# final_local_for_in2: compile-time error
  x += 1;  //# final_local_plus_eq: compile-time error
  x.toString();  //# final_local_toString: compile-time error
  x?.toString();  //# final_local_null_dot: compile-time error
  x..toString();  //# final_local_cascade: compile-time error
   if (x) {}; //# final_local_conditional_stmt: compile-time error
  !x; //# final_local_boolean_negation: compile-time error
  x && true; //# final_local_boolean_and_left: compile-time error
  true && x; //# final_local_boolean_and_right: compile-time error
  x || true; //# final_local_boolean_or_left: compile-time error
  true || x; //# final_local_boolean_or_right: compile-time error
  x == 3; //# final_local_equals_left: compile-time error
  3 == x; //# final_local_equals_right: compile-time error
  identical(3, x); //# final_local_identical: compile-time error
  3 + x; //# final_local_addition: compile-time error
  3 * x; //# final_local_multiplication: compile-time error
  -x; //# final_local_negation: compile-time error
  x(3); //# final_local_use_as_function: compile-time error
  "hello$x"; //# final_local_use_in_string_interpolation: compile-time error
  x ??= 3; //# final_local_use_in_conditional_assignment_left: compile-time error
  Object xx;  xx ??= x; //# final_local_use_in_conditional_assignment_right: compile-time error
  var ll = <int>[3]; ll[x]; //# final_local_use_in_list_subscript: compile-time error
  var mm = <void, void>{}; mm[x]; //# final_local_use_in_map_lookup: ok
}

dynamic testVoidFinalLocalDynamic() {
  final void x = null;
  return x;   //# final_local_return_dynamic: ok
}

void global;
Object testVoidGlobal() {
  global;  //# global_stmt: ok
  true ? global : global;  //# global_conditional: ok
  for (global; false; global) {}   //# global_for: ok
  useAsVoid(global); //# global_argument_void: ok
  use(global);   //# global_argument: compile-time error
  use(global as Object);  //# global_as: ok
  void y = global;   //# global_void_init: ok
  dynamic z = global;  //# global_dynamic_init: compile-time error
  global is Object;   //# global_is: compile-time error
  throw global;   //# global_throw: compile-time error
  <void>[global];   //# global_literal_void_list_init: ok
  <Object>[global];   //# global_literal_list_init: compile-time error
  var m1 = <int, void>{4: global };   //# global_literal_map_value_init: ok
  var m2 = <void, int>{ global: 4};   //# global_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: global };  //# global_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{ global: 4};  //# global_literal_map_key_init2: compile-time error
  null ?? global;  //# global_null_equals1: ok
  global ?? 499;  //# global_null_equals2: compile-time error
  return global;   //# global_return: compile-time error
  while (global) {};  //# global_while: compile-time error
  do {} while (global);  //# global_do_while: compile-time error
  for (var v in global) {}   //# global_for_in: compile-time error
  for (global in [1, 2]) {}  //# global_for_in2: ok
  global += 1;  //# global_plus_eq: compile-time error
  global.toString();  //# global_toString: compile-time error
  global?.toString();  //# global_null_dot: compile-time error
  global..toString();  //# global_cascade: compile-time error
  if (global) {}; //# global_conditional_stmt: compile-time error
  !global; //# global_boolean_negation: compile-time error
  global && true; //# global_boolean_and_left: compile-time error
  true && global; //# global_boolean_and_right: compile-time error
  global || true; //# global_boolean_or_left: compile-time error
  true || global; //# global_boolean_or_right: compile-time error
  global == 3; //# global_equals_left: compile-time error
  3 == global; //# global_equals_right: compile-time error
  identical(3, global); //# global_identical: compile-time error
  3 + global; //# global_addition: compile-time error
  3 * global; //# global_multiplication: compile-time error
  -global; //# global_negation: compile-time error
  global(3); //# global_use_as_function: compile-time error
  "hello$global"; //# global_use_in_string_interpolation: compile-time error
  global ??= 3; //# global_use_in_conditional_assignment_left: compile-time error
  Object xx;  xx ??= global; //# global_use_in_conditional_assignment_right: compile-time error
  var ll = <int>[3]; ll[global]; //# global_use_in_list_subscript: compile-time error
  var mm = <void, void>{}; mm[global]; //# global_use_in_map_lookup: ok
}

dynamic testVoidGlobalDynamic() {
  return global;   //# global_return_dynamic: ok
}

Object testVoidConditional() {
  void x;
  (true ? x : x);   //# conditional_parens: ok
  true ? x : x;  //# conditional_stmt: ok
  true ? true ? x : x : true ? x : x;  //# conditional_conditional: ok
  for (true ? x : x; false; true ? x : x) {}   //# conditional_for: ok
  useAsVoid(true ? x : x); //# conditional_argument_void: ok
  use(true ? x : x);   //# conditional_argument: compile-time error
  void y = true ? x : x;   //# conditional_void_init: ok
  dynamic z = true ? x : x;  //# conditional_dynamic_init: compile-time error
  throw true ? x : x;   //# conditional_throw: compile-time error
  <void>[true ? x : x];   //# conditional_literal_void_list_init: ok
  <Object>[true ? x : x];   //# conditional_literal_list_init: compile-time error
  var m1 = <int, void>{4: true ? x : x};   //# conditional_literal_map_value_init: ok
  var m3 = <dynamic, dynamic>{4: true ? x : x};  //# conditional_literal_map_value_init2: compile-time error
  (true ? x : x) ?? null;  //# conditional_null_equals1: compile-time error
  null ?? (true ? x : x);  //# conditional_null_equals2: ok
  return true ? x : x;   //# conditional_return: compile-time error
  while (true ? x : x) {};  //# conditional_while: compile-time error
  do {} while (true ? x : x);  //# conditional_do_while: compile-time error
  for (var v in true ? x : x) {}   //# conditional_for_in: compile-time error

  (true ? 499 : x);   //# conditional2_parens: ok
  true ? 499 : x;  //# conditional2_stmt: ok
  true ? true ? 499 : x : true ? 499 : x;  //# conditional2_conditional: ok
  for (true ? 499 : x; false; true ? 499 : x) {}   //# conditional2_for: ok
  useAsVoid(true ? 499 : x); //# conditional2_argument_void: ok
  use(true ? 499 : x);   //# conditional2_argument: compile-time error
  void y2 = true ? 499 : x;   //# conditional2_void_init: ok
  dynamic z2 = true ? 499 : x;  //# conditional2_dynamic_init: compile-time error
  throw true ? 499 : x;   //# conditional2_throw: compile-time error
  <void>[true ? 499 : x];   //# conditional2_literal_void_list_init: ok
  <Object>[true ? 499 : x];   //# conditional2_literal_list_init: compile-time error
  var m12 = <int, void>{4: true ? 499 : x};   //# conditional2_literal_map_value_init: ok
  var m32 = <dynamic, dynamic>{4: true ? 499 : x};  //# conditional2_literal_map_value_init2: compile-time error
  (true ? 499 : x) ?? null;  //# conditional2_null_equals1: compile-time error
  null ?? (true ? 499 : x);  //# conditional2_null_equals2: ok
  return true ? 499 : x;   //# conditional2_return: compile-time error
  while (true ? 499 : x) {};  //# conditional2while: compile-time error
  do {} while (true ? 499 : x);  //# conditional2do_while: compile-time error
  for (var v in true ? 499 : x) {}   //# conditional2for_in: compile-time error

  (true ? x : 499);   //# conditional3_parens: ok
  true ? x : 499;  //# conditional3_stmt: ok
  true ? true ? x : 499 : true ? x : 499;  //# conditional3_conditional: ok
  for (true ? x : 499; false; true ? x : 499) {}   //# conditional3_for: ok
  useAsVoid(true ? x : 499); //# conditional3_argument_void: ok
  use(true ? x : 499);   //# conditional3_argument: compile-time error
  void y3 = true ? x : 499;   //# conditional3_void_init: ok
  dynamic z3 = true ? x : 499;  //# conditional3_dynamic_init: compile-time error
  throw true ? x : 499;   //# conditional3_throw: compile-time error
  <void>[true ? x : 499];   //# conditional3_literal_void_list_init: ok
  <Object>[true ? x : 499];   //# conditional3_literal_list_init: compile-time error
  var m13 = <int, void>{4: true ? x : 499 };   //# conditional3_literal_map_value_init: ok
  var m33 = <dynamic, dynamic>{4: true ? x : 499 };  //# conditional3_literal_map_value_init2: compile-time error
  (true ? x : 499) ?? null;  //# conditional3_null_equals1: compile-time error
  null ?? (true ? x : 499);  //# conditional3_null_equals2: ok
  return true ? x : 499;   //# conditional3_return: compile-time error
  while (true ? x : 499) {};  //# conditional_while: compile-time error
  do {} while (true ? x : 499);  //# conditional_do_while: compile-time error
  for (var v in true ? x : 499) {}   //# conditional_for_in: compile-time error
}

dynamic testVoidConditionalDynamic() {
  void x;
  return true ? x : x;   //# conditional_return_dynamic: ok
  return true ? 499 : x;   //# conditional2_return_dynamic: ok
  return true ? x : 499;   //# conditional3_return_dynamic: ok
}

class A<T> {
  T x;

  void foo() {}
}

class B implements A<void> {
  void x;

  int foo() => 499;

  void forInTest() {
    for (x in <void>[]) {}  //# instance2_for_in2: ok
    for (x in [1, 2]) {}  //# instance2_for_in3: ok
  }
}

class C implements A<void> {
  void get x => null;
  set x(void y) {}

  void foo() {}

  void forInTest() {
    for (x in <void>[]) {}  //# instance3_for_in2: ok
    for (x in [1, 2]) {}  //# instance3_for_in3: ok
  }
}

Object testInstanceField() {
  A<void> a = new A<void>();
  a.x = 499;  //# field_assign: ok
  a.x;  //# instance_stmt: ok
  true ? a.x : a.x;  //# instance_conditional: ok
  for (a.x; false; a.x) {}   //# instance_for: ok
  useAsVoid(a.x); //# instance_argument_void: ok
  use(a.x);   //# instance_argument: compile-time error
  use(a.x as Object);  //# instance_as: ok
  void y = a.x;   //# instance_void_init: ok
  dynamic z = a.x;  //# instance_dynamic_init: compile-time error
  a.x is Object;   //# instance_is: compile-time error
  throw a.x;   //# instance_throw: compile-time error
  <void>[a.x];   //# instance_literal_void_list_init: ok
  <Object>[a.x];   //# instance_literal_list_init: compile-time error
  var m1 = <int, void>{4: a.x};   //# instance_literal_map_value_init: ok
  var m2 = <void, int>{ a.x : 4};   //# instance_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: a.x};  //# instance_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{ a.x : 4};  //# instance_literal_map_key_init2: compile-time error
  null ?? a.x;  //# instance_null_equals1: ok
  a.x ?? 499;  //# instance_null_equals2: compile-time error
  return a.x;   //# instance_return: compile-time error
  while (a.x) {};  //# instance_while: compile-time error
  do {} while (a.x);  //# instance_do_while: compile-time error
  for (var v in a.x) {}   //# instance_for_in: compile-time error
  a.x += 1;  //# instance_plus_eq: compile-time error
  a.x.toString();  //# instance_toString: compile-time error
  a.x?.toString();  //# instance_null_dot: compile-time error
  a.x..toString();  //# instance_cascade: compile-time error

  B b = new B();
  b.x = 42;   //# field_assign2: ok
  b.x;  //# instance2_stmt: ok
  true ? b.x : b.x;  //# instance2_conditional: ok
  for (b.x; false; b.x) {}   //# instance2_for: ok
  useAsVoid(b.x); //# instance2_argument_void: ok
  use(b.x);   //# instance2_argument: compile-time error
  use(b.x as Object);  //# instance2_as: ok
  void y2 = b.x;   //# instance2_void_init: ok
  dynamic z2 = b.x;  //# instance2_dynamic_init: compile-time error
  b.x is Object;   //# instance2_is: compile-time error
  throw b.x;   //# instance2_throw: compile-time error
  <void>[b.x];   //# instance2_literal_void_list_init: ok
  <Object>[b.x];   //# instance2_literal_list_init: compile-time error
  var m12 = <int, void>{4: b.x};   //# instance2_literal_map_value_init: ok
  var m22 = <void, int>{ b.x : 4};   //# instance2_literal_map_key_init: ok
  var m32 = <dynamic, dynamic>{4: b.x};  //# instance2_literal_map_value_init2: compile-time error
  var m42 = <dynamic, dynamic>{ b.x : 4};  //# instance2_literal_map_key_init2: compile-time error
  null ?? b.x;  //# instance2_null_equals1: ok
  b.x ?? 499;  //# instance2_null_equals2: compile-time error
  return b.x;   //# instance2_return: compile-time error
  while (b.x) {};  //# instance2_while: compile-time error
  do {} while (b.x);  //# instance2_do_while: compile-time error
  for (var v in b.x) {}   //# instance2_for_in: compile-time error
  b.forInTest();
  b.x += 1;  //# instance2_plus_eq: compile-time error
  b.x.toString();  //# instance2_toString: compile-time error
  b.x?.toString();  //# instance2_null_dot: compile-time error
  b.x..toString();  //# instance2_cascade: compile-time error

  C c = new C();
  c.x = 32;   //# setter_assign: ok
  c.x;  //# instance3_stmt: ok
  true ? c.x : c.x;  //# instance3_conditional: ok
  for (c.x; false; c.x) {}   //# instance3_for: ok
  useAsVoid(c.x); //# instance3_argument_void: ok
  use(c.x);   //# instance3_argument: compile-time error
  use(c.x as Object);  //# instance3_as: ok
  void y3 = c.x;   //# instance3_void_init: ok
  dynamic z3 = c.x;  //# instance3_dynamic_init: compile-time error
  c.x is Object;   //# instance3_is: compile-time error
  throw c.x;   //# instance3_throw: compile-time error
  <void>[c.x];   //# instance3_literal_void_list_init: ok
  <Object>[c.x];   //# instance3_literal_list_init: compile-time error
  var m13 = <int, void>{4: c.x};   //# instance3_literal_map_value_init: ok
  var m23 = <void, int>{ c.x : 4};   //# instance3_literal_map_key_init: ok
  var m33 = <dynamic, dynamic>{4: c.x};  //# instance3_literal_map_value_init2: compile-time error
  var m43 = <dynamic, dynamic>{ c.x : 4};  //# instance3_literal_map_key_init2: compile-time error
  null ?? c.x;  //# instance3_null_equals1: ok
  c.x ?? 499;  //# instance3_null_equals2: compile-time error
  return c.x;   //# instance3_return: compile-time error
  while (c.x) {};  //# instance3_while: compile-time error
  do {} while (c.x);  //# instance3_do_while: compile-time error
  for (var v in c.x) {}   //# instance3_for_in: compile-time error
  c.forInTest();
  c.x += 1;  //# instance3_plus_eq: compile-time error
  c.x.toString();  //# instance3_toString: compile-time error
  c.x?.toString();  //# instance3_null_dot: compile-time error
  c.x..toString();  //# instance3_cascade: compile-time error
}

dynamic testInstanceFieldDynamic() {
  A<void> a = new A<void>();
  return a.x;   //# instance_return_dynamic: ok

  B b = new B();
  return b.x;   //# instance2_return_dynamic: ok

  C c = new C();
  return c.x;   //# instance3_return_dynamic: ok
}

Object testParenthesized() {
  void x;
  (x);  //# paren_stmt: ok
  true ? (x) : (x);  //# paren_conditional: ok
  for ((x); false; (x)) {}   //# paren_for: ok
  useAsVoid((x)); //# paren_argument_void: ok
  use((x));   //# paren_argument: compile-time error
  use((x) as Object);  //# paren_as: ok
  void y = (x);   //# paren_void_init: ok
  dynamic z = (x);  //# paren_dynamic_init: compile-time error
  (x) is Object;   //# paren_is: compile-time error
  throw (x);   //# paren_throw: compile-time error
  <void>[(x)];   //# paren_literal_void_list_init: ok
  <Object>[(x)];   //# paren_literal_list_init: compile-time error
  var m1 = <int, void>{4: (x) };   //# paren_literal_map_value_init: ok
  var m2 = <void, int>{ (x): 4};   //# paren_literal_map_key_init: ok
  var m3 = <dynamic, dynamic>{4: (x) };  //# paren_literal_map_value_init2: compile-time error
  var m4 = <dynamic, dynamic>{ (x): 4};  //# paren_literal_map_key_init2: compile-time error
  (x) ?? 499;  //# paren_null_equals1: compile-time error
  null ?? (x);  //# paren_null_equals2: ok
  return (x);   //# paren_return: compile-time error
  while ((x)) {};  //# paren_while: compile-time error
  do {} while ((x));  //# paren_do_while: compile-time error
  for (var v in (x)) {}   //# paren_for_in: compile-time error
  (x).toString();  //# paren_toString: compile-time error
  (x)?.toString();  //# paren_null_dot: compile-time error
  (x)..toString();  //# paren_cascade: compile-time error
   if ((x)) {}; //# paren_conditional_stmt: compile-time error
  !(x); //# paren_boolean_negation: compile-time error
  (x) && true; //# paren_boolean_and_left: compile-time error
  true && (x); //# paren_boolean_and_right: compile-time error
  (x) || true; //# paren_boolean_or_left: compile-time error
  true || (x); //# paren_boolean_or_right: compile-time error
  (x) == 3; //# paren_equals_left: compile-time error
  3 == (x); //# paren_equals_right: compile-time error
  identical(3, (x)); //# paren_identical: compile-time error
  3 + (x); //# paren_addition: compile-time error
  3 * (x); //# paren_multiplication: compile-time error
  -(x); //# paren_negation: compile-time error
  (x)(3); //# paren_use_as_function: compile-time error
  "hello${(x)}"; //# paren_use_in_string_interpolation: compile-time error
  (x) ??= 3; //# paren_use_in_conditional_assignment_left: compile-time error
  Object xx;  xx ??= (x); //# paren_use_in_conditional_assignment_right: compile-time error
  var ll = <int>[3]; ll[(x)]; //# paren_use_in_list_subscript: compile-time error
  var mm = <void, void>{}; mm[(x)]; //# paren_use_in_map_lookup: ok
}

dynamic testParenthesizedDynamic() {
  void x;
  return (x);   //# paren_return_dynamic: ok
}

void testReturnToVoid(void x, void f()) {
  void y;
  final void z = null;
  A<void> a = new A<void>();
  B b = new B();
  C c = new C();
  return x;   //# param_return_to_void: ok
  return f();   //# call_return_to_void: ok
  return y;   //# local_return_to_void: ok
  return z;   //# final_local_return_to_void: ok
  return global;   //# global_return_to_void: ok
  return true ? x : x;   //# conditional_return_to_void: ok
  return true ? 499 : x;   //# conditional2_return_to_void: ok
  return true ? x : 499;   //# conditional3_return_to_void: ok
  return a.x;   //# instance_return_to_void: ok
  return b.x;   //# instance2_return_to_void: ok
  return c.x;   //# instance3_return_to_void: ok
  return (x);   //# paren_return_to_void: ok
}

main() {
  try {
    testVoidParam(499);
    testVoidCall(() {});
    testVoidLocal();
    testVoidFinalLocal();
    testVoidConditional();
    testInstanceField();
    testParenthesized();
    testReturnToVoid(499, () {});
  } catch (e) {
    // Silently eat all dynamic errors.
    // This test is only testing static analysis.
  }
}
