| // 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 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: ok |
| /* //# 00: continued |
| var |
| */ //# 00: continued |
| x; |
| |
| void //# 00b: ok |
| /* //# 00b: continued |
| var |
| */ //# 00b: continued |
| y; |
| |
| void //# 00c: compile-time error |
| /* //# 00c: continued |
| int |
| */ //# 00c: continued |
| z; |
| |
| void //# 01: ok |
| foo() {} |
| |
| 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); |
| } |
| |
| 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(); |
| } |