Index: pkg/analyzer/lib/src/task/strong/checker.dart |
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart |
index 21281719674209128269d53a0165ed8d8cab6fd2..c074b7938c7aec46eabdae9302f15523b0dd0659 100644 |
--- a/pkg/analyzer/lib/src/task/strong/checker.dart |
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart |
@@ -163,6 +163,7 @@ class CodeChecker extends RecursiveAstVisitor { |
checkAssignment(expr.expression, type); |
} else { |
_checkDowncast(expr, type); |
+ _checkNonNullAssignment(expr, type); |
} |
} |
@@ -613,11 +614,10 @@ class CodeChecker extends RecursiveAstVisitor { |
// typing rules may have inferred a more precise type for the variable |
// based on the initializer. |
} else { |
- var dartType = getType(type); |
for (VariableDeclaration variable in node.variables) { |
var initializer = variable.initializer; |
if (initializer != null) { |
- checkAssignment(initializer, dartType); |
+ checkAssignment(initializer, type.type); |
} |
} |
} |
@@ -839,6 +839,14 @@ class CodeChecker extends RecursiveAstVisitor { |
[declElement.name]); |
} |
+ void _checkNonNullAssignment(Expression expression, DartType type) { |
+ var exprType = expression.staticType; |
+ if (rules.isNonNullableType(type) && !rules.isNonNullableType(exprType)) { |
+ _recordMessage(expression, StaticTypeWarningCode.INVALID_ASSIGNMENT, |
+ [exprType, type]); |
+ } |
+ } |
+ |
void _checkReturnOrYield(Expression expression, AstNode node, |
{bool yieldStar: false}) { |
FunctionBody body = node.getAncestor((n) => n is FunctionBody); |