| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// General type checking tests | 5 /// General type checking tests |
| 6 library dev_compiler.test.checker_test; | 6 library dev_compiler.test.checker_test; |
| 7 | 7 |
| 8 import 'package:unittest/unittest.dart'; | 8 import 'package:unittest/unittest.dart'; |
| 9 | 9 |
| 10 import 'package:dev_compiler/src/testing.dart'; | 10 import 'package:dev_compiler/src/testing.dart'; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 void baz1(y) => x + y; | 23 void baz1(y) => x + y; |
| 24 static baz2(y) => y + y; | 24 static baz2(y) => y + y; |
| 25 } | 25 } |
| 26 | 26 |
| 27 void foo(String str) { | 27 void foo(String str) { |
| 28 print(str); | 28 print(str); |
| 29 } | 29 } |
| 30 | 30 |
| 31 void bar(a) { | 31 void bar(a) { |
| 32 foo(/*info:DownCast,warning:DynamicInvoke*/a.x); | 32 foo(/*info:DynamicCast,warning:DynamicInvoke*/a.x); |
| 33 } | 33 } |
| 34 | 34 |
| 35 typedef DynFun(x); | 35 typedef DynFun(x); |
| 36 typedef StrFun(String x); | 36 typedef StrFun(String x); |
| 37 | 37 |
| 38 var bar1 = bar; | 38 var bar1 = bar; |
| 39 | 39 |
| 40 void main() { | 40 void main() { |
| 41 var a = new A(); | 41 var a = new A(); |
| 42 bar(a); | 42 bar(a); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 void bar(int w, {int x = /*severe:StaticTypeError*/null, int /*severe:In
validVariableDeclaration*/y, int z: 0}) { | 85 void bar(int w, {int x = /*severe:StaticTypeError*/null, int /*severe:In
validVariableDeclaration*/y, int z: 0}) { |
| 86 } | 86 } |
| 87 | 87 |
| 88 void main() { | 88 void main() { |
| 89 int /*severe:InvalidVariableDeclaration*/x; | 89 int /*severe:InvalidVariableDeclaration*/x; |
| 90 double /*severe:InvalidVariableDeclaration*/y; | 90 double /*severe:InvalidVariableDeclaration*/y; |
| 91 num z; | 91 num z; |
| 92 bool b; | 92 bool b; |
| 93 | 93 |
| 94 // int is non-nullable | 94 // int is non-nullable |
| 95 // TODO(vsm): This should be an error, not a warning. | 95 x = /*severe:StaticTypeError*/null; |
| 96 x = /*warning:DownCastLiteral*/null; | |
| 97 x = 42; | 96 x = 42; |
| 98 x = /*info:DownCast*/z; | 97 x = /*warning:DownCastImplicit*/z; |
| 99 | 98 |
| 100 // double is non-nullable | 99 // double is non-nullable |
| 101 // TODO(vsm): This should be an error, not a warning. | 100 y = /*severe:StaticTypeError*/null; |
| 102 y = /*warning:DownCastLiteral*/null; | |
| 103 y = /*severe:StaticTypeError*/42; | 101 y = /*severe:StaticTypeError*/42; |
| 104 y = 42.0; | 102 y = 42.0; |
| 105 y = /*info:DownCast*/z; | 103 y = /*warning:DownCastImplicit*/z; |
| 106 | 104 |
| 107 // num is nullable | 105 // num is nullable |
| 108 z = null; | 106 z = null; |
| 109 z = x; | 107 z = x; |
| 110 z = y; | 108 z = y; |
| 111 | 109 |
| 112 // bool is nullable | 110 // bool is nullable |
| 113 b = null; | 111 b = null; |
| 114 b = true; | 112 b = true; |
| 115 } | 113 } |
| 116 ''' | 114 ''' |
| 117 }, nonnullableTypes: <String>['int', 'double']); | 115 }, nonnullableTypes: <String>['int', 'double']); |
| 118 }); | 116 }); |
| 119 | 117 |
| 120 test('Primitives and generics', () { | 118 test('Primitives and generics', () { |
| 121 testChecker({ | 119 testChecker({ |
| 122 '/main.dart': ''' | 120 '/main.dart': ''' |
| 123 class A<T> { | 121 class A<T> { |
| 124 // TODO(vsm): This needs a static info indicating a runtime | 122 // TODO(vsm): This needs a static info indicating a runtime |
| 125 // check at construction. | 123 // check at construction. |
| 126 T x; | 124 T x; |
| 127 | 125 |
| 128 // TODO(vsm): Should this be a different type of DownCast? | 126 // TODO(vsm): Should this be a different type of DownCast? |
| 129 T foo() => /*warning:DownCastLiteral*/null; | 127 T foo() => /*warning:DownCastImplicit*/null; |
| 130 | 128 |
| 131 void bar() { | 129 void bar() { |
| 132 int /*severe:InvalidVariableDeclaration*/x; | 130 int /*severe:InvalidVariableDeclaration*/x; |
| 133 num y; | 131 num y; |
| 134 // TODO(vsm): This should be a runtime check: | 132 // TODO(vsm): This should be a runtime check: |
| 135 // Transformed to: T z = cast(null, T) | 133 // Transformed to: T z = cast(null, T) |
| 136 T /*severe:InvalidVariableDeclaration*/z; | 134 T /*severe:InvalidVariableDeclaration*/z; |
| 137 } | 135 } |
| 138 | 136 |
| 139 void baz(T x, [T /*severe:InvalidVariableDeclaration*/y, T z = /*sever
e:StaticTypeError*/null]) { | 137 void baz(T x, [T /*severe:InvalidVariableDeclaration*/y, T z = /*sever
e:StaticTypeError*/null]) { |
| 140 } | 138 } |
| 141 } | 139 } |
| 142 | 140 |
| 143 class B<T extends List> { | 141 class B<T extends List> { |
| 144 T x; | 142 T x; |
| 145 | 143 |
| 146 // T cannot be primitive. | 144 // T cannot be primitive. |
| 147 T foo() => null; | 145 T foo() => null; |
| 148 } | 146 } |
| 149 | 147 |
| 150 class C<T extends num> { | 148 class C<T extends num> { |
| 151 // TODO(vsm): This needs a static info indicating a runtime | 149 // TODO(vsm): This needs a static info indicating a runtime |
| 152 // check at construction. | 150 // check at construction. |
| 153 T x; | 151 T x; |
| 154 | 152 |
| 155 // TODO(vsm): Should this be a different type of DownCast? | 153 // TODO(vsm): Should this be a different type of DownCast? |
| 156 T foo() => /*warning:DownCastLiteral*/null; | 154 T foo() => /*warning:DownCastImplicit*/null; |
| 157 } | 155 } |
| 158 ''' | 156 ''' |
| 159 }, nonnullableTypes: <String>['int', 'double']); | 157 }, nonnullableTypes: <String>['int', 'double']); |
| 160 }); | 158 }); |
| 161 | 159 |
| 162 test('Constructors', () { | 160 test('Constructors', () { |
| 163 testChecker({ | 161 testChecker({ |
| 164 '/main.dart': ''' | 162 '/main.dart': ''' |
| 165 const num z = 25; | 163 const num z = 25; |
| 166 Object obj = "world"; | 164 Object obj = "world"; |
| 167 | 165 |
| 168 class A { | 166 class A { |
| 169 int x; | 167 int x; |
| 170 String y; | 168 String y; |
| 171 | 169 |
| 172 A(this.x) : this.y = /*severe:StaticTypeError*/42; | 170 A(this.x) : this.y = /*severe:StaticTypeError*/42; |
| 173 | 171 |
| 174 A.c1(p): this.x = /*info:DownCast*/z, this.y = /*info:DownCast*/p; | 172 A.c1(p): this.x = /*warning:DownCastImplicit*/z, this.y = /*info:Dynamic
Cast*/p; |
| 175 | 173 |
| 176 A.c2(this.x, this.y); | 174 A.c2(this.x, this.y); |
| 177 | 175 |
| 178 A.c3(/*severe:InvalidParameterDeclaration*/num this.x, String this.y); | 176 A.c3(/*severe:InvalidParameterDeclaration*/num this.x, String this.y); |
| 179 } | 177 } |
| 180 | 178 |
| 181 class B extends A { | 179 class B extends A { |
| 182 B() : super(/*severe:StaticTypeError*/"hello"); | 180 B() : super(/*severe:StaticTypeError*/"hello"); |
| 183 | 181 |
| 184 B.c2(int x, String y) : super.c2(/*severe:StaticTypeError*/y, | 182 B.c2(int x, String y) : super.c2(/*severe:StaticTypeError*/y, |
| 185 /*severe:StaticTypeError*/x); | 183 /*severe:StaticTypeError*/x); |
| 186 | 184 |
| 187 B.c3(num x, Object y) : super.c3(x, /*info:DownCast*/y); | 185 B.c3(num x, Object y) : super.c3(x, /*warning:DownCastImplicit*/y); |
| 188 } | 186 } |
| 189 | 187 |
| 190 void main() { | 188 void main() { |
| 191 A a = new A.c2(/*info:DownCast*/z, /*severe:StaticTypeError*/z); | 189 A a = new A.c2(/*warning:DownCastImplicit*/z, /*severe:StaticTypeError*
/z); |
| 192 var b = new B.c2(/*severe:StaticTypeError*/"hello", /*info:DownCast*/ob
j); | 190 var b = new B.c2(/*severe:StaticTypeError*/"hello", /*warning:DownCastI
mplicit*/obj); |
| 193 } | 191 } |
| 194 ''' | 192 ''' |
| 195 }); | 193 }); |
| 196 }); | 194 }); |
| 197 | 195 |
| 198 test('Unbound variable', () { | 196 test('Unbound variable', () { |
| 199 testChecker({ | 197 testChecker({ |
| 200 '/main.dart': ''' | 198 '/main.dart': ''' |
| 201 void main() { | 199 void main() { |
| 202 dynamic y = /*pass should be severe:StaticTypeError*/unboundVariable; | 200 dynamic y = /*pass should be severe:StaticTypeError*/unboundVariable; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 | 248 |
| 251 void main() { | 249 void main() { |
| 252 dynamic y; | 250 dynamic y; |
| 253 Object o; | 251 Object o; |
| 254 int i = 0; | 252 int i = 0; |
| 255 double d = 0.0; | 253 double d = 0.0; |
| 256 num n; | 254 num n; |
| 257 A a; | 255 A a; |
| 258 B b; | 256 B b; |
| 259 o = y; | 257 o = y; |
| 260 i = /*info:DownCast*/y; | 258 i = /*info:DynamicCast*/y; |
| 261 d = /*info:DownCast*/y; | 259 d = /*info:DynamicCast*/y; |
| 262 n = /*info:DownCast*/y; | 260 n = /*info:DynamicCast*/y; |
| 263 a = /*info:DownCast*/y; | 261 a = /*info:DynamicCast*/y; |
| 264 b = /*info:DownCast*/y; | 262 b = /*info:DynamicCast*/y; |
| 265 } | 263 } |
| 266 ''' | 264 ''' |
| 267 }); | 265 }); |
| 268 }); | 266 }); |
| 269 | 267 |
| 270 test('Ground type subtyping: assigning a class', () { | 268 test('Ground type subtyping: assigning a class', () { |
| 271 testChecker({ | 269 testChecker({ |
| 272 '/main.dart': ''' | 270 '/main.dart': ''' |
| 273 | 271 |
| 274 class A {} | 272 class A {} |
| 275 class B extends A {} | 273 class B extends A {} |
| 276 | 274 |
| 277 void main() { | 275 void main() { |
| 278 dynamic y; | 276 dynamic y; |
| 279 Object o; | 277 Object o; |
| 280 int i = 0; | 278 int i = 0; |
| 281 double d = 0.0; | 279 double d = 0.0; |
| 282 num n; | 280 num n; |
| 283 A a; | 281 A a; |
| 284 B b; | 282 B b; |
| 285 y = a; | 283 y = a; |
| 286 o = a; | 284 o = a; |
| 287 i = /*severe:StaticTypeError*/a; | 285 i = /*severe:StaticTypeError*/a; |
| 288 d = /*severe:StaticTypeError*/a; | 286 d = /*severe:StaticTypeError*/a; |
| 289 n = /*severe:StaticTypeError*/a; | 287 n = /*severe:StaticTypeError*/a; |
| 290 a = a; | 288 a = a; |
| 291 b = /*info:DownCast*/a; | 289 b = /*warning:DownCastImplicit*/a; |
| 292 } | 290 } |
| 293 ''' | 291 ''' |
| 294 }); | 292 }); |
| 295 }); | 293 }); |
| 296 | 294 |
| 297 test('Ground type subtyping: assigning a subclass', () { | 295 test('Ground type subtyping: assigning a subclass', () { |
| 298 testChecker({ | 296 testChecker({ |
| 299 '/main.dart': ''' | 297 '/main.dart': ''' |
| 300 | 298 |
| 301 class A {} | 299 class A {} |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 B left; | 336 B left; |
| 339 C right; | 337 C right; |
| 340 D bot; | 338 D bot; |
| 341 { | 339 { |
| 342 top = top; | 340 top = top; |
| 343 top = left; | 341 top = left; |
| 344 top = right; | 342 top = right; |
| 345 top = bot; | 343 top = bot; |
| 346 } | 344 } |
| 347 { | 345 { |
| 348 left = /*info:DownCast*/top; | 346 left = /*warning:DownCastImplicit*/top; |
| 349 left = left; | 347 left = left; |
| 350 left = /*severe:StaticTypeError*/right; | 348 left = /*severe:StaticTypeError*/right; |
| 351 left = bot; | 349 left = bot; |
| 352 } | 350 } |
| 353 { | 351 { |
| 354 right = /*info:DownCast*/top; | 352 right = /*warning:DownCastImplicit*/top; |
| 355 right = /*severe:StaticTypeError*/left; | 353 right = /*severe:StaticTypeError*/left; |
| 356 right = right; | 354 right = right; |
| 357 right = bot; | 355 right = bot; |
| 358 } | 356 } |
| 359 { | 357 { |
| 360 bot = /*info:DownCast*/top; | 358 bot = /*warning:DownCastImplicit*/top; |
| 361 bot = /*info:DownCast*/left; | 359 bot = /*warning:DownCastImplicit*/left; |
| 362 bot = /*info:DownCast*/right; | 360 bot = /*warning:DownCastImplicit*/right; |
| 363 bot = bot; | 361 bot = bot; |
| 364 } | 362 } |
| 365 } | 363 } |
| 366 ''' | 364 ''' |
| 367 }); | 365 }); |
| 368 }); | 366 }); |
| 369 | 367 |
| 370 test('Function typing and subtyping: int and object', () { | 368 test('Function typing and subtyping: int and object', () { |
| 371 testChecker({ | 369 testChecker({ |
| 372 '/main.dart': ''' | 370 '/main.dart': ''' |
| 373 | 371 |
| 374 typedef Object Top(int x); // Top of the lattice | 372 typedef Object Top(int x); // Top of the lattice |
| 375 typedef int Left(int x); // Left branch | 373 typedef int Left(int x); // Left branch |
| 376 typedef int Left2(int x); // Left branch | 374 typedef int Left2(int x); // Left branch |
| 377 typedef Object Right(Object x); // Right branch | 375 typedef Object Right(Object x); // Right branch |
| 378 typedef int Bot(Object x); // Bottom of the lattice | 376 typedef int Bot(Object x); // Bottom of the lattice |
| 379 | 377 |
| 380 Object top(int x) => x; | 378 Object top(int x) => x; |
| 381 int left(int x) => x; | 379 int left(int x) => x; |
| 382 Object right(Object x) => x; | 380 Object right(Object x) => x; |
| 383 int _bot(Object x) => /*info:DownCast*/x; | 381 int _bot(Object x) => /*warning:DownCastImplicit*/x; |
| 384 int bot(Object x) => x as int; | 382 int bot(Object x) => x as int; |
| 385 | 383 |
| 386 void main() { | 384 void main() { |
| 387 { // Check typedef equality | 385 { // Check typedef equality |
| 388 Left f = left; | 386 Left f = left; |
| 389 Left2 g = f; | 387 Left2 g = f; |
| 390 } | 388 } |
| 391 // TODO(leafp) Decide on ClosureWrap vs DownCast (or error). | 389 // TODO(leafp) Decide on ClosureWrap vs DownCast (or error). |
| 392 { | 390 { |
| 393 Top f; | 391 Top f; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 class A {} | 427 class A {} |
| 430 class B extends A {} | 428 class B extends A {} |
| 431 | 429 |
| 432 typedef A Top(B x); // Top of the lattice | 430 typedef A Top(B x); // Top of the lattice |
| 433 typedef B Left(B x); // Left branch | 431 typedef B Left(B x); // Left branch |
| 434 typedef B Left2(B x); // Left branch | 432 typedef B Left2(B x); // Left branch |
| 435 typedef A Right(A x); // Right branch | 433 typedef A Right(A x); // Right branch |
| 436 typedef B Bot(A x); // Bottom of the lattice | 434 typedef B Bot(A x); // Bottom of the lattice |
| 437 | 435 |
| 438 B left(B x) => x; | 436 B left(B x) => x; |
| 439 B _bot(A x) => /*info:DownCast*/x; | 437 B _bot(A x) => /*warning:DownCastImplicit*/x; |
| 440 B bot(A x) => x as B; | 438 B bot(A x) => x as B; |
| 441 A top(B x) => x; | 439 A top(B x) => x; |
| 442 A right(A x) => x; | 440 A right(A x) => x; |
| 443 | 441 |
| 444 void main() { | 442 void main() { |
| 445 { // Check typedef equality | 443 { // Check typedef equality |
| 446 Left f = left; | 444 Left f = left; |
| 447 Left2 g = f; | 445 Left2 g = f; |
| 448 } | 446 } |
| 449 { | 447 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 class A {} | 484 class A {} |
| 487 | 485 |
| 488 typedef dynamic Top(dynamic x); // Top of the lattice | 486 typedef dynamic Top(dynamic x); // Top of the lattice |
| 489 typedef dynamic Left(A x); // Left branch | 487 typedef dynamic Left(A x); // Left branch |
| 490 typedef A Right(dynamic x); // Right branch | 488 typedef A Right(dynamic x); // Right branch |
| 491 typedef A Bottom(A x); // Bottom of the lattice | 489 typedef A Bottom(A x); // Bottom of the lattice |
| 492 | 490 |
| 493 dynamic left(A x) => x; | 491 dynamic left(A x) => x; |
| 494 A bot(A x) => x; | 492 A bot(A x) => x; |
| 495 dynamic top(dynamic x) => x; | 493 dynamic top(dynamic x) => x; |
| 496 A right(dynamic x) => /*info:DownCast*/x; | 494 A right(dynamic x) => /*info:DynamicCast*/x; |
| 497 | 495 |
| 498 void main() { | 496 void main() { |
| 499 { | 497 { |
| 500 Top f; | 498 Top f; |
| 501 f = top; | 499 f = top; |
| 502 f = left; | 500 f = left; |
| 503 f = right; | 501 f = right; |
| 504 f = bot; | 502 f = bot; |
| 505 } | 503 } |
| 506 { | 504 { |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 } | 857 } |
| 860 int i2i(int x) => x; | 858 int i2i(int x) => x; |
| 861 num n2n(num x) => x; | 859 num n2n(num x) => x; |
| 862 void main() { | 860 void main() { |
| 863 { | 861 { |
| 864 I2I f; | 862 I2I f; |
| 865 f = new A(); | 863 f = new A(); |
| 866 f = /*severe:StaticTypeError*/new B(); | 864 f = /*severe:StaticTypeError*/new B(); |
| 867 f = i2i; | 865 f = i2i; |
| 868 f = /*warning:ClosureWrap*/n2n; | 866 f = /*warning:ClosureWrap*/n2n; |
| 869 f = /*warning:DownCast*/(i2i as Object); | 867 f = /*warning:DownCastComposite*/(i2i as Object); |
| 870 f = /*warning:DownCast*/(n2n as Function); | 868 f = /*warning:DownCastComposite*/(n2n as Function); |
| 871 } | 869 } |
| 872 { | 870 { |
| 873 N2N f; | 871 N2N f; |
| 874 f = /*severe:StaticTypeError*/new A(); | 872 f = /*severe:StaticTypeError*/new A(); |
| 875 f = new B(); | 873 f = new B(); |
| 876 f = /*warning:ClosureWrap*/i2i; | 874 f = /*warning:ClosureWrap*/i2i; |
| 877 f = n2n; | 875 f = n2n; |
| 878 f = /*warning:DownCast*/(i2i as Object); | 876 f = /*warning:DownCastComposite*/(i2i as Object); |
| 879 f = /*warning:DownCast*/(n2n as Function); | 877 f = /*warning:DownCastComposite*/(n2n as Function); |
| 880 } | 878 } |
| 881 { | 879 { |
| 882 A f; | 880 A f; |
| 883 f = new A(); | 881 f = new A(); |
| 884 f = /*severe:StaticTypeError*/new B(); | 882 f = /*severe:StaticTypeError*/new B(); |
| 885 f = /*severe:StaticTypeError*/i2i; | 883 f = /*severe:StaticTypeError*/i2i; |
| 886 f = /*severe:StaticTypeError*/n2n; | 884 f = /*severe:StaticTypeError*/n2n; |
| 887 f = /*info:DownCast*/(i2i as Object); | 885 f = /*warning:DownCastImplicit*/(i2i as Object); |
| 888 f = /*info:DownCast*/(n2n as Function); | 886 f = /*warning:DownCastImplicit*/(n2n as Function); |
| 889 } | 887 } |
| 890 { | 888 { |
| 891 B f; | 889 B f; |
| 892 f = /*severe:StaticTypeError*/new A(); | 890 f = /*severe:StaticTypeError*/new A(); |
| 893 f = new B(); | 891 f = new B(); |
| 894 f = /*severe:StaticTypeError*/i2i; | 892 f = /*severe:StaticTypeError*/i2i; |
| 895 f = /*severe:StaticTypeError*/n2n; | 893 f = /*severe:StaticTypeError*/n2n; |
| 896 f = /*info:DownCast*/(i2i as Object); | 894 f = /*warning:DownCastImplicit*/(i2i as Object); |
| 897 f = /*info:DownCast*/(n2n as Function); | 895 f = /*warning:DownCastImplicit*/(n2n as Function); |
| 898 } | 896 } |
| 899 { | 897 { |
| 900 Function f; | 898 Function f; |
| 901 f = new A(); | 899 f = new A(); |
| 902 f = new B(); | 900 f = new B(); |
| 903 f = i2i; | 901 f = i2i; |
| 904 f = n2n; | 902 f = n2n; |
| 905 f = /*info:DownCast*/(i2i as Object); | 903 f = /*warning:DownCastImplicit*/(i2i as Object); |
| 906 f = (n2n as Function); | 904 f = (n2n as Function); |
| 907 } | 905 } |
| 908 } | 906 } |
| 909 ''' | 907 ''' |
| 910 }); | 908 }); |
| 911 }); | 909 }); |
| 912 | 910 |
| 913 test('Function typing and subtyping: void', () { | 911 test('Function typing and subtyping: void', () { |
| 914 testChecker({ | 912 testChecker({ |
| 915 '/main.dart': ''' | 913 '/main.dart': ''' |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 997 | 995 |
| 998 // M<S> <: L<S> | 996 // M<S> <: L<S> |
| 999 lOfCs = /*severe:StaticTypeError*/mOfAs; | 997 lOfCs = /*severe:StaticTypeError*/mOfAs; |
| 1000 lOfCs = /*severe:StaticTypeError*/mOfBs; | 998 lOfCs = /*severe:StaticTypeError*/mOfBs; |
| 1001 lOfCs = mOfCs; | 999 lOfCs = mOfCs; |
| 1002 | 1000 |
| 1003 // N </: L<C> | 1001 // N </: L<C> |
| 1004 lOfCs = /*severe:StaticTypeError*/ns; | 1002 lOfCs = /*severe:StaticTypeError*/ns; |
| 1005 | 1003 |
| 1006 // M<T> <: L<S> iff S = dynamic or S=T | 1004 // M<T> <: L<S> iff S = dynamic or S=T |
| 1007 mOfAs = /*info:DownCast*/lOfAs; | 1005 mOfAs = /*warning:DownCastComposite*/lOfAs; |
| 1008 mOfAs = /*severe:StaticTypeError*/lOfBs; | 1006 mOfAs = /*severe:StaticTypeError*/lOfBs; |
| 1009 mOfAs = /*severe:StaticTypeError*/lOfCs; | 1007 mOfAs = /*severe:StaticTypeError*/lOfCs; |
| 1010 | 1008 |
| 1011 // M<S> <: M<S> iff S = dynamic or S=T | 1009 // M<S> <: M<S> iff S = dynamic or S=T |
| 1012 mOfAs = mOfAs; | 1010 mOfAs = mOfAs; |
| 1013 mOfAs = /*severe:StaticTypeError*/mOfBs; | 1011 mOfAs = /*severe:StaticTypeError*/mOfBs; |
| 1014 mOfAs = /*severe:StaticTypeError*/mOfCs; | 1012 mOfAs = /*severe:StaticTypeError*/mOfCs; |
| 1015 | 1013 |
| 1016 // N <: M<A> | 1014 // N <: M<A> |
| 1017 mOfAs = ns; | 1015 mOfAs = ns; |
| 1018 | 1016 |
| 1019 // M<T> <: L<S> iff S = dynamic or S=T | 1017 // M<T> <: L<S> iff S = dynamic or S=T |
| 1020 mOfBs = /*severe:StaticTypeError*/lOfAs; | 1018 mOfBs = /*severe:StaticTypeError*/lOfAs; |
| 1021 mOfBs = /*info:DownCast*/lOfBs; | 1019 mOfBs = /*warning:DownCastComposite*/lOfBs; |
| 1022 mOfBs = /*severe:StaticTypeError*/lOfCs; | 1020 mOfBs = /*severe:StaticTypeError*/lOfCs; |
| 1023 | 1021 |
| 1024 // M<S> <: M<S> iff S = dynamic or S=T | 1022 // M<S> <: M<S> iff S = dynamic or S=T |
| 1025 mOfBs = /*severe:StaticTypeError*/mOfAs; | 1023 mOfBs = /*severe:StaticTypeError*/mOfAs; |
| 1026 mOfBs = mOfBs; | 1024 mOfBs = mOfBs; |
| 1027 mOfBs = /*severe:StaticTypeError*/mOfCs; | 1025 mOfBs = /*severe:StaticTypeError*/mOfCs; |
| 1028 | 1026 |
| 1029 // N </: M<B> | 1027 // N </: M<B> |
| 1030 mOfBs = /*severe:StaticTypeError*/ns; | 1028 mOfBs = /*severe:StaticTypeError*/ns; |
| 1031 | 1029 |
| 1032 // M<T> <: L<S> iff S = dynamic or S=T | 1030 // M<T> <: L<S> iff S = dynamic or S=T |
| 1033 mOfCs = /*severe:StaticTypeError*/lOfAs; | 1031 mOfCs = /*severe:StaticTypeError*/lOfAs; |
| 1034 mOfCs = /*severe:StaticTypeError*/lOfBs; | 1032 mOfCs = /*severe:StaticTypeError*/lOfBs; |
| 1035 mOfCs = /*info:DownCast*/lOfCs; | 1033 mOfCs = /*warning:DownCastComposite*/lOfCs; |
| 1036 | 1034 |
| 1037 // M<S> <: M<S> iff S = dynamic or S=T | 1035 // M<S> <: M<S> iff S = dynamic or S=T |
| 1038 mOfCs = /*severe:StaticTypeError*/mOfAs; | 1036 mOfCs = /*severe:StaticTypeError*/mOfAs; |
| 1039 mOfCs = /*severe:StaticTypeError*/mOfBs; | 1037 mOfCs = /*severe:StaticTypeError*/mOfBs; |
| 1040 mOfCs = mOfCs; | 1038 mOfCs = mOfCs; |
| 1041 | 1039 |
| 1042 // N </: L<C> | 1040 // N </: L<C> |
| 1043 mOfCs = /*severe:StaticTypeError*/ns; | 1041 mOfCs = /*severe:StaticTypeError*/ns; |
| 1044 | 1042 |
| 1045 // Concrete subclass subtyping | 1043 // Concrete subclass subtyping |
| 1046 ns = /*info:DownCast*/lOfAs; | 1044 ns = /*warning:DownCastImplicit*/lOfAs; |
| 1047 ns = /*severe:StaticTypeError*/lOfBs; | 1045 ns = /*severe:StaticTypeError*/lOfBs; |
| 1048 ns = /*severe:StaticTypeError*/lOfCs; | 1046 ns = /*severe:StaticTypeError*/lOfCs; |
| 1049 ns = /*info:DownCast*/mOfAs; | 1047 ns = /*warning:DownCastImplicit*/mOfAs; |
| 1050 ns = /*severe:StaticTypeError*/mOfBs; | 1048 ns = /*severe:StaticTypeError*/mOfBs; |
| 1051 ns = /*severe:StaticTypeError*/mOfCs; | 1049 ns = /*severe:StaticTypeError*/mOfCs; |
| 1052 ns = ns; | 1050 ns = ns; |
| 1053 } | 1051 } |
| 1054 ''' | 1052 ''' |
| 1055 }, covariantGenerics: false, relaxedCasts: false); | 1053 }, covariantGenerics: false, relaxedCasts: false); |
| 1056 }); | 1054 }); |
| 1057 | 1055 |
| 1058 test('Generic subtyping: covariant raw types', () { | 1056 test('Generic subtyping: covariant raw types', () { |
| 1059 testChecker({ | 1057 testChecker({ |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 lOfDynamics = lOfBs; | 1100 lOfDynamics = lOfBs; |
| 1103 lOfDynamics = lOfCs; | 1101 lOfDynamics = lOfCs; |
| 1104 lOfDynamics = mRaw; | 1102 lOfDynamics = mRaw; |
| 1105 lOfDynamics = mOfDynamics; | 1103 lOfDynamics = mOfDynamics; |
| 1106 lOfDynamics = mOfAs; | 1104 lOfDynamics = mOfAs; |
| 1107 lOfDynamics = mOfBs; | 1105 lOfDynamics = mOfBs; |
| 1108 lOfDynamics = mOfCs; | 1106 lOfDynamics = mOfCs; |
| 1109 lOfDynamics = ns; | 1107 lOfDynamics = ns; |
| 1110 | 1108 |
| 1111 // L<T> <: L<S> iff S = dynamic or S=T | 1109 // L<T> <: L<S> iff S = dynamic or S=T |
| 1112 lOfAs = /*warning:DownCastDynamic*/lRaw; | 1110 lOfAs = /*warning:DownCastComposite*/lRaw; |
| 1113 lOfAs = /*warning:DownCastDynamic*/lOfDynamics; | 1111 lOfAs = /*warning:DownCastComposite*/lOfDynamics; |
| 1114 | 1112 |
| 1115 // M<dynamic> </:/> L<A> | 1113 // M<dynamic> </:/> L<A> |
| 1116 lOfAs = /*severe:StaticTypeError*/mRaw; | 1114 lOfAs = /*severe:StaticTypeError*/mRaw; |
| 1117 lOfAs = /*severe:StaticTypeError*/mOfDynamics; | 1115 lOfAs = /*severe:StaticTypeError*/mOfDynamics; |
| 1118 | 1116 |
| 1119 // L<T> <: L<S> iff S = dynamic or S=T | 1117 // L<T> <: L<S> iff S = dynamic or S=T |
| 1120 lOfBs = /*warning:DownCastDynamic*/lRaw; | 1118 lOfBs = /*warning:DownCastComposite*/lRaw; |
| 1121 lOfBs = /*warning:DownCastDynamic*/lOfDynamics; | 1119 lOfBs = /*warning:DownCastComposite*/lOfDynamics; |
| 1122 | 1120 |
| 1123 // M<dynamic> </:/> L<B> | 1121 // M<dynamic> </:/> L<B> |
| 1124 lOfBs = /*severe:StaticTypeError*/mRaw; | 1122 lOfBs = /*severe:StaticTypeError*/mRaw; |
| 1125 lOfBs = /*severe:StaticTypeError*/mOfDynamics; | 1123 lOfBs = /*severe:StaticTypeError*/mOfDynamics; |
| 1126 | 1124 |
| 1127 // L<T> <: L<S> iff S = dynamic or S=T | 1125 // L<T> <: L<S> iff S = dynamic or S=T |
| 1128 lOfCs = /*warning:DownCastDynamic*/lRaw; | 1126 lOfCs = /*warning:DownCastComposite*/lRaw; |
| 1129 lOfCs = /*warning:DownCastDynamic*/lOfDynamics; | 1127 lOfCs = /*warning:DownCastComposite*/lOfDynamics; |
| 1130 | 1128 |
| 1131 // M<dynamic> </:/> L<C> | 1129 // M<dynamic> </:/> L<C> |
| 1132 lOfCs = /*severe:StaticTypeError*/mRaw; | 1130 lOfCs = /*severe:StaticTypeError*/mRaw; |
| 1133 lOfCs = /*severe:StaticTypeError*/mOfDynamics; | 1131 lOfCs = /*severe:StaticTypeError*/mOfDynamics; |
| 1134 | 1132 |
| 1135 // Raw type subtyping | 1133 // Raw type subtyping |
| 1136 mRaw = /*info:DownCast*/lRaw; | 1134 mRaw = /*warning:DownCastImplicit*/lRaw; |
| 1137 mRaw = /*info:DownCast*/lOfDynamics; | 1135 mRaw = /*warning:DownCastImplicit*/lOfDynamics; |
| 1138 mRaw = /*severe:StaticTypeError*/lOfAs; | 1136 mRaw = /*severe:StaticTypeError*/lOfAs; |
| 1139 mRaw = /*severe:StaticTypeError*/lOfBs; | 1137 mRaw = /*severe:StaticTypeError*/lOfBs; |
| 1140 mRaw = /*severe:StaticTypeError*/lOfCs; | 1138 mRaw = /*severe:StaticTypeError*/lOfCs; |
| 1141 mRaw = mRaw; | 1139 mRaw = mRaw; |
| 1142 mRaw = mOfDynamics; | 1140 mRaw = mOfDynamics; |
| 1143 mRaw = mOfAs; | 1141 mRaw = mOfAs; |
| 1144 mRaw = mOfBs; | 1142 mRaw = mOfBs; |
| 1145 mRaw = mOfCs; | 1143 mRaw = mOfCs; |
| 1146 mRaw = ns; | 1144 mRaw = ns; |
| 1147 | 1145 |
| 1148 // M<dynamic> == M | 1146 // M<dynamic> == M |
| 1149 mOfDynamics = /*info:DownCast*/lRaw; | 1147 mOfDynamics = /*warning:DownCastImplicit*/lRaw; |
| 1150 mOfDynamics = /*info:DownCast*/lOfDynamics; | 1148 mOfDynamics = /*warning:DownCastImplicit*/lOfDynamics; |
| 1151 mOfDynamics = /*severe:StaticTypeError*/lOfAs; | 1149 mOfDynamics = /*severe:StaticTypeError*/lOfAs; |
| 1152 mOfDynamics = /*severe:StaticTypeError*/lOfBs; | 1150 mOfDynamics = /*severe:StaticTypeError*/lOfBs; |
| 1153 mOfDynamics = /*severe:StaticTypeError*/lOfCs; | 1151 mOfDynamics = /*severe:StaticTypeError*/lOfCs; |
| 1154 mOfDynamics = mRaw; | 1152 mOfDynamics = mRaw; |
| 1155 mOfDynamics = mOfDynamics; | 1153 mOfDynamics = mOfDynamics; |
| 1156 mOfDynamics = mOfAs; | 1154 mOfDynamics = mOfAs; |
| 1157 mOfDynamics = mOfBs; | 1155 mOfDynamics = mOfBs; |
| 1158 mOfDynamics = mOfCs; | 1156 mOfDynamics = mOfCs; |
| 1159 mOfDynamics = ns; | 1157 mOfDynamics = ns; |
| 1160 | 1158 |
| 1161 // M<T> <: L<S> iff S = dynamic or S=T | 1159 // M<T> <: L<S> iff S = dynamic or S=T |
| 1162 mOfAs = /*info:DownCast*/lRaw; | 1160 mOfAs = /*warning:DownCastComposite*/lRaw; |
| 1163 mOfAs = /*info:DownCast*/lOfDynamics; | 1161 mOfAs = /*warning:DownCastComposite*/lOfDynamics; |
| 1164 | 1162 |
| 1165 // M<dynamic> </:/> M<A> | 1163 // M<dynamic> </:/> M<A> |
| 1166 mOfAs = /*warning:DownCastDynamic*/mRaw; | 1164 mOfAs = /*warning:DownCastComposite*/mRaw; |
| 1167 mOfAs = /*warning:DownCastDynamic*/mOfDynamics; | 1165 mOfAs = /*warning:DownCastComposite*/mOfDynamics; |
| 1168 | 1166 |
| 1169 // M<T> <: L<S> iff S = dynamic or S=T | 1167 // M<T> <: L<S> iff S = dynamic or S=T |
| 1170 mOfBs = /*info:DownCast*/lRaw; | 1168 mOfBs = /*warning:DownCastComposite*/lRaw; |
| 1171 mOfBs = /*info:DownCast*/lOfDynamics; | 1169 mOfBs = /*warning:DownCastComposite*/lOfDynamics; |
| 1172 | 1170 |
| 1173 // M<dynamic> </:/> M<B> | 1171 // M<dynamic> </:/> M<B> |
| 1174 mOfBs = /*warning:DownCastDynamic*/mRaw; | 1172 mOfBs = /*warning:DownCastComposite*/mRaw; |
| 1175 mOfBs = /*warning:DownCastDynamic*/mOfDynamics; | 1173 mOfBs = /*warning:DownCastComposite*/mOfDynamics; |
| 1176 | 1174 |
| 1177 // M<T> <: L<S> iff S = dynamic or S=T | 1175 // M<T> <: L<S> iff S = dynamic or S=T |
| 1178 mOfCs = /*info:DownCast*/lRaw; | 1176 mOfCs = /*warning:DownCastComposite*/lRaw; |
| 1179 mOfCs = /*info:DownCast*/lOfDynamics; | 1177 mOfCs = /*warning:DownCastComposite*/lOfDynamics; |
| 1180 | 1178 |
| 1181 // M<dynamic> </:/> M<C> | 1179 // M<dynamic> </:/> M<C> |
| 1182 mOfCs = /*warning:DownCastDynamic*/mRaw; | 1180 mOfCs = /*warning:DownCastComposite*/mRaw; |
| 1183 mOfCs = /*warning:DownCastDynamic*/mOfDynamics; | 1181 mOfCs = /*warning:DownCastComposite*/mOfDynamics; |
| 1184 | 1182 |
| 1185 // Concrete subclass subtyping | 1183 // Concrete subclass subtyping |
| 1186 ns = /*info:DownCast*/lRaw; | 1184 ns = /*warning:DownCastImplicit*/lRaw; |
| 1187 ns = /*info:DownCast*/lOfDynamics; | 1185 ns = /*warning:DownCastImplicit*/lOfDynamics; |
| 1188 ns = /*info:DownCast*/mRaw; | 1186 ns = /*warning:DownCastImplicit*/mRaw; |
| 1189 ns = /*info:DownCast*/mOfDynamics; | 1187 ns = /*warning:DownCastImplicit*/mOfDynamics; |
| 1190 } | 1188 } |
| 1191 ''' | 1189 ''' |
| 1192 }, covariantGenerics: false, relaxedCasts: false); | 1190 }, covariantGenerics: false, relaxedCasts: false); |
| 1193 }); | 1191 }); |
| 1194 | 1192 |
| 1195 test('Generic subtyping: covariant raw types with multiple parameters', () { | 1193 test('Generic subtyping: covariant raw types with multiple parameters', () { |
| 1196 testChecker({ | 1194 testChecker({ |
| 1197 '/main.dart': ''' | 1195 '/main.dart': ''' |
| 1198 | 1196 |
| 1199 class A {} | 1197 class A {} |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1241 // L<dynamic, dynamic> | 1239 // L<dynamic, dynamic> |
| 1242 lOfDD = lRaw; | 1240 lOfDD = lRaw; |
| 1243 lOfDD = lOfD_; | 1241 lOfDD = lOfD_; |
| 1244 lOfDD = lOfA_; | 1242 lOfDD = lOfA_; |
| 1245 lOfDD = lOfDA; | 1243 lOfDD = lOfDA; |
| 1246 lOfDD = lOfAD; | 1244 lOfDD = lOfAD; |
| 1247 lOfDD = lOfDD; | 1245 lOfDD = lOfDD; |
| 1248 lOfDD = lOfAA; | 1246 lOfDD = lOfAA; |
| 1249 | 1247 |
| 1250 // L<dynamic, A> | 1248 // L<dynamic, A> |
| 1251 lOfDA = /*warning:DownCastDynamic*/lRaw; | 1249 lOfDA = /*warning:DownCastComposite*/lRaw; |
| 1252 lOfDA = /*warning:DownCastDynamic*/lOfD_; | 1250 lOfDA = /*warning:DownCastComposite*/lOfD_; |
| 1253 lOfDA = /*warning:DownCastDynamic*/lOfA_; | 1251 lOfDA = /*warning:DownCastComposite*/lOfA_; |
| 1254 lOfDA = lOfDA; | 1252 lOfDA = lOfDA; |
| 1255 lOfDA = /*severe:StaticTypeError*/lOfAD; | 1253 lOfDA = /*severe:StaticTypeError*/lOfAD; |
| 1256 lOfDA = /*warning:DownCastDynamic*/lOfDD; | 1254 lOfDA = /*warning:DownCastComposite*/lOfDD; |
| 1257 lOfDA = lOfAA; | 1255 lOfDA = lOfAA; |
| 1258 | 1256 |
| 1259 // L<A, dynamic> | 1257 // L<A, dynamic> |
| 1260 lOfAD = /*warning:DownCastDynamic*/lRaw; | 1258 lOfAD = /*warning:DownCastComposite*/lRaw; |
| 1261 lOfAD = /*warning:DownCastDynamic*/lOfD_; | 1259 lOfAD = /*warning:DownCastComposite*/lOfD_; |
| 1262 lOfAD = /*warning:DownCastDynamic*/lOfA_; | 1260 lOfAD = /*warning:DownCastComposite*/lOfA_; |
| 1263 lOfAD = /*severe:StaticTypeError*/lOfDA; | 1261 lOfAD = /*severe:StaticTypeError*/lOfDA; |
| 1264 lOfAD = lOfAD; | 1262 lOfAD = lOfAD; |
| 1265 lOfAD = /*warning:DownCastDynamic*/lOfDD; | 1263 lOfAD = /*warning:DownCastComposite*/lOfDD; |
| 1266 lOfAD = lOfAA; | 1264 lOfAD = lOfAA; |
| 1267 | 1265 |
| 1268 // L<A> == L<dynamic, dynamic> | 1266 // L<A> == L<dynamic, dynamic> |
| 1269 lOfA_ = lRaw; | 1267 lOfA_ = lRaw; |
| 1270 lOfA_ = lOfD_; | 1268 lOfA_ = lOfD_; |
| 1271 lOfA_ = lOfA_; | 1269 lOfA_ = lOfA_; |
| 1272 lOfA_ = lOfDA; | 1270 lOfA_ = lOfDA; |
| 1273 lOfA_ = lOfAD; | 1271 lOfA_ = lOfAD; |
| 1274 lOfA_ = lOfDD; | 1272 lOfA_ = lOfDD; |
| 1275 lOfA_ = lOfAA; | 1273 lOfA_ = lOfAA; |
| 1276 | 1274 |
| 1277 // L<A, A> | 1275 // L<A, A> |
| 1278 lOfAA = /*warning:DownCastDynamic*/lRaw; | 1276 lOfAA = /*warning:DownCastComposite*/lRaw; |
| 1279 lOfAA = /*warning:DownCastDynamic*/lOfD_; | 1277 lOfAA = /*warning:DownCastComposite*/lOfD_; |
| 1280 lOfAA = /*warning:DownCastDynamic*/lOfA_; | 1278 lOfAA = /*warning:DownCastComposite*/lOfA_; |
| 1281 lOfAA = /*warning:DownCastDynamic*/lOfDA; | 1279 lOfAA = /*warning:DownCastComposite*/lOfDA; |
| 1282 lOfAA = /*warning:DownCastDynamic*/lOfAD; | 1280 lOfAA = /*warning:DownCastComposite*/lOfAD; |
| 1283 lOfAA = /*warning:DownCastDynamic*/lOfDD; | 1281 lOfAA = /*warning:DownCastComposite*/lOfDD; |
| 1284 lOfAA = lOfAA; | 1282 lOfAA = lOfAA; |
| 1285 } | 1283 } |
| 1286 ''' | 1284 ''' |
| 1287 }, covariantGenerics: false, relaxedCasts: false); | 1285 }, covariantGenerics: false, relaxedCasts: false); |
| 1288 }); | 1286 }); |
| 1289 | 1287 |
| 1290 test('Covariant generic subtyping: invariance', () { | 1288 test('Covariant generic subtyping: invariance', () { |
| 1291 testChecker({ | 1289 testChecker({ |
| 1292 '/main.dart': ''' | 1290 '/main.dart': ''' |
| 1293 | 1291 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1317 | 1315 |
| 1318 // M<T> <: L<S> iff T <: S | 1316 // M<T> <: L<S> iff T <: S |
| 1319 lOfAs = mOfAs; | 1317 lOfAs = mOfAs; |
| 1320 lOfAs = mOfBs; | 1318 lOfAs = mOfBs; |
| 1321 lOfAs = mOfCs; | 1319 lOfAs = mOfCs; |
| 1322 | 1320 |
| 1323 // N <: L<A> | 1321 // N <: L<A> |
| 1324 lOfAs = ns; | 1322 lOfAs = ns; |
| 1325 | 1323 |
| 1326 // L<T> <: L<S> iff S <: T | 1324 // L<T> <: L<S> iff S <: T |
| 1327 lOfBs = /*info:DownCast*/lOfAs; | 1325 lOfBs = /*warning:DownCastComposite*/lOfAs; |
| 1328 lOfBs = lOfBs; | 1326 lOfBs = lOfBs; |
| 1329 lOfBs = /*severe:StaticTypeError*/lOfCs; | 1327 lOfBs = /*severe:StaticTypeError*/lOfCs; |
| 1330 | 1328 |
| 1331 // M<T> <: L<S> iff T <: S | 1329 // M<T> <: L<S> iff T <: S |
| 1332 lOfBs = /*severe:StaticTypeError*/mOfAs; | 1330 lOfBs = /*severe:StaticTypeError*/mOfAs; |
| 1333 lOfBs = mOfBs; | 1331 lOfBs = mOfBs; |
| 1334 lOfBs = /*severe:StaticTypeError*/mOfCs; | 1332 lOfBs = /*severe:StaticTypeError*/mOfCs; |
| 1335 | 1333 |
| 1336 // N </: L<B> | 1334 // N </: L<B> |
| 1337 lOfBs = /*severe:StaticTypeError*/ns; | 1335 lOfBs = /*severe:StaticTypeError*/ns; |
| 1338 | 1336 |
| 1339 // L<T> <: L<S> iff S <: T | 1337 // L<T> <: L<S> iff S <: T |
| 1340 lOfCs = /*info:DownCast*/lOfAs; | 1338 lOfCs = /*warning:DownCastComposite*/lOfAs; |
| 1341 lOfCs = /*severe:StaticTypeError*/lOfBs; | 1339 lOfCs = /*severe:StaticTypeError*/lOfBs; |
| 1342 lOfCs = lOfCs; | 1340 lOfCs = lOfCs; |
| 1343 | 1341 |
| 1344 // M<T> <: L<S> iff T <: S | 1342 // M<T> <: L<S> iff T <: S |
| 1345 lOfCs = /*severe:StaticTypeError*/mOfAs; | 1343 lOfCs = /*severe:StaticTypeError*/mOfAs; |
| 1346 lOfCs = /*severe:StaticTypeError*/mOfBs; | 1344 lOfCs = /*severe:StaticTypeError*/mOfBs; |
| 1347 lOfCs = mOfCs; | 1345 lOfCs = mOfCs; |
| 1348 | 1346 |
| 1349 // N </: L<C> | 1347 // N </: L<C> |
| 1350 lOfCs = /*severe:StaticTypeError*/ns; | 1348 lOfCs = /*severe:StaticTypeError*/ns; |
| 1351 | 1349 |
| 1352 // M<T> <: L<S> iff T <: S | 1350 // M<T> <: L<S> iff T <: S |
| 1353 mOfAs = /*info:DownCast*/lOfAs; | 1351 mOfAs = /*warning:DownCastComposite*/lOfAs; |
| 1354 mOfAs = /*severe:StaticTypeError*/lOfBs; | 1352 mOfAs = /*severe:StaticTypeError*/lOfBs; |
| 1355 mOfAs = /*severe:StaticTypeError*/lOfCs; | 1353 mOfAs = /*severe:StaticTypeError*/lOfCs; |
| 1356 | 1354 |
| 1357 // M<T> <: M<S> iff T <: S | 1355 // M<T> <: M<S> iff T <: S |
| 1358 mOfAs = mOfAs; | 1356 mOfAs = mOfAs; |
| 1359 mOfAs = mOfBs; | 1357 mOfAs = mOfBs; |
| 1360 mOfAs = mOfCs; | 1358 mOfAs = mOfCs; |
| 1361 | 1359 |
| 1362 // N <: M<A> | 1360 // N <: M<A> |
| 1363 mOfAs = ns; | 1361 mOfAs = ns; |
| 1364 | 1362 |
| 1365 // M<T> <: L<S> iff T <: S | 1363 // M<T> <: L<S> iff T <: S |
| 1366 mOfBs = /*info:DownCast*/lOfAs; | 1364 mOfBs = /*warning:DownCastComposite*/lOfAs; |
| 1367 mOfBs = /*info:DownCast*/lOfBs; | 1365 mOfBs = /*warning:DownCastComposite*/lOfBs; |
| 1368 mOfBs = /*severe:StaticTypeError*/lOfCs; | 1366 mOfBs = /*severe:StaticTypeError*/lOfCs; |
| 1369 | 1367 |
| 1370 // M<T> <: M<S> iff T <: S | 1368 // M<T> <: M<S> iff T <: S |
| 1371 mOfBs = /*info:DownCast*/mOfAs; | 1369 mOfBs = /*warning:DownCastComposite*/mOfAs; |
| 1372 mOfBs = mOfBs; | 1370 mOfBs = mOfBs; |
| 1373 mOfBs = /*severe:StaticTypeError*/mOfCs; | 1371 mOfBs = /*severe:StaticTypeError*/mOfCs; |
| 1374 | 1372 |
| 1375 // N </: M<B> | 1373 // N </: M<B> |
| 1376 mOfBs = /*severe:StaticTypeError*/ns; | 1374 mOfBs = /*severe:StaticTypeError*/ns; |
| 1377 | 1375 |
| 1378 // M<T> <: L<S> iff T <: S | 1376 // M<T> <: L<S> iff T <: S |
| 1379 mOfCs = /*info:DownCast*/lOfAs; | 1377 mOfCs = /*warning:DownCastComposite*/lOfAs; |
| 1380 mOfCs = /*severe:StaticTypeError*/lOfBs; | 1378 mOfCs = /*severe:StaticTypeError*/lOfBs; |
| 1381 mOfCs = /*info:DownCast*/lOfCs; | 1379 mOfCs = /*warning:DownCastComposite*/lOfCs; |
| 1382 | 1380 |
| 1383 // M<T> <: M<S> iff T :< S | 1381 // M<T> <: M<S> iff T :< S |
| 1384 mOfCs = /*info:DownCast*/mOfAs; | 1382 mOfCs = /*warning:DownCastComposite*/mOfAs; |
| 1385 mOfCs = /*severe:StaticTypeError*/mOfBs; | 1383 mOfCs = /*severe:StaticTypeError*/mOfBs; |
| 1386 mOfCs = mOfCs; | 1384 mOfCs = mOfCs; |
| 1387 | 1385 |
| 1388 // N </: L<C> | 1386 // N </: L<C> |
| 1389 mOfCs = /*severe:StaticTypeError*/ns; | 1387 mOfCs = /*severe:StaticTypeError*/ns; |
| 1390 | 1388 |
| 1391 // Concrete subclass subtyping | 1389 // Concrete subclass subtyping |
| 1392 ns = /*info:DownCast*/lOfAs; | 1390 ns = /*warning:DownCastImplicit*/lOfAs; |
| 1393 ns = /*severe:StaticTypeError*/lOfBs; | 1391 ns = /*severe:StaticTypeError*/lOfBs; |
| 1394 ns = /*severe:StaticTypeError*/lOfCs; | 1392 ns = /*severe:StaticTypeError*/lOfCs; |
| 1395 ns = /*info:DownCast*/mOfAs; | 1393 ns = /*warning:DownCastImplicit*/mOfAs; |
| 1396 ns = /*severe:StaticTypeError*/mOfBs; | 1394 ns = /*severe:StaticTypeError*/mOfBs; |
| 1397 ns = /*severe:StaticTypeError*/mOfCs; | 1395 ns = /*severe:StaticTypeError*/mOfCs; |
| 1398 ns = ns; | 1396 ns = ns; |
| 1399 } | 1397 } |
| 1400 ''' | 1398 ''' |
| 1401 }, covariantGenerics: true, relaxedCasts: false); | 1399 }, covariantGenerics: true, relaxedCasts: false); |
| 1402 }); | 1400 }); |
| 1403 | 1401 |
| 1404 test('Relaxed casts', () { | 1402 test('Relaxed casts', () { |
| 1405 testChecker({ | 1403 testChecker({ |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 } | 1435 } |
| 1438 { | 1436 { |
| 1439 lOfOs = mOfDs; | 1437 lOfOs = mOfDs; |
| 1440 lOfOs = mOfOs; | 1438 lOfOs = mOfOs; |
| 1441 lOfOs = mOfAs; | 1439 lOfOs = mOfAs; |
| 1442 lOfOs = lOfDs; | 1440 lOfOs = lOfDs; |
| 1443 lOfOs = lOfOs; | 1441 lOfOs = lOfOs; |
| 1444 lOfOs = lOfAs; | 1442 lOfOs = lOfAs; |
| 1445 } | 1443 } |
| 1446 { | 1444 { |
| 1447 lOfAs = /*warning:DownCastDynamic*/mOfDs; | 1445 lOfAs = /*warning:DownCastComposite*/mOfDs; |
| 1448 lOfAs = /*severe:StaticTypeError*/mOfOs; | 1446 lOfAs = /*severe:StaticTypeError*/mOfOs; |
| 1449 lOfAs = mOfAs; | 1447 lOfAs = mOfAs; |
| 1450 lOfAs = /*warning:DownCastDynamic*/lOfDs; | 1448 lOfAs = /*warning:DownCastComposite*/lOfDs; |
| 1451 lOfAs = /*info:DownCast*/lOfOs; | 1449 lOfAs = /*warning:DownCastComposite*/lOfOs; |
| 1452 lOfAs = lOfAs; | 1450 lOfAs = lOfAs; |
| 1453 } | 1451 } |
| 1454 { | 1452 { |
| 1455 mOfDs = mOfDs; | 1453 mOfDs = mOfDs; |
| 1456 mOfDs = mOfOs; | 1454 mOfDs = mOfOs; |
| 1457 mOfDs = mOfAs; | 1455 mOfDs = mOfAs; |
| 1458 mOfDs = /*info:DownCast*/lOfDs; | 1456 mOfDs = /*warning:DownCastImplicit*/lOfDs; |
| 1459 mOfDs = /*info:DownCast*/lOfOs; | 1457 mOfDs = /*warning:DownCastImplicit*/lOfOs; |
| 1460 mOfDs = /*info:DownCast*/lOfAs; | 1458 mOfDs = /*warning:DownCastImplicit*/lOfAs; |
| 1461 } | 1459 } |
| 1462 { | 1460 { |
| 1463 mOfOs = mOfDs; | 1461 mOfOs = mOfDs; |
| 1464 mOfOs = mOfOs; | 1462 mOfOs = mOfOs; |
| 1465 mOfOs = mOfAs; | 1463 mOfOs = mOfAs; |
| 1466 mOfOs = /*info:DownCast*/lOfDs; | 1464 mOfOs = /*warning:DownCastImplicit*/lOfDs; |
| 1467 mOfOs = /*info:DownCast*/lOfOs; | 1465 mOfOs = /*warning:DownCastImplicit*/lOfOs; |
| 1468 mOfOs = /*severe:StaticTypeError*/lOfAs; | 1466 mOfOs = /*severe:StaticTypeError*/lOfAs; |
| 1469 } | 1467 } |
| 1470 { | 1468 { |
| 1471 mOfAs = /*warning:DownCastDynamic*/mOfDs; | 1469 mOfAs = /*warning:DownCastComposite*/mOfDs; |
| 1472 mOfAs = /*info:DownCast*/mOfOs; | 1470 mOfAs = /*warning:DownCastComposite*/mOfOs; |
| 1473 mOfAs = mOfAs; | 1471 mOfAs = mOfAs; |
| 1474 mOfAs = /*info:DownCast*/lOfDs; | 1472 mOfAs = /*warning:DownCastComposite*/lOfDs; |
| 1475 mOfAs = /*info:DownCast*/lOfOs; | 1473 mOfAs = /*warning:DownCastComposite*/lOfOs; |
| 1476 mOfAs = /*info:DownCast*/lOfAs; | 1474 mOfAs = /*warning:DownCastComposite*/lOfAs; |
| 1477 } | 1475 } |
| 1478 | 1476 |
| 1479 } | 1477 } |
| 1480 ''' | 1478 ''' |
| 1481 }, covariantGenerics: true, relaxedCasts: true); | 1479 }, covariantGenerics: true, relaxedCasts: true); |
| 1482 }); | 1480 }); |
| 1483 | 1481 |
| 1484 test('Subtyping literals', () { | 1482 test('Subtyping literals', () { |
| 1485 testChecker({ | 1483 testChecker({ |
| 1486 '/main.dart': ''' | 1484 '/main.dart': ''' |
| 1487 test() { | 1485 test() { |
| 1488 Iterable i1 = [1, 2, 3]; | 1486 Iterable i1 = [1, 2, 3]; |
| 1489 i1 = <int>[1, 2, 3]; | 1487 i1 = <int>[1, 2, 3]; |
| 1490 | 1488 |
| 1491 List l1 = [1, 2, 3]; | 1489 List l1 = [1, 2, 3]; |
| 1492 l1 = <int>[1, 2, 3]; | 1490 l1 = <int>[1, 2, 3]; |
| 1493 | 1491 |
| 1494 Iterable<int> i2 = /*warning:DownCastLiteral*/[1, 2, 3]; | 1492 Iterable<int> i2 = /*warning:InferableLiteral*/[1, 2, 3]; |
| 1495 i2 = /*warning:DownCastDynamic*/i1; | 1493 i2 = /*warning:DownCastComposite*/i1; |
| 1496 i2 = /*warning:DownCastDynamic*/l1; | 1494 i2 = /*warning:DownCastComposite*/l1; |
| 1497 i2 = <int>[1, 2, 3]; | 1495 i2 = <int>[1, 2, 3]; |
| 1498 | 1496 |
| 1499 List<int> l2 = /*warning:DownCastLiteral*/[1, 2, 3]; | 1497 List<int> l2 = /*warning:InferableLiteral*/[1, 2, 3]; |
| 1500 l2 = /*info:DownCast*/i1; | 1498 l2 = /*warning:DownCastComposite*/i1; |
| 1501 l2 = /*warning:DownCastDynamic*/l1; | 1499 l2 = /*warning:DownCastComposite*/l1; |
| 1502 | 1500 |
| 1503 l2 = /*warning:DownCastExact*/new List(); | 1501 l2 = /*warning:InferableAllocation*/new List(); |
| 1504 l2 = /*warning:DownCastExact*/new List(10); | 1502 l2 = /*warning:InferableAllocation*/new List(10); |
| 1505 l2 = /*warning:DownCastExact*/new List.filled(10, 42); | 1503 l2 = /*warning:InferableAllocation*/new List.filled(10, 42); |
| 1506 } | 1504 } |
| 1507 ''' | 1505 ''' |
| 1508 }); | 1506 }); |
| 1509 }); | 1507 }); |
| 1510 | 1508 |
| 1511 test('Type checking literals', () { | 1509 test('Type checking literals', () { |
| 1512 testChecker({ | 1510 testChecker({ |
| 1513 '/main.dart': ''' | 1511 '/main.dart': ''' |
| 1514 test() { | 1512 test() { |
| 1515 num n = 3; | 1513 num n = 3; |
| 1516 int i = 3; | 1514 int i = 3; |
| 1517 String s = "hello"; | 1515 String s = "hello"; |
| 1518 { | 1516 { |
| 1519 List<int> l = <int>[i]; | 1517 List<int> l = <int>[i]; |
| 1520 l = <int>[/*severe:StaticTypeError*/s]; | 1518 l = <int>[/*severe:StaticTypeError*/s]; |
| 1521 l = <int>[/*info:DownCast*/n]; | 1519 l = <int>[/*warning:DownCastImplicit*/n]; |
| 1522 l = <int>[i, /*info:DownCast*/n, /*severe:StaticTypeError*/s]; | 1520 l = <int>[i, /*warning:DownCastImplicit*/n, /*severe:StaticTypeEr
ror*/s]; |
| 1523 } | 1521 } |
| 1524 { | 1522 { |
| 1525 List l = [i]; | 1523 List l = [i]; |
| 1526 l = [s]; | 1524 l = [s]; |
| 1527 l = [n]; | 1525 l = [n]; |
| 1528 l = [i, n, s]; | 1526 l = [i, n, s]; |
| 1529 } | 1527 } |
| 1530 { | 1528 { |
| 1531 Map<String, int> m = <String, int>{s: i}; | 1529 Map<String, int> m = <String, int>{s: i}; |
| 1532 m = <String, int>{s: /*severe:StaticTypeError*/s}; | 1530 m = <String, int>{s: /*severe:StaticTypeError*/s}; |
| 1533 m = <String, int>{s: /*info:DownCast*/n}; | 1531 m = <String, int>{s: /*warning:DownCastImplicit*/n}; |
| 1534 m = <String, int>{s: i, | 1532 m = <String, int>{s: i, |
| 1535 s: /*info:DownCast*/n, | 1533 s: /*warning:DownCastImplicit*/n, |
| 1536 s: /*severe:StaticTypeError*/s}; | 1534 s: /*severe:StaticTypeError*/s}; |
| 1537 } | 1535 } |
| 1538 // TODO(leafp): We can't currently test for key errors since the | 1536 // TODO(leafp): We can't currently test for key errors since the |
| 1539 // error marker binds to the entire entry. | 1537 // error marker binds to the entire entry. |
| 1540 { | 1538 { |
| 1541 Map m = {s: i}; | 1539 Map m = {s: i}; |
| 1542 m = {s: s}; | 1540 m = {s: s}; |
| 1543 m = {s: n}; | 1541 m = {s: n}; |
| 1544 m = {s: i, | 1542 m = {s: i, |
| 1545 s: n, | 1543 s: n, |
| 1546 s: s}; | 1544 s: s}; |
| 1547 m = {i: s, | 1545 m = {i: s, |
| 1548 n: s, | 1546 n: s, |
| 1549 s: s}; | 1547 s: s}; |
| 1550 } | 1548 } |
| 1551 } | 1549 } |
| 1552 ''' | 1550 ''' |
| 1553 }); | 1551 }); |
| 1554 }); | 1552 }); |
| 1555 | 1553 |
| 1556 test('casts in constant contexts', () { | 1554 test('casts in constant contexts', () { |
| 1557 String mk(String error) => ''' | 1555 String mk(String error1, String error2) => ''' |
| 1558 class A { | 1556 class A { |
| 1559 static const num n = 3.0; | 1557 static const num n = 3.0; |
| 1560 static const int i = /*$error*/n; | 1558 static const int i = /*$error2*/n; |
| 1561 final int fi; | 1559 final int fi; |
| 1562 const A(num a) : this.fi = /*$error*/a; | 1560 const A(num a) : this.fi = /*$error1*/a; |
| 1563 } | 1561 } |
| 1564 class B extends A { | 1562 class B extends A { |
| 1565 const B(Object a) : super(/*$error*/a); | 1563 const B(Object a) : super(/*$error1*/a); |
| 1566 } | 1564 } |
| 1567 void foo(Object o) { | 1565 void foo(Object o) { |
| 1568 var a = const A(/*$error*/o); | 1566 var a = const A(/*$error1*/o); |
| 1569 } | 1567 } |
| 1570 '''; | 1568 '''; |
| 1571 testChecker({'/main.dart': mk("severe:StaticTypeError")}, | 1569 testChecker( |
| 1570 {'/main.dart': mk("severe:StaticTypeError", "severe:StaticTypeError")}, |
| 1572 allowConstCasts: false); | 1571 allowConstCasts: false); |
| 1573 testChecker({'/main.dart': mk("info:DownCast")}, allowConstCasts: true); | 1572 testChecker( |
| 1573 {'/main.dart': mk("warning:DownCastImplicit", "info:AssignmentCast")}, |
| 1574 allowConstCasts: true); |
| 1574 }); | 1575 }); |
| 1575 | 1576 |
| 1576 test('casts in conditionals', () { | 1577 test('casts in conditionals', () { |
| 1577 testChecker({ | 1578 testChecker({ |
| 1578 '/main.dart': ''' | 1579 '/main.dart': ''' |
| 1579 main() { | 1580 main() { |
| 1580 bool b = true; | 1581 bool b = true; |
| 1581 num x = b ? 1 : 2.3; | 1582 num x = b ? 1 : 2.3; |
| 1582 int y = /*info:DownCast*/b ? 1 : 2.3; | 1583 int y = /*info:AssignmentCast*/b ? 1 : 2.3; |
| 1583 String z = !b ? "hello" : null; | 1584 String z = !b ? "hello" : null; |
| 1584 z = b ? null : "hello"; | 1585 z = b ? null : "hello"; |
| 1585 } | 1586 } |
| 1586 ''' | 1587 ''' |
| 1587 }); | 1588 }); |
| 1588 }); | 1589 }); |
| 1589 | 1590 |
| 1590 test('redirecting constructor', () { | 1591 test('redirecting constructor', () { |
| 1591 testChecker({ | 1592 testChecker({ |
| 1592 '/main.dart': ''' | 1593 '/main.dart': ''' |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1832 A operator -(B b) {} | 1833 A operator -(B b) {} |
| 1833 } | 1834 } |
| 1834 | 1835 |
| 1835 foo() => new A(); | 1836 foo() => new A(); |
| 1836 | 1837 |
| 1837 test() { | 1838 test() { |
| 1838 A a = new A(); | 1839 A a = new A(); |
| 1839 B b = new B(); | 1840 B b = new B(); |
| 1840 var c = foo(); | 1841 var c = foo(); |
| 1841 a = a * b; | 1842 a = a * b; |
| 1842 a = a * /*pass should be info:DownCast*/c; | 1843 a = a * /*pass should be warning:DownCastImplicit*/c; |
| 1843 a = a / b; | 1844 a = a / b; |
| 1844 a = a ~/ b; | 1845 a = a ~/ b; |
| 1845 a = a % b; | 1846 a = a % b; |
| 1846 a = a + b; | 1847 a = a + b; |
| 1847 a = a + /*pass should be severe:StaticTypeError*/a; | 1848 a = a + /*pass should be severe:StaticTypeError*/a; |
| 1848 a = a - b; | 1849 a = a - b; |
| 1849 b = /*severe:StaticTypeError*/b - b; | 1850 b = /*severe:StaticTypeError*/b - b; |
| 1850 a = a << b; | 1851 a = a << b; |
| 1851 a = a >> b; | 1852 a = a >> b; |
| 1852 a = a & b; | 1853 a = a & b; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 (/*severe:StaticTypeError*/x += 3.14); | 1888 (/*severe:StaticTypeError*/x += 3.14); |
| 1888 | 1889 |
| 1889 double y = 0.0; | 1890 double y = 0.0; |
| 1890 y += 5; | 1891 y += 5; |
| 1891 y += 3.14; | 1892 y += 3.14; |
| 1892 | 1893 |
| 1893 num z = 0; | 1894 num z = 0; |
| 1894 z += 5; | 1895 z += 5; |
| 1895 z += 3.14; | 1896 z += 3.14; |
| 1896 | 1897 |
| 1897 x = /*info:DownCast*/x + z; | 1898 x = /*warning:DownCastImplicit*/x + z; |
| 1898 x += /*info:DownCast*/z; | 1899 x += /*warning:DownCastImplicit*/z; |
| 1899 y = /*info:DownCast*/y + z; | 1900 y = /*warning:DownCastImplicit*/y + z; |
| 1900 y += /*info:DownCast*/z; | 1901 y += /*warning:DownCastImplicit*/z; |
| 1901 | 1902 |
| 1902 dynamic w = 42; | 1903 dynamic w = 42; |
| 1903 x += /*info:DownCast*/w; | 1904 x += /*info:DynamicCast*/w; |
| 1904 y += /*info:DownCast*/w; | 1905 y += /*info:DynamicCast*/w; |
| 1905 z += /*info:DownCast*/w; | 1906 z += /*info:DynamicCast*/w; |
| 1906 | 1907 |
| 1907 A a = new A(); | 1908 A a = new A(); |
| 1908 B b = new B(); | 1909 B b = new B(); |
| 1909 var c = foo(); | 1910 var c = foo(); |
| 1910 a = a * b; | 1911 a = a * b; |
| 1911 a *= b; | 1912 a *= b; |
| 1912 a *= /*info:DownCast*/c; | 1913 a *= /*info:DynamicCast*/c; |
| 1913 a /= b; | 1914 a /= b; |
| 1914 a ~/= b; | 1915 a ~/= b; |
| 1915 a %= b; | 1916 a %= b; |
| 1916 a += b; | 1917 a += b; |
| 1917 a += /*severe:StaticTypeError*/a; | 1918 a += /*severe:StaticTypeError*/a; |
| 1918 a -= b; | 1919 a -= b; |
| 1919 (/*severe:StaticTypeError*/b -= b); | 1920 (/*severe:StaticTypeError*/b -= b); |
| 1920 a <<= b; | 1921 a <<= b; |
| 1921 a >>= b; | 1922 a >>= b; |
| 1922 a &= b; | 1923 a &= b; |
| (...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2799 f = bar as II2D; | 2800 f = bar as II2D; |
| 2800 f = bar as DD2I; | 2801 f = bar as DD2I; |
| 2801 f = bar as DI2D; | 2802 f = bar as DI2D; |
| 2802 f = bar as ID2D; | 2803 f = bar as ID2D; |
| 2803 f = bar as DD2D; | 2804 f = bar as DD2D; |
| 2804 } | 2805 } |
| 2805 ''' | 2806 ''' |
| 2806 }); | 2807 }); |
| 2807 }); | 2808 }); |
| 2808 } | 2809 } |
| OLD | NEW |