Chromium Code Reviews| Index: tests/language/void_type4_test.dart |
| diff --git a/tests/language/void_type4_test.dart b/tests/language/void_type4_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8d1c2ea525788d2467edfd4341b8dbccced4d95a |
| --- /dev/null |
| +++ b/tests/language/void_type4_test.dart |
| @@ -0,0 +1,120 @@ |
| +// 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. |
| + |
| +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> { |
| + var |
| + void /// 00: error |
|
Lasse Reichstein Nielsen
2017/02/21 09:37:04
That looks wrong. "var void x;" isn't valid syntax
floitsch
2017/02/22 14:44:43
Done.
|
| + x; |
| + |
| + var |
| + void /// 00b: error |
| + y; |
| + |
| + int |
| + void /// 00c: error |
| + z; |
| + |
| + void /// 01: error |
| + foo() => null; |
|
Lasse Reichstein Nielsen
2017/02/21 09:37:04
Say what the problem here is.
It's overriding an O
floitsch
2017/02/22 14:44:43
Done.
|
| + |
| + int bar() => 499; |
| + void gee( |
| + void /// 02: error |
|
Lasse Reichstein Nielsen
2017/02/21 09:37:04
I don't think this should be an error.
It's overr
floitsch
2017/02/22 14:44:43
right.
done.
|
| + 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: error |
| + } |
| + |
| + f(C c) {} |
| + g(C c) {} |
| + h(C c) {} |
| +} |
| + |
| +class D implements A<void> { |
| + Object x; /// 04: ok? should be ok, but the setter goes from void to Object. |
|
Lasse Reichstein Nielsen
2017/02/21 09:37:04
The getter is fine, but the setter isn't. This is
eernst
2017/02/21 13:39:12
We have the following overriding relationship:
A
|
| + Object y; |
| + int z; |
| + |
| + Object foo() => null; |
| + void bar() {} |
| + void gee( |
| + Object /// 05: error |
|
Lasse Reichstein Nielsen
2017/02/21 09:37:04
This is effectively the same signature as the sett
eernst
2017/02/21 13:39:13
Same issue: If we use Dart 1 overriding rules then
|
| + x) {} |
| + |
| + f(A<Object> a) {} |
| + g( |
| + A<Object> /// 06: error |
| + a) {} |
| + h( |
| + A<Object> /// 07: error |
| + 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> /// implicit_downcast: error |
| + (); |
|
eernst
2017/02/21 13:39:13
Yes, I think we should let the special treatment o
|
| + A a3 = new A<void>(); /// raw_assignment: ok? |
|
eernst
2017/02/21 13:39:13
In Dart 1 the type annotation `A` is definitely `A
|
| + A<dynamic> a4 = new A<void>(); /// dynamic_assignment: ok? |
|
Lasse Reichstein Nielsen
2017/02/21 09:37:04
So, basically, the question is whether dynamic is
eernst
2017/02/21 13:39:13
Agreed, I'd want to make this an error, but the re
floitsch
2017/02/22 14:44:43
What about `dynamic a5 = new A<void>()` then?
Adde
Lasse Reichstein Nielsen
2017/06/02 11:14:23
I want to say "allowed".
Here you are not casting
|
| +} |
| + |
| +main() { |
| + instantiateClasses(); |
| + testAssignments(); |
| +} |