Version 2.17.0-121.0.dev

Merge commit '7cd6b3ed3e89b8653084883f64da124d7a29208c' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 41802d0..cf14dd4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -521,23 +521,20 @@
         nameErrorEntity: function,
       );
 
-      if (functionType == null) {
+      if (functionType is FunctionType) {
+        function.staticType = functionType;
+        _resolve(
+          node: node,
+          rawType: functionType,
+          name: function.propertyName.name,
+        );
+      } else {
         // The target is known, but the method is not; [UNDEFINED_GETTER] is
         // reported elsewhere.
         node.staticType = DynamicTypeImpl.instance;
-        return;
-      } else {
-        if (functionType is FunctionType) {
-          function.staticType = functionType;
-          _resolve(
-            node: node,
-            rawType: functionType,
-            name: function.propertyName.name,
-          );
-        }
-
-        return;
       }
+
+      return;
     }
 
     var propertyElement = _resolver.typePropertyResolver
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index a2dab45..6cb3570 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -945,6 +945,22 @@
         reference, findElement.method('foo'), 'void Function(int)');
   }
 
+  test_instanceMethod_explicitReceiver_getter_wrongNumberOfTypeArguments() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get foo => 0;
+}
+
+void f(A a) {
+  // Extra `()` to force reading the type.
+  ((a).foo<double>);
+}
+''');
+
+    var reference = findNode.functionReference('foo<double>');
+    assertFunctionReference(reference, null, 'dynamic');
+  }
+
   test_instanceMethod_explicitReceiver_otherExpression() async {
     await assertNoErrorsInCode('''
 class A {
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 12f0069..937f1c0 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -543,10 +543,13 @@
       // Loops and switches handle their own labels.
       visit(body);
     } else {
+      LocalState stateBefore = _state;
       JumpTarget jumpTarget = _localsMap.getJumpTargetForLabel(node);
       _setupBreaksAndContinues(jumpTarget);
+      _state = LocalState.childPath(stateBefore);
       visit(body);
-      _state.mergeAfterBreaks(_inferrer, _getBreaks(jumpTarget));
+      _state = stateBefore.mergeAfterBreaks(_inferrer, _getBreaks(jumpTarget),
+          keepOwnLocals: false);
       _clearBreaksAndContinues(jumpTarget);
     }
     return null;
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index c0c8468..1d417b8 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -82,11 +82,11 @@
   /// [FeatureOption]s which are shipped and cannot be toggled.
   late final List<FeatureOption> shipped = [
     newHolders,
+    legacyJavaScript,
   ];
 
   /// [FeatureOption]s which default to enabled.
   late final List<FeatureOption> shipping = [
-    legacyJavaScript,
     useContentSecurityPolicy,
   ];
 
@@ -948,7 +948,7 @@
     }
     if (enableFeature && feature.isNegativeFlag) {
       throw ArgumentError(
-          "$disableFeatureFlag has already shipped and cannot be enabled.");
+          "$enableFeatureFlag has been removed and cannot be enabled.");
     }
     if (disableFeature && !feature.isNegativeFlag) {
       throw ArgumentError(
diff --git a/pkg/compiler/test/inference/data/break_continue.dart b/pkg/compiler/test/inference/data/break_continue.dart
index 9fbb86e..d815f1d 100644
--- a/pkg/compiler/test/inference/data/break_continue.dart
+++ b/pkg/compiler/test/inference/data/break_continue.dart
@@ -12,6 +12,8 @@
   noContinueInWhile();
   breakInIf();
   noBreakInIf();
+  breakInBlock();
+  noBreakInBlock();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -107,7 +109,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// A break statement in a labeled statement.
+// A conditional break statement in a labeled statement.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*member: _breakInIf:Union([exact=JSString], [exact=JSUInt31])*/
@@ -150,3 +152,34 @@
   _noBreakInIf(true);
   _noBreakInIf(false);
 }
+
+////////////////////////////////////////////////////////////////////////////////
+// An unconditional break statement in a labeled statement.
+////////////////////////////////////////////////////////////////////////////////
+
+/*member: breakInBlock:Value([exact=JSString], value: "")*/
+breakInBlock() {
+  dynamic local = 42;
+  label:
+  {
+    local = '';
+    break label;
+    local = false;
+  }
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// The "labeled statement" above _without_ the break statement.
+////////////////////////////////////////////////////////////////////////////////
+
+/*member: noBreakInBlock:Value([exact=JSBool], value: false)*/
+noBreakInBlock() {
+  dynamic local = 42;
+  label:
+  {
+    local = '';
+    local = false;
+  }
+  return local;
+}
diff --git a/pkg/compiler/test/inference/data/general.dart b/pkg/compiler/test/inference/data/general.dart
index da299fc..db114da 100644
--- a/pkg/compiler/test/inference/data/general.dart
+++ b/pkg/compiler/test/inference/data/general.dart
@@ -560,13 +560,13 @@
   return a;
 }
 
-/*member: testDoWhile3:[exact=JSUInt31]*/
+/*member: testDoWhile3:Value([exact=JSBool], value: false)*/
 testDoWhile3() {
   dynamic a = 42;
   do {
     a = 'foo';
     if (true) continue;
-    return 42;
+    return false;
   } while (true);
   // ignore: dead_code
   return a;
diff --git a/tests/web/regress/48317_test.dart b/tests/web/regress/48317_test.dart
new file mode 100644
index 0000000..ff16cfc
--- /dev/null
+++ b/tests/web/regress/48317_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+helper(num c) => c * -1;
+
+void main() {
+  num a = 3;
+
+  label:
+  {
+    break label;
+  }
+
+  Expect.equals(-3, helper(a));
+}
diff --git a/tests/web_2/regress/48317_test.dart b/tests/web_2/regress/48317_test.dart
new file mode 100644
index 0000000..ff16cfc
--- /dev/null
+++ b/tests/web_2/regress/48317_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+helper(num c) => c * -1;
+
+void main() {
+  num a = 3;
+
+  label:
+  {
+    break label;
+  }
+
+  Expect.equals(-3, helper(a));
+}
diff --git a/tools/VERSION b/tools/VERSION
index cff630a..99ab702 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 120
+PRERELEASE 121
 PRERELEASE_PATCH 0
\ No newline at end of file