dart-sdk/tests/language_2/void_type_override_test.dart
Erik Ernst 811ae1855d Adding adjusted void tests from CL 2699073003
These tests exercise the static and dynamic semantics of `void` used in
those new locations where 'generalized void' added support form it.

They came from CL 2699073003 and were adjusted to match the result of
discussions taken after their creation (in particular, `b ? e1 : e2`
was used and expected to be allowed, but it is now a static warning in
Dart 1.x and a compile-time error in Dart 2).

The tests are located in tests/language_2, and they are testing Dart 2
behavior. In particular, usage of a value of static type `void` is a
compile-time error rather than a static warning, and `void` is
considered equivalent to `Object` in subtype checks, both statically
and dynamically.

We do not currently have any tools which will conform to the
expectations of these tests. Status files have been adjested
accordingly.

R=floitsch@google.com

Review-Url: https://codereview.chromium.org/2997353002 .
2017-08-25 10:03:24 +02:00

123 lines
2.2 KiB
Dart

// 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 involving the void type and overriding.
import 'package:expect/expect.dart';
use<T>(T x) {}
class A<T> {
T x;
Object y;
int z;
T foo() => null;
void bar() {}
void gee(T x) {}
f(A<Object> a) {}
g(A<void> a) {}
h(A<T> a) {}
}
class B implements A<Object> {
void //# 00: compile-time error
/* //# 00: continued
var
*/ //# 00: continued
x;
void //# 00b: compile-time error
/* //# 00b: continued
var
*/ //# 00b: continued
y;
void //# 00c: compile-time error
/* //# 00c: continued
int
*/ //# 00c: continued
z;
// Overriding an Object function with a void function is an error.
void //# 01: compile-time error
foo() => null;
int bar() => 499;
void gee(void x) {}
f(A<void> a) {}
g(A<void> a) {}
h(A<void> a) {}
}
class C implements A<void> {
void x;
Object y;
int z;
void foo() {}
void bar() {}
void gee(void x) {
use(x); //# 03: compile-time error
}
f(covariant C c) {}
g(covariant C c) {}
h(covariant C c) {}
}
class D implements A<void> {
Object x; // Setter will become a voidness preservation violation.
Object y;
int z;
Object foo() => null;
void bar() {}
void gee(
Object // Will become a voidness preservation violation.
x) {}
f(A<Object> a) {}
g(
A<Object> // Will become a voidness preservation violation.
a) {}
h(
A<Object> // Will become a voidness preservation violation.
a) {}
}
void instantiateClasses() {
var a = new A<void>();
var b = new B();
var c = new C();
var d = new D();
a.foo();
b.foo();
c.foo();
d.foo();
a.bar();
b.bar();
c.bar();
d.bar();
a.gee(499);
b.gee(499);
c.gee(499);
d.gee(499);
}
void testAssignments() {
A<void> a1 = new A<Object>();
A<Object> a2 = new A<void>();
A a3 = new A<void>();
A<dynamic> a4 = new A<void>();
dynamic a5 = new A<void>();
}
main() {
instantiateClasses();
testAssignments();
}