Flow analysis: implement "why not promoted" logic for compound assignments.
Bug: https://github.com/dart-lang/sdk/issues/44898
Change-Id: I57a2c62b8450c313887b516d6fe2ef85fdd0d92b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/193084
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
index 8f705df..e83ebea 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
@@ -389,3 +389,15 @@
null: null
});
}
+
+class C26 {
+ int? bad;
+}
+
+compoundAssignmentRhs(C26 c) {
+ int i = 0;
+ if (c.bad == null) return;
+ i +=
+ /*analyzer.notPromoted(propertyNotPromoted(target: member:C26.bad, type: int?))*/ c
+ . /*cfe.notPromoted(propertyNotPromoted(target: member:C26.bad, type: int?))*/ bad;
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index a3a966c..4c05164 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -248,6 +248,11 @@
assignedType,
whyNotPromoted: operator == TokenType.EQ ? whyNotPromoted : null,
);
+ if (operator != TokenType.EQ &&
+ operator != TokenType.QUESTION_QUESTION_EQ) {
+ _resolver.checkForArgumentTypeNotAssignableForArgument(node.rightHandSide,
+ whyNotPromoted: whyNotPromoted);
+ }
}
void _setRhsContext(AssignmentExpressionImpl node, DartType leftType,
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index e8136ea..16387ea 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -345,12 +345,6 @@
void visitAssignmentExpression(AssignmentExpression node) {
TokenType operatorType = node.operator.type;
Expression lhs = node.leftHandSide;
- Expression rhs = node.rightHandSide;
- if (operatorType == TokenType.EQ ||
- operatorType == TokenType.QUESTION_QUESTION_EQ) {
- } else {
- checkForArgumentTypeNotAssignableForArgument(rhs);
- }
if (operatorType == TokenType.QUESTION_QUESTION_EQ) {
_checkForDeadNullCoalesce(node.readType as TypeImpl, node.rightHandSide);
}