Version 2.14.0-67.0.dev

Merge commit 'c75ca5a6136c2018aa1254708d564f0d521efe69' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 7109004..97dc6a1 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-04-29T17:48:25.665083",
+  "generated": "2021-04-30T12:11:55.367820",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 842903d..0c0ae9b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -223,8 +223,11 @@
 ## 2.12.3 - 2021-04-14
 
 This is a patch release that fixes a vulnerability in `dart:html` related to
-DOM clobbering. Thanks again to **Vincenzo di Cicco** for finding and reporting
-this vulnerability.
+DOM clobbering. See the [vulnerability advisory][CVE-2021-22540] for more
+details. Thanks again to **Vincenzo di Cicco** for finding and reporting this
+vulnerability.
+
+[CVE-2021-22540]: https://github.com/dart-lang/sdk/security/advisories/GHSA-3rfv-4jvg-9522
 
 ## 2.12.2 - 2021-03-17
 
diff --git a/DEPS b/DEPS
index 78974f4..d4ba74c 100644
--- a/DEPS
+++ b/DEPS
@@ -114,7 +114,7 @@
   "glob_rev": "a62acf590598f458d3198d9f2930c1c9dd4b1379",
   "html_rev": "00cd3c22dac0e68e6ed9e7e4945101aedb1b3109",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
-  "http_multi_server_rev" : "7aca9e87d4a68374b685334f20359320054b8d7b",
+  "http_multi_server_rev": "de1b312164c24a1690b46c6e97bd47eff40c4649",
   "http_parser_rev": "7720bfd42a0c096734c5213478fdce92c62f0293",
   "http_retry_rev": "845771af7bb5ab38ab740ce4a31f3b0c7680302b",
   "http_rev": "14e4fece54591436c1e3083df350b8e142067ae7",
@@ -170,7 +170,7 @@
   "watcher_rev": "3924194385fb215cef483193ed2879a618a3d69c",
   "webdriver_rev": "ff5ccb1522edf4bed578ead4d65e0cbc1f2c4f02",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
-  "web_socket_channel_rev": "d3e100de8feb0283a04732366bb591ebd2282d7d",
+  "web_socket_channel_rev": "6448ce532445a8a458fa191d9346df071ae0acad",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
   "webkit_inspection_protocol_rev": "6b15729292d030f2e5c5861022da4c5a4c11961c",
   "yaml_rev": "b4c4411631bda556ce9a45af1ab0eecaf9f3ac53",
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart
index 68ff856..a33675f 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/statements_test.dart
@@ -8,16 +8,16 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(AssertWithNullSafetyTest);
-    defineReflectiveTests(DoWithNullSafetyTest);
-    defineReflectiveTests(ForWithNullSafetyTest);
-    defineReflectiveTests(IfWithNullSafetyTest);
-    defineReflectiveTests(WhileWithNullSafetyTest);
+    defineReflectiveTests(AssertTest);
+    defineReflectiveTests(DoTest);
+    defineReflectiveTests(ForTest);
+    defineReflectiveTests(IfTest);
+    defineReflectiveTests(WhileTest);
   });
 }
 
 @reflectiveTest
-class AssertWithNullSafetyTest extends PubPackageResolutionTest {
+class AssertTest extends PubPackageResolutionTest {
   test_downward() async {
     await resolveTestCode('''
 void f() {
@@ -30,7 +30,7 @@
 }
 
 @reflectiveTest
-class DoWithNullSafetyTest extends PubPackageResolutionTest {
+class DoTest extends PubPackageResolutionTest {
   test_downward() async {
     await resolveTestCode('''
 void f() {
@@ -43,8 +43,18 @@
 }
 
 @reflectiveTest
-class ForWithNullSafetyTest extends PubPackageResolutionTest {
-  test_awaitForIn_dynamic_downward() async {
+class ForTest extends PubPackageResolutionTest {
+  test_awaitForIn_int_downward() async {
+    await resolveTestCode('''
+void f() async {
+  await for (int e in a()) {}
+}
+T a<T>() => throw '';
+''');
+    assertInvokeType(findNode.methodInvocation('a('), 'Stream<int> Function()');
+  }
+
+  test_awaitForIn_var_downward() async {
     await resolveTestCode('''
 void f() async {
   await for (var e in a()) {}
@@ -55,14 +65,15 @@
         findNode.methodInvocation('a('), 'Stream<Object?> Function()');
   }
 
-  test_awaitForIn_int_downward() async {
+  test_awaitForIn_var_upward() async {
     await resolveTestCode('''
-void f() async {
-  await for (int e in a()) {}
+void f(Stream<int> s) async {
+  await for (var e in s) {
+    e;
+  }
 }
-T a<T>() => throw '';
 ''');
-    assertInvokeType(findNode.methodInvocation('a('), 'Stream<int> Function()');
+    assertType(findNode.simple('e;'), 'int');
   }
 
   test_for_downward() async {
@@ -96,10 +107,21 @@
     assertInvokeType(
         findNode.methodInvocation('a('), 'Iterable<int> Function()');
   }
+
+  test_forIn_var_upward() async {
+    await resolveTestCode('''
+void f(List<int> s) async {
+  for (var e in s) {
+    e;
+  }
+}
+''');
+    assertType(findNode.simple('e;'), 'int');
+  }
 }
 
 @reflectiveTest
-class IfWithNullSafetyTest extends PubPackageResolutionTest {
+class IfTest extends PubPackageResolutionTest {
   test_downward() async {
     await resolveTestCode('''
 void f() {
@@ -112,7 +134,7 @@
 }
 
 @reflectiveTest
-class WhileWithNullSafetyTest extends PubPackageResolutionTest {
+class WhileTest extends PubPackageResolutionTest {
   test_downward() async {
     await resolveTestCode('''
 void f() {
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
index ff952a9..07478d0 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
@@ -15,6 +15,16 @@
 
 @reflectiveTest
 class ForInOfInvalidElementTypeTest extends PubPackageResolutionTest {
+  test_await_declaredVariable_dynamic() async {
+    await assertNoErrorsInCode('''
+f(dynamic a) async {
+  await for (int i in a) {
+    i;
+  }
+}
+''');
+  }
+
   test_await_declaredVariableWrongType() async {
     await assertErrorsInCode('''
 f(Stream<String> stream) async {
@@ -54,6 +64,16 @@
     ]);
   }
 
+  test_declaredVariable_dynamic() async {
+    await assertNoErrorsInCode('''
+f(dynamic a) {
+  for (int i in a) {
+    i;
+  }
+}
+''');
+  }
+
   test_declaredVariable_interfaceTypeTypedef_ok() async {
     await assertNoErrorsInCode('''
 typedef S = String;
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index 9f5acb2..c75dd89 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -10,13 +10,76 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ForInOfInvalidTypeTest);
-    defineReflectiveTests(ForInOfInvalidTypeWithNullSafetyTest);
+    defineReflectiveTests(ForInOfInvalidTypeWithoutNullSafetyTest);
   });
 }
 
 @reflectiveTest
 class ForInOfInvalidTypeTest extends PubPackageResolutionTest
-    with ForInOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+    with ForInOfInvalidTypeTestCases {
+  test_awaitForIn_never() async {
+    await assertErrorsInCode('''
+f(Never e) async {
+  await for (var id in e) {
+    id;
+  }
+}
+''', [
+      error(HintCode.DEAD_CODE, 32, 26),
+    ]);
+    // TODO(scheglov) extract for-in resolution and implement
+//    assertType(findNode.simple('id;'), 'Never');
+  }
+
+  test_awaitForIn_object() async {
+    await assertErrorsInCode('''
+f(Object e) async {
+  await for (var id in e) {
+    id;
+  }
+}
+''', [
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 43, 1),
+    ]);
+  }
+
+  test_forIn_interfaceTypeTypedef_iterable() async {
+    await assertNoErrorsInCode('''
+typedef L = List<String>;
+f(L e) {
+  for (var id in e) {
+    id;
+  }
+}
+''');
+  }
+
+  test_forIn_never() async {
+    await assertErrorsInCode('''
+f(Never e) {
+  for (var id in e) {
+    id;
+  }
+}
+''', [
+      error(HintCode.DEAD_CODE, 20, 26),
+    ]);
+    // TODO(scheglov) extract for-in resolution and implement
+//    assertType(findNode.simple('id;'), 'Never');
+  }
+
+  test_forIn_object() async {
+    await assertErrorsInCode('''
+f(Object e) async {
+  for (var id in e) {
+    id;
+  }
+}
+''', [
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 37, 1),
+    ]);
+  }
+}
 
 mixin ForInOfInvalidTypeTestCases on PubPackageResolutionTest {
   test_awaitForIn_dynamic() async {
@@ -41,6 +104,29 @@
     ]);
   }
 
+  test_awaitForIn_streamOfDynamic() async {
+    await assertNoErrorsInCode('''
+f(Stream<dynamic> e) async {
+  await for (var id in e) {
+    id;
+  }
+}
+''');
+  }
+
+  test_awaitForIn_streamOfDynamicSubclass() async {
+    await assertNoErrorsInCode('''
+abstract class MyStream<T> extends Stream<T> {
+  factory MyStream() => throw 0;
+}
+f(MyStream<dynamic> e) async {
+  await for (var id in e) {
+    id;
+  }
+}
+''');
+  }
+
   test_forIn_dynamic() async {
     await assertNoErrorsInCode('''
 f(dynamic e) {
@@ -75,44 +161,25 @@
 }
 
 @reflectiveTest
-class ForInOfInvalidTypeWithNullSafetyTest extends PubPackageResolutionTest
-    with ForInOfInvalidTypeTestCases {
-  test_awaitForIn_never() async {
-    await assertErrorsInCode('''
-f(Never e) async {
-  await for (var id in e) {
-    id;
-  }
-}
-''', [
-      error(HintCode.DEAD_CODE, 32, 26),
-    ]);
-    // TODO(scheglov) extract for-in resolution and implement
-//    assertType(findNode.simple('id;'), 'Never');
-  }
-
-  test_forIn_interfaceTypeTypedef_iterable() async {
+class ForInOfInvalidTypeWithoutNullSafetyTest extends PubPackageResolutionTest
+    with ForInOfInvalidTypeTestCases, WithoutNullSafetyMixin {
+  test_awaitForIn_object() async {
     await assertNoErrorsInCode('''
-typedef L = List<String>;
-f(L e) {
-  for (var id in e) {
+f(Object e) async {
+  await for (var id in e) {
     id;
   }
 }
 ''');
   }
 
-  test_forIn_never() async {
-    await assertErrorsInCode('''
-f(Never e) {
+  test_forIn_object() async {
+    await assertNoErrorsInCode('''
+f(Object e) async {
   for (var id in e) {
     id;
   }
 }
-''', [
-      error(HintCode.DEAD_CODE, 20, 26),
-    ]);
-    // TODO(scheglov) extract for-in resolution and implement
-//    assertType(findNode.simple('id;'), 'Never');
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 6a5a5cc..299a327 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -18,151 +18,6 @@
 class CheckerTest extends PubPackageResolutionTest with WithoutNullSafetyMixin {
   // TODO(https://github.com/dart-lang/sdk/issues/44666): Use null safety in
   //  test cases.
-  test_awaitForInCastsStreamElementToVariable() async {
-    await assertErrorsInCode('''
-abstract class MyStream<T> extends Stream<T> {
-  factory MyStream() => throw 0;
-}
-
-main() async {
-  // Don't choke if sequence is not stream.
-  await for (var i in 1234) {}
-
-  // Dynamic cast.
-  await for (String s in new MyStream<dynamic>()) {}
-
-  // Identity cast.
-  await for (String s in new MyStream<String>()) {}
-
-  // Untyped.
-  await for (var s in new MyStream<String>()) {}
-
-  // Downcast.
-  await for (int i in new MyStream<num>()) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 159, 1),
-      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 164, 4),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 213, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 287, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 351, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 416, 1),
-    ]);
-  }
-
-  test_awaitForInCastsSupertypeSequenceToStream() async {
-    await assertErrorsInCode('''
-main() async {
-  dynamic d;
-  await for (var i in d) {}
-
-  Object o;
-  await for (var i in o) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 45, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 86, 1),
-    ]);
-  }
-
-  test_binaryAndIndexOperators() async {
-    await assertErrorsInCode('''
-class A {
-  A operator *(B b) => null;
-  A operator /(B b) => null;
-  A operator ~/(B b) => null;
-  A operator %(B b) => null;
-  A operator +(B b) => null;
-  A operator -(B b) => null;
-  A operator <<(B b) => null;
-  A operator >>(B b) => null;
-  A operator &(B b) => null;
-  A operator ^(B b) => null;
-  A operator |(B b) => null;
-  A operator[](B b) => null;
-}
-
-class B {
-  A operator -(B b) => null;
-}
-
-foo() => new A();
-
-test() {
-  A a = new A();
-  B b = new B();
-  var c = foo();
-  a = a * b;
-  a = a * c;
-  a = a / b;
-  a = a ~/ b;
-  a = a % b;
-  a = a + b;
-  a = a + a;
-  a = a - b;
-  b = b - b;
-  a = a << b;
-  a = a >> b;
-  a = a & b;
-  a = a ^ b;
-  a = a | b;
-  c = (c + b);
-
-  String x = 'hello';
-  int y = 42;
-  x = x + x;
-  x = x + c;
-  x = x + y;
-
-  bool p = true;
-  p = p && p;
-  p = p && c;
-  p = (c) && p;
-  p = (c) && c;
-  p = y && p;
-  p = c == y;
-
-  a = a[b];
-  a = a[c];
-  c = (c[b]);
-  a[y];
-}
-''', [
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 574, 1),
-      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 596, 5),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 758, 1),
-      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 845, 1),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 910, 1),
-    ]);
-  }
-
-  test_callMethodOnFunctions() async {
-    await assertErrorsInCode(r'''
-void f(int x) => print(x);
-main() {
-  f.call('hi');
-}
-''', [
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 45, 4),
-    ]);
-  }
-
-  test_castsInConditions() async {
-    await assertErrorsInCode('''
-main() {
-  bool b = true;
-  num x = b ? 1 : 2.3;
-  int y = b ? 1 : 2.3;
-  String z = !b ? "hello" : null;
-  z = b ? null : "hello";
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 32, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 55, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
-    ]);
-  }
-
   test_castsInConstantContexts() async {
     await assertErrorsInCode('''
 class A {
@@ -945,67 +800,6 @@
     ]);
   }
 
-  test_forInCastsIterateElementToVariable() async {
-    await assertErrorsInCode('''
-main() {
-  // Don't choke if sequence is not iterable.
-  for (var i in 1234) {}
-
-  // Dynamic cast.
-  for (String s in <dynamic>[]) {}
-
-  // Identity cast.
-  for (String s in <String>[]) {}
-
-  // Untyped.
-  for (var s in <String>[]) {}
-
-  // Downcast.
-  for (int i in <num>[]) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 66, 1),
-      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 71, 4),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 114, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 170, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 216, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 263, 1),
-    ]);
-  }
-
-  test_forInCastsSupertypeSequenceToIterate() async {
-    await assertErrorsInCode('''
-main() {
-  dynamic d;
-  for (var i in d) {}
-
-  Object o;
-  for (var i in o) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 33, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 68, 1),
-    ]);
-  }
-
-  test_forLoopVariable() async {
-    await assertErrorsInCode('''
-foo() {
-  for (int i = 0; i < 10; i++) {
-    i = "hi";
-  }
-}
-bar() {
-  for (var i = 0; i < 10; i++) {
-    int j = i + 1;
-  }
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 49, 4),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 110, 1),
-    ]);
-  }
-
   test_functionModifiers_async() async {
     await assertErrorsInCode('''
 import 'dart:math' show Random;
@@ -2491,30 +2285,6 @@
     );
   }
 
-  test_implicitCasts_forEach() async {
-    await _assertImplicitCasts(r'''
-void f(dynamic a) {
-  for (int v in a) {
-    v;
-  }
-}
-''', [
-      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 36, 1),
-    ]);
-  }
-
-  test_implicitCasts_forEach_async() async {
-    await _assertImplicitCasts(r'''
-void f(dynamic a) async {
-  await for (int v in a) {
-    v;
-  }
-}
-''', [
-      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 48, 1),
-    ]);
-  }
-
   test_implicitCasts_functionCall() async {
     await _assertImplicitCasts(r'''
 int f(int i) => i;
diff --git a/tools/VERSION b/tools/VERSION
index 48a84ad..59647e2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 66
+PRERELEASE 67
 PRERELEASE_PATCH 0
\ No newline at end of file