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 ae8ba3a29286512e5e7081e6664cb95531cfdfd0..ef9b1ebfec45429bd0a2d35d532b9fe90d0cdd20 100644 |
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart |
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart |
@@ -265,12 +265,15 @@ class D { |
D operator +(D d) => null; |
} |
+class SubA extends A {} |
+class SubSubA extends SubA {} |
+ |
foo() => new A(); |
test() { |
int x = 0; |
x += 5; |
- /*error:STATIC_TYPE_ERROR*/x += /*error:INVALID_ASSIGNMENT*/3.14; |
+ x += /*error:INVALID_ASSIGNMENT*/3.14; |
double y = 0.0; |
y += 5; |
@@ -281,12 +284,12 @@ test() { |
z += 3.14; |
x = /*info:DOWN_CAST_IMPLICIT*/x + z; |
- x += /*info:DOWN_CAST_IMPLICIT*/z; |
+ /*info:DOWN_CAST_IMPLICIT_ASSIGN*/x += z; |
y = y + z; |
y += z; |
dynamic w = 42; |
- x += /*info:DYNAMIC_CAST*/w; |
+ /*info:DOWN_CAST_IMPLICIT_ASSIGN*/x += /*info:DYNAMIC_CAST*/w; |
y += /*info:DYNAMIC_CAST*/w; |
z += /*info:DYNAMIC_CAST*/w; |
@@ -302,7 +305,7 @@ test() { |
a += b; |
a += /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a; |
a -= b; |
- /*error:STATIC_TYPE_ERROR*/b -= /*error:INVALID_ASSIGNMENT*/b; |
+ b -= /*error:INVALID_ASSIGNMENT*/b; |
a <<= b; |
a >>= b; |
a &= b; |
@@ -310,6 +313,10 @@ test() { |
a |= b; |
/*info:DYNAMIC_INVOKE*/c += b; |
+ SubA sa; |
+ /*info:DOWN_CAST_IMPLICIT_ASSIGN*/sa += b; |
+ SubSubA ssa = /*info:ASSIGNMENT_CAST,info:DOWN_CAST_IMPLICIT_ASSIGN*/sa += b; |
+ |
var d = new D(); |
a[b] += d; |
a[/*info:DYNAMIC_CAST*/c] += d; |
@@ -373,6 +380,20 @@ main() { |
'''); |
} |
+ void test_compoundAssignment_returnsDynamic() { |
+ checkFile(r''' |
+class Foo { |
+ operator +(other) => null; |
+} |
+ |
+main() { |
+ var foo = new Foo(); |
+ foo = /*info:DYNAMIC_CAST*/foo + 1; |
+ /*info:DYNAMIC_CAST*/foo += 1; |
+} |
+ '''); |
+ } |
+ |
void test_constructorInvalid() { |
// Regression test for https://github.com/dart-lang/sdk/issues/26695 |
checkFile(''' |
@@ -3845,11 +3866,14 @@ class A { |
A operator -(int x) => null; |
A operator -() => null; |
} |
+class B extends A {} |
+class C extends B {} |
foo() => new A(); |
test() { |
A a = new A(); |
+ B b = new B(); |
var c = foo(); |
dynamic d; |
@@ -3871,6 +3895,17 @@ test() { |
a--; |
(/*info:DYNAMIC_INVOKE*/d++); |
(/*info:DYNAMIC_INVOKE*/d--); |
+ |
+ ++/*info:DOWN_CAST_IMPLICIT_ASSIGN*/b; |
+ --/*info:DOWN_CAST_IMPLICIT_ASSIGN*/b; |
+ /*info:DOWN_CAST_IMPLICIT_ASSIGN*/b++; |
+ /*info:DOWN_CAST_IMPLICIT_ASSIGN*/b--; |
+ |
+ takesC(C c) => null; |
+ takesC(/*info:DOWN_CAST_IMPLICIT*/++/*info:DOWN_CAST_IMPLICIT_ASSIGN*/b); |
+ takesC(/*info:DOWN_CAST_IMPLICIT*/--/*info:DOWN_CAST_IMPLICIT_ASSIGN*/b); |
+ takesC(/*info:DOWN_CAST_IMPLICIT,info:DOWN_CAST_IMPLICIT_ASSIGN*/b++); |
+ takesC(/*info:DOWN_CAST_IMPLICIT,info:DOWN_CAST_IMPLICIT_ASSIGN*/b--); |
}'''); |
} |