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