blob: 135e8bd740478af6839f456673563fece35a058a [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) { }
testVoidParam(void x) {
x; //# param_stmt: ok
true ? x : x; //# param_conditional: compile-time error
for (x; false; x) {} //# param_for: ok
use(x); //# param_argument: compile-time error
use(x as Object); //# param_as: ok
void y = x; //# param_void_init: compile-time error
dynamic z = x; //# param_dynamic_init: compile-time error
x is Object; //# param_is: compile-time error
throw x; //# param_throw: compile-time error
[x]; //# param_literal_list_init: compile-time error
var m1 = {4: x}; //# param_literal_map_value_init: compile-time error
var m2 = {x : 4}; //# param_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: x}; //# param_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = {x : 4}; //# param_literal_map_key_init2: compile-time error
x ?? 499; //# param_null_equals2: compile-time error
null ?? x; //# param_null_equals2: compile-time error
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
}
testVoidCall(void f()) {
f(); //# call_stmt: ok
true ? f() : f(); //# call_conditional: compile-time error
for (f(); false; f()) {} //# call_for: ok
use(f()); //# call_argument: compile-time error
use(f() as Object); //# call_as: ok
void y = f(); //# call_void_init: compile-time error
dynamic z = f(); //# call_dynamic_init: compile-time error
f() is Object; //# call_is: compile-time error
throw f(); //# call_throw: compile-time error
[f()]; //# call_literal_list_init: compile-time error
var m1 = {4: f() }; //# call_literal_map_value_init: compile-time error
var m2 = { f(): 4}; //# call_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: f() }; //# call_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = { f(): 4}; //# call_literal_map_key_init2: compile-time error
f() ?? 499; //# call_null_equals2: compile-time error
null ?? f(); //# call_null_equals2: compile-time error
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
}
testVoidLocal() {
void x;
x = 42; //# local_assign: ok
x; //# local_stmt: ok
true ? x : x; //# local_conditional: compile-time error
for (x; false; x) {} //# local_for: ok
use(x); //# local_argument: compile-time error
use(x as Object); //# local_as: ok
void y = x; //# local_void_init: compile-time error
dynamic z = x; //# local_dynamic_init: compile-time error
x is Object; //# local_is: compile-time error
throw x; //# local_throw: compile-time error
[x]; //# local_literal_list_init: compile-time error
var m1 = {4: x}; //# local_literal_map_value_init: compile-time error
var m2 = {x : 4}; //# local_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: x}; //# local_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = {x : 4}; //# local_literal_map_key_init2: compile-time error
x ?? 499; //# local_null_equals2: compile-time error
null ?? x; //# local_null_equals2: compile-time error
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
}
testVoidFinalLocal() {
final void x = null;
x = 42; //# final_local_assign: compile-time error
x; //# final_local_stmt: ok
true ? x : x; //# final_local_conditional: compile-time error
for (x; false; x) {} //# final_local_for: ok
use(x); //# final_local_argument: compile-time error
use(x as Object); //# final_local_as: ok
void y = x; //# final_local_void_init: compile-time error
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
[x]; //# final_local_literal_list_init: compile-time error
var m1 = {4: x}; //# final_local_literal_map_value_init: compile-time error
var m2 = {x : 4}; //# final_local_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: x}; //# final_local_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = {x : 4}; //# final_local_literal_map_key_init2: compile-time error
x ?? 499; //# final_local_null_equals2: compile-time error
null ?? x; //# final_local_null_equals2: compile-time error
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
}
void global;
testVoidGlobal() {
global; //# global_stmt: ok
true ? global : global; //# global_conditional: compile-time error
for (global; false; global) {} //# global_for: ok
use(global); //# global_argument: compile-time error
use(global as Object); //# global_as: ok
void y = global; //# global_void_init: compile-time error
dynamic z = global; //# global_dynamic_init: compile-time error
global is Object; //# global_is: compile-time error
throw global; //# global_throw: compile-time error
[global]; //# global_literal_list_init: compile-time error
var m1 = {4: global }; //# global_literal_map_value_init: compile-time error
var m2 = { global: 4}; //# global_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: global }; //# global_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = { global: 4}; //# global_literal_map_key_init2: compile-time error
null ?? global; //# global_null_equals2: compile-time error
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
}
testVoidConditional() {
void x;
(true ? x : x); //# conditional_parens: compile-time error
true ? x : x; //# conditional_stmt: compile-time error
true ? true ? x : x : true ? x : x; //# conditional_conditional: compile-time error
for (true ? x : x; false; true ? x : x) {} //# conditional_for: compile-time error
use(true ? x : x); //# conditional_argument: compile-time error
void y = true ? x : x; //# conditional_void_init: compile-time error
dynamic z = true ? x : x; //# conditional_dynamic_init: compile-time error
throw true ? x : x; //# conditional_throw: compile-time error
[true ? x : x]; //# conditional_literal_list_init: compile-time error
var m1 = {4: true ? x : x}; //# conditional_literal_map_value_init: compile-time error
Map<dynamic, dynamic> m3 = {4: true ? x : x}; //# conditional_literal_map_value_init2: compile-time error
null ?? true ? x : x; //# conditional_null_equals2: compile-time error
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: compile-time error
true ? 499 : x; //# conditional2_stmt: compile-time error
true ? true ? 499 : x : true ? 499 : x; //# conditional2_conditional: compile-time error
for (true ? 499 : x; false; true ? 499 : x) {} //# conditional2_for: compile-time error
use(true ? 499 : x); //# conditional2_argument: compile-time error
void y2 = true ? 499 : x; //# conditional2_void_init: compile-time error
dynamic z2 = true ? 499 : x; //# conditional2_dynamic_init: compile-time error
throw true ? 499 : x; //# conditional2_throw: compile-time error
[true ? 499 : x]; //# conditional2_literal_list_init: compile-time error
var m12 = {4: true ? 499 : x}; //# conditional2_literal_map_value_init: compile-time error
Map<dynamic, dynamic> m32 = {4: true ? 499 : x}; //# conditional2_literal_map_value_init2: compile-time error
null ?? true ? 499 : x; //# conditional2_null_equals2: compile-time error
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: compile-time error
true ? x : 499; //# conditional3_stmt: compile-time error
true ? true ? x : 499 : true ? x : 499; //# conditional3_conditional: compile-time error
for (true ? x : 499; false; true ? x : 499) {} //# conditional3_for: compile-time error
use(true ? x : 499); //# conditional3_argument: compile-time error
void y3 = true ? x : 499; //# conditional3_void_init: compile-time error
dynamic z3 = true ? x : 499; //# conditional3_dynamic_init: compile-time error
throw true ? x : 499; //# conditional3_throw: compile-time error
[true ? x : 499]; //# conditional3_literal_list_init: compile-time error
var m13 = {4: true ? x : 499 }; //# conditional3_literal_map_value_init: compile-time error
Map<dynamic, dynamic> m33 = {4: true ? x : 499 }; //# conditional3_literal_map_value_init2: compile-time error
null ?? true ? x : 499; //# conditional3_null_equals2: compile-time error
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
}
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: compile-time error
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: compile-time error
for (x in [1, 2]) {} //# instance3_for_in3: ok
}
}
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: compile-time error
for (a.x; false; a.x) {} //# instance_for: ok
use(a.x); //# instance_argument: compile-time error
use(a.x as Object); //# instance_as: ok
void y = a.x; //# instance_void_init: compile-time error
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
[a.x]; //# instance_literal_list_init: compile-time error
var m1 = {4: a.x}; //# instance_literal_map_value_init: compile-time error
var m2 = { a.x : 4}; //# instance_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: a.x}; //# instance_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = { a.x : 4}; //# instance_literal_map_key_init2: compile-time error
null ?? a.x; //# instance_null_equals2: compile-time error
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: compile-time error
for (b.x; false; b.x) {} //# instance2_for: ok
use(b.x); //# instance2_argument: compile-time error
use(b.x as Object); //# instance2_as: ok
void y2 = b.x; //# instance2_void_init: compile-time error
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
[b.x]; //# instance2_literal_list_init: compile-time error
var m12 = {4: b.x}; //# instance2_literal_map_value_init: compile-time error
var m22 = { b.x : 4}; //# instance2_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m32 = {4: b.x}; //# instance2_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m42 = { b.x : 4}; //# instance2_literal_map_key_init2: compile-time error
null ?? b.x; //# instance2_null_equals2: compile-time error
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: compile-time error
for (c.x; false; c.x) {} //# instance3_for: ok
use(c.x); //# instance3_argument: compile-time error
use(c.x as Object); //# instance3_as: ok
void y3 = c.x; //# instance3_void_init: compile-time error
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
[c.x]; //# instance3_literal_list_init: compile-time error
var m13 = {4: c.x}; //# instance3_literal_map_value_init: compile-time error
var m23 = { c.x : 4}; //# instance3_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m33 = {4: c.x}; //# instance3_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m43 = { c.x : 4}; //# instance3_literal_map_key_init2: compile-time error
null ?? c.x; //# instance3_null_equals2: compile-time error
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
}
testParenthesized() {
void x;
(x); //# paren_stmt: ok
true ? (x) : (x); //# paren_conditional: compile-time error
for ((x); false; (x)) {} //# paren_for: ok
use((x)); //# paren_argument: compile-time error
use((x) as Object); //# paren_as: ok
void y = (x); //# paren_void_init: compile-time error
dynamic z = (x); //# paren_dynamic_init: compile-time error
(x) is Object; //# paren_is: compile-time error
throw (x); //# paren_throw: compile-time error
[(x)]; //# paren_literal_list_init: compile-time error
var m1 = {4: (x) }; //# paren_literal_map_value_init: compile-time error
var m2 = { (x): 4}; //# paren_literal_map_key_init: compile-time error
Map<dynamic, dynamic> m3 = {4: (x) }; //# paren_literal_map_value_init2: compile-time error
Map<dynamic, dynamic> m4 = { (x): 4}; //# paren_literal_map_key_init2: compile-time error
(x) ?? 499; //# paren_null_equals2: compile-time error
null ?? (x); //# paren_null_equals2: compile-time error
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
}
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: compile-time error
return true ? 499 : x; //# conditional2_return_to_void: compile-time error
return true ? x : 499; //# conditional3_return_to_void: compile-time error
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.
}
}