| 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 d0b55fed93a80bdca1f0ba935f98e22dae82274d..a2d003eeb795cec098d82777dba8c9e59a8befb6 100644 | 
| --- a/pkg/analyzer/lib/src/task/strong/checker.dart | 
| +++ b/pkg/analyzer/lib/src/task/strong/checker.dart | 
| @@ -196,9 +196,7 @@ class CodeChecker extends RecursiveAstVisitor { | 
| if (expr is ParenthesizedExpression) { | 
| checkAssignment(expr.expression, type); | 
| } else { | 
| -      if (_checkNonNullAssignment(expr, type)) { | 
| -        _checkDowncast(expr, type); | 
| -      } | 
| +      _checkDowncast(expr, type); | 
| } | 
| } | 
|  | 
| @@ -743,6 +741,8 @@ class CodeChecker extends RecursiveAstVisitor { | 
| from = _getDefiniteType(expr); | 
| } | 
|  | 
| +    if (!_checkNonNullAssignment(expr, to, from)) return; | 
| + | 
| // We can use anything as void. | 
| if (to.isVoid) return; | 
|  | 
| @@ -877,11 +877,10 @@ class CodeChecker extends RecursiveAstVisitor { | 
| /// Checks if the assignment is valid with respect to non-nullable types. | 
| /// Returns `false` if a nullable expression is assigned to a variable of | 
| /// non-nullable type and `true` otherwise. | 
| -  bool _checkNonNullAssignment(Expression expression, DartType type) { | 
| -    var exprType = expression.staticType; | 
| -    if (rules.isNonNullableType(type) && rules.isNullableType(exprType)) { | 
| +  bool _checkNonNullAssignment(Expression expression, DartType to, DartType from) { | 
| +    if (rules.isNonNullableType(to) && rules.isNullableType(from)) { | 
| _recordMessage(expression, StaticTypeWarningCode.INVALID_ASSIGNMENT, | 
| -          [exprType, type]); | 
| +          [from, to]); | 
| return false; | 
| } | 
| return true; | 
|  |