| // 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. |
| |
| /*@testedFeatures=inference*/ |
| library test; |
| |
| class A<S, T> { |
| S x; |
| T y; |
| A(this.x, this.y); |
| A.named(this.x, this.y); |
| } |
| |
| class B<S, T> extends A<T, S> { |
| B(S y, T x) : super(x, y); |
| B.named(S y, T x) : super.named(x, y); |
| } |
| |
| class C<S> extends B<S, S> { |
| C(S a) : super(a, a); |
| C.named(S a) : super.named(a, a); |
| } |
| |
| class D<S, T> extends B<T, int> { |
| D(T a) : super(a, 3); |
| D.named(T a) : super.named(a, 3); |
| } |
| |
| class E<S, T> extends A<C<S>, T> { |
| E(T a) : super(throw '', a); |
| } |
| |
| class F<S, T> extends A<S, T> { |
| F(S x, T y, {required List<S> a, required List<T> b}) : super(x, y); |
| F.named(S x, T y, [S? a, T? b]) : super(x, y); |
| } |
| |
| void test() { |
| { |
| A<int, String> a0 = new /*@typeArgs=int, String*/ A(3, "hello"); |
| A<int, String> a1 = new /*@typeArgs=int, String*/ A.named(3, "hello"); |
| A<int, String> a2 = new A<int, String>(3, "hello"); |
| A<int, String> a3 = new A<int, String>.named(3, "hello"); |
| A<int, String> |
| a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, "hello"); |
| A<int, String> |
| a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named( |
| 3, "hello"); |
| } |
| { |
| A<int, String> a0 = new /*@typeArgs=int, String*/ A( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello", |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3); |
| A<int, String> a1 = new /*@typeArgs=int, String*/ A.named( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello", |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3); |
| } |
| { |
| A<int, String> a0 = new /*@typeArgs=String, int*/ B("hello", 3); |
| A<int, String> a1 = new /*@typeArgs=String, int*/ B.named("hello", 3); |
| A<int, String> a2 = new B<String, int>("hello", 3); |
| A<int, String> a3 = new B<String, int>.named("hello", 3); |
| A<int, String> |
| a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>("hello", 3); |
| A<int, String> |
| a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named( |
| "hello", 3); |
| } |
| { |
| A<int, String> a0 = new /*@typeArgs=String, int*/ B( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3, |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello"); |
| A<int, String> a1 = new /*@typeArgs=String, int*/ B.named( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3, |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello"); |
| } |
| { |
| A<int, int> a0 = new /*@typeArgs=int*/ C(3); |
| A<int, int> a1 = new /*@typeArgs=int*/ C.named(3); |
| A<int, int> a2 = new C<int>(3); |
| A<int, int> a3 = new C<int>.named(3); |
| A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3); |
| A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3); |
| } |
| { |
| A<int, int> a0 = |
| new /*@typeArgs=int*/ C(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello"); |
| A<int, int> a1 = new /*@typeArgs=int*/ C.named( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello"); |
| } |
| { |
| A<int, String> a0 = new /*@typeArgs=dynamic, String*/ D("hello"); |
| A<int, String> a1 = new /*@typeArgs=dynamic, String*/ D.named("hello"); |
| A<int, String> a2 = new D<int, String>("hello"); |
| A<int, String> a3 = new D<String, String>.named("hello"); |
| A<int, String> |
| a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>("hello"); |
| A<int, String> |
| a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named( |
| "hello"); |
| } |
| { |
| A<int, String> a0 = new /*@typeArgs=dynamic, String*/ D( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3); |
| A<int, String> a1 = new /*@typeArgs=dynamic, String*/ D.named( |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3); |
| } |
| { |
| A<C<int>, String> a0 = new /*@typeArgs=int, String*/ E("hello"); |
| } |
| { |
| // Check named and optional arguments |
| A<int, String> a0 = new /*@typeArgs=int, String*/ F(3, "hello", |
| a: /*@typeArgs=int*/ [3], b: /*@typeArgs=String*/ ["hello"]); |
| A<int, String> a1 = new /*@typeArgs=int, String*/ F(3, "hello", |
| a: /*@typeArgs=int*/ [ |
| /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello" |
| ], |
| b: /*@typeArgs=String*/ [ |
| /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3 |
| ]); |
| A<int, String> a2 = |
| new /*@typeArgs=int, String*/ F.named(3, "hello", 3, "hello"); |
| A<int, String> a3 = new /*@typeArgs=int, String*/ F.named(3, "hello"); |
| A<int, String> a4 = new /*@typeArgs=int, String*/ F.named( |
| 3, |
| "hello", |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello", |
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3); |
| A<int, String> a5 = new /*@typeArgs=int, String*/ F.named( |
| 3, "hello", /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello"); |
| } |
| } |
| |
| main() {} |