| Index: pkg/analyzer/test/src/task/strong/checker_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| index c6662db9587878e7e0942beb8b39b8193557d69c..397431a27c2dbe54366405dc24264bfce07a60cd 100644
|
| --- a/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| @@ -556,12 +556,11 @@ void main() {
|
| typedef A Right(dynamic x); // Right branch
|
| typedef A Bottom(A x); // Bottom of the lattice
|
|
|
| - dynamic left(A x) => x;
|
| - A bot(A x) => x;
|
| - dynamic top(dynamic x) => x;
|
| - A right(dynamic x) => /*info:DYNAMIC_CAST*/x;
|
| -
|
| void main() {
|
| + Top top;
|
| + Left left;
|
| + Right right;
|
| + Bottom bot;
|
| {
|
| Top f;
|
| f = top;
|
| @@ -571,29 +570,106 @@ void main() {
|
| }
|
| {
|
| Left f;
|
| - f = /*severe:STATIC_TYPE_ERROR*/top;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/top;
|
| f = left;
|
| - f = /*severe:STATIC_TYPE_ERROR*/right;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/right;
|
| f = bot;
|
| }
|
| {
|
| Right f;
|
| - f = /*severe:STATIC_TYPE_ERROR*/top;
|
| - f = /*severe:STATIC_TYPE_ERROR*/left;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/top;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/left;
|
| f = right;
|
| f = bot;
|
| }
|
| {
|
| Bottom f;
|
| - f = /*severe:STATIC_TYPE_ERROR*/top;
|
| - f = /*severe:STATIC_TYPE_ERROR*/left;
|
| - f = /*severe:STATIC_TYPE_ERROR*/right;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/top;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/left;
|
| + f = /*warning:DOWN_CAST_COMPOSITE*/right;
|
| f = bot;
|
| }
|
| }
|
| ''');
|
| });
|
|
|
| + test('dynamic - known functions', () {
|
| +
|
| + // Our lattice should look like this:
|
| + //
|
| + //
|
| + // Bot -> Top
|
| + // / \
|
| + // A -> Top Bot -> A
|
| + // / \ /
|
| + // Top -> Top A -> A
|
| + // \ /
|
| + // Top -> A
|
| + //
|
| + checkFile('''
|
| + class A {}
|
| +
|
| + typedef dynamic BotTop(dynamic x);
|
| + typedef dynamic ATop(A x);
|
| + typedef A BotA(dynamic x);
|
| + typedef A AA(A x);
|
| + typedef A TopA(Object x);
|
| + typedef dynamic TopTop(Object x);
|
| +
|
| + dynamic aTop(A x) => x;
|
| + A aa(A x) => x;
|
| + dynamic topTop(dynamic x) => x;
|
| + A topA(dynamic x) => /*info:DYNAMIC_CAST*/x;
|
| +
|
| + void main() {
|
| + BotTop botTop;
|
| + BotA botA;
|
| + {
|
| + BotTop f;
|
| + f = topTop;
|
| + f = aTop;
|
| + f = topA;
|
| + f = aa;
|
| + }
|
| + {
|
| + ATop f;
|
| + f = topTop;
|
| + f = aTop;
|
| + f = topA;
|
| + f = aa;
|
| + }
|
| + {
|
| + BotA f;
|
| + f = /*severe:STATIC_TYPE_ERROR*/topTop;
|
| + f = /*severe:STATIC_TYPE_ERROR*/aTop;
|
| + f = topA;
|
| + f = aa;
|
| + }
|
| + {
|
| + AA f;
|
| + f = /*severe:STATIC_TYPE_ERROR*/topTop;
|
| + f = /*severe:STATIC_TYPE_ERROR*/aTop;
|
| + f = topA;
|
| + f = aa;
|
| + }
|
| + {
|
| + TopTop f;
|
| + f = topTop;
|
| + f = /*severe:STATIC_TYPE_ERROR*/aTop;
|
| + f = topA;
|
| + f = /*severe:STATIC_TYPE_ERROR*/aa;
|
| + }
|
| + {
|
| + TopA f;
|
| + f = /*severe:STATIC_TYPE_ERROR*/topTop;
|
| + f = /*severe:STATIC_TYPE_ERROR*/aTop;
|
| + f = topA;
|
| + f = /*severe:STATIC_TYPE_ERROR*/aa;
|
| + }
|
| + }
|
| + ''');
|
| + });
|
| +
|
| test('function literal variance', () {
|
| checkFile('''
|
|
|
|
|