diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index 4a70c667c78..017f2e39402 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -4719,12 +4719,9 @@ class InferenceContext { if (_returnStack.isEmpty) { return; } - DartType context = _returnStack.last; - if (context == null || context.isDynamic) { - DartType inferred = _inferredReturn.last; - inferred = _typeSystem.getLeastUpperBound(_typeProvider, type, inferred); - _inferredReturn[_inferredReturn.length - 1] = inferred; - } + DartType inferred = _inferredReturn.last; + inferred = _typeSystem.getLeastUpperBound(_typeProvider, type, inferred); + _inferredReturn[_inferredReturn.length - 1] = inferred; } /** @@ -4746,15 +4743,14 @@ class InferenceContext { * bound of all types added with [addReturnOrYieldType]. */ void popReturnContext(BlockFunctionBody node) { - assert(_returnStack.isNotEmpty && _inferredReturn.isNotEmpty); - if (_returnStack.isNotEmpty) { - _returnStack.removeLast(); - } - if (_inferredReturn.isNotEmpty) { + if (_returnStack.isNotEmpty && _inferredReturn.isNotEmpty) { + DartType context = _returnStack.removeLast() ?? DynamicTypeImpl.instance; DartType inferred = _inferredReturn.removeLast(); - if (!inferred.isBottom) { + if (!inferred.isBottom && _typeSystem.isSubtypeOf(inferred, context)) { setType(node, inferred); } + } else { + assert(false); } } diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart index 6539e675a1a..c584fa868b0 100644 --- a/pkg/analyzer/test/src/context/mock_sdk.dart +++ b/pkg/analyzer/test/src/context/mock_sdk.dart @@ -194,6 +194,10 @@ abstract class Iterable { /*=R*/ fold/**/(/*=R*/ initialValue, /*=R*/ combine(/*=R*/ previousValue, E element)); + + Iterable/**/ expand/**/(Iterable/**/ f(E element)); + + List toList(); } class List implements Iterable { diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart index 4dbcbfeba20..1b8d9713b14 100644 --- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart +++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart @@ -2554,6 +2554,18 @@ main() { expect(fns[9].type.toString(), '() → Stream'); } + void test_inferReturnOfStatementLambda() { + // Regression test for https://github.com/dart-lang/sdk/issues/26139 + checkFile(r''' +List strings() { + var stuff = [].expand(/*info:INFERRED_TYPE_CLOSURE*/(i) { + return []; + }); + return stuff.toList(); +} + '''); + } + void test_inferred_nonstatic_field_depends_on_static_field_complex() { var mainUnit = checkFile(''' class C {