// 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 = 2.9

// 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: compile-time error
}

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: compile-time error
}

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: compile-time error
}

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: compile-time error
}

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: compile-time error
}

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