From 9bffff6dfc49f32ea1d979609979e9da3c0011f0 Mon Sep 17 00:00:00 2001 From: Brian Wilkerson Date: Fri, 1 Nov 2019 21:52:48 +0000 Subject: [PATCH] Fix exception in migration of ?? operator when the right hand side is a generic type Change-Id: Ie372522f9493e2ccea8284f8583b0f43153adbbd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/123884 Reviewed-by: Paul Berry Commit-Queue: Brian Wilkerson --- pkg/nnbd_migration/lib/src/edge_builder.dart | 4 +++- pkg/nnbd_migration/test/edge_builder_test.dart | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart index c881f7cbb78..11598f24511 100644 --- a/pkg/nnbd_migration/lib/src/edge_builder.dart +++ b/pkg/nnbd_migration/lib/src/edge_builder.dart @@ -378,7 +378,9 @@ class EdgeBuilder extends GeneralizingAstVisitor rightType = rightOperand.accept(this); }); var ifNullNode = NullabilityNode.forIfNotNull(); - expressionType = DecoratedType(node.staticType, ifNullNode); + expressionType = _decorateUpperOrLowerBound( + node, node.staticType, leftType, rightType, true, + node: ifNullNode); _connect( rightType.node, expressionType.node, IfNullOrigin(source, node)); } finally { diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart index 20b6a224186..9e3cc4e0a25 100644 --- a/pkg/nnbd_migration/test/edge_builder_test.dart +++ b/pkg/nnbd_migration/test/edge_builder_test.dart @@ -1201,6 +1201,15 @@ int f(int i, int j) => i ?? j; assertEdge(right, expression, guards: [left], hard: false); } + test_binaryExpression_questionQuestion_genericReturnType() async { + await analyze(''' +class C { + C operator +(C c) => this; +} +C f(C i, C j) => i ?? j; +'''); + } + test_binaryExpression_right_dynamic() async { await analyze(''' class C {