blob: a49a34a6b189c61ab2fd8049fca2089ffc22c0f3 [file] [log] [blame]
// 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: 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.
}
}