Version 2.14.0-252.0.dev

Merge commit '070e32e5537cc1f1684421479039e345dbecedf0' into 'dev'
diff --git a/tests/language/closure/identity_equality_tearoff_test.dart b/tests/language/closure/identity_equality_tearoff_test.dart
new file mode 100644
index 0000000..cdf7585
--- /dev/null
+++ b/tests/language/closure/identity_equality_tearoff_test.dart
@@ -0,0 +1,288 @@
+// Copyright (c) 2021, 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';
+
+// Test identity and equality of function/method tearoffs.
+
+void checkIdentical(Object o1, Object o2) {
+  Expect.isTrue(identical(o1, o2));
+  Expect.isTrue(o1 == o2 && o2 == o1);
+}
+
+void checkEqual(Object o1, Object o2) {
+  Expect.isTrue(o1 == o2 && o2 == o1);
+  // The behavior of `identical` is unspecified, optimizations could
+  // make a difference and should be allowed: Do not expect anything.
+}
+
+void checkUnequal(Object o1, Object o2) {
+  Expect.isTrue(o1 != o2 && o2 != o1);
+  // We expect that `identical` is never true when `==` yields false.
+  Expect.isFalse(identical(o1, o2));
+}
+
+class CheckIdentical {
+  const CheckIdentical(Object o1, Object o2) : assert(identical(o1, o2));
+}
+
+class CheckNotIdentical {
+  const CheckNotIdentical(Object o1, Object o2) : assert(!identical(o1, o2));
+}
+
+void topLevelFunction() {}
+X? genericTopLevelFunction<X>() => null;
+
+class A {
+  static void staticMethod() {}
+  static X? genericStaticMethod<X>() => null;
+
+  void instanceMethod() {}
+  X? genericInstanceMethod<X>() => null;
+}
+
+const cTopLevelFunction = topLevelFunction;
+const cGenericTopLevelFunction = genericTopLevelFunction;
+const cStaticMethod = A.staticMethod;
+const cGenericStaticMethod = A.genericStaticMethod;
+
+const int? Function() cIntTopLevelFunction1 = genericTopLevelFunction;
+const int? Function() cIntStaticMethod1 = A.genericStaticMethod;
+const int? Function() cIntTopLevelFunction2 = genericTopLevelFunction;
+const int? Function() cIntStaticMethod2 = A.genericStaticMethod;
+
+const String? Function() cStringTopLevelFunction = genericTopLevelFunction;
+const String? Function() cStringStaticMethod = A.genericStaticMethod;
+
+int? Function() vIntTopLevelFunction1 = genericTopLevelFunction;
+int? Function() vIntStaticMethod1 = A.genericStaticMethod;
+int? Function() vIntTopLevelFunction2 = genericTopLevelFunction;
+int? Function() vIntStaticMethod2 = A.genericStaticMethod;
+
+String? Function() vStringTopLevelFunction = genericTopLevelFunction;
+String? Function() vStringStaticMethod = A.genericStaticMethod;
+
+void main() {
+  var vTopLevelFunction = topLevelFunction;
+  var vGenericTopLevelFunction = genericTopLevelFunction;
+  var vStaticMethod = A.staticMethod;
+  var vGenericStaticMethod = A.genericStaticMethod;
+
+  var a = A();
+  var vInstanceMethod = a.instanceMethod;
+  var vGenericInstanceMethod = a.genericInstanceMethod;
+
+  checkIdentical(topLevelFunction, topLevelFunction);
+  checkIdentical(A.staticMethod, A.staticMethod);
+  checkEqual(a.instanceMethod, a.instanceMethod);
+  checkIdentical(genericTopLevelFunction, genericTopLevelFunction);
+  checkIdentical(A.genericStaticMethod, A.genericStaticMethod);
+  checkEqual(a.genericInstanceMethod, a.genericInstanceMethod);
+  checkIdentical(topLevelFunction, cTopLevelFunction);
+  checkIdentical(A.staticMethod, cStaticMethod);
+  checkIdentical(genericTopLevelFunction, cGenericTopLevelFunction);
+  checkIdentical(A.genericStaticMethod, cGenericStaticMethod);
+  checkIdentical(topLevelFunction, vTopLevelFunction);
+  checkIdentical(A.staticMethod, vStaticMethod);
+  checkEqual(a.instanceMethod, vInstanceMethod);
+  checkIdentical(genericTopLevelFunction, vGenericTopLevelFunction);
+  checkIdentical(A.genericStaticMethod, vGenericStaticMethod);
+  checkEqual(a.genericInstanceMethod, vGenericInstanceMethod);
+  checkIdentical(cTopLevelFunction, vTopLevelFunction);
+  checkIdentical(cStaticMethod, vStaticMethod);
+  checkIdentical(cGenericTopLevelFunction, vGenericTopLevelFunction);
+  checkIdentical(cGenericStaticMethod, vGenericStaticMethod);
+
+  int? Function() vIntInstanceMethod1 = a.genericInstanceMethod;
+  int? Function() vIntInstanceMethod2 = a.genericInstanceMethod;
+  String? Function() vStringInstanceMethod = a.genericInstanceMethod;
+
+  checkIdentical(cIntTopLevelFunction1, cIntTopLevelFunction2);
+  checkIdentical(cIntStaticMethod1, cIntStaticMethod2);
+  checkIdentical(cIntTopLevelFunction1, vIntTopLevelFunction2);
+  checkIdentical(cIntStaticMethod1, vIntStaticMethod2);
+  checkIdentical(vIntTopLevelFunction1, vIntTopLevelFunction2);
+  checkIdentical(vIntStaticMethod1, vIntStaticMethod2);
+
+  const CheckIdentical(topLevelFunction, topLevelFunction);
+  const CheckIdentical(A.staticMethod, A.staticMethod);
+  const CheckIdentical(genericTopLevelFunction, genericTopLevelFunction);
+  const CheckIdentical(A.genericStaticMethod, A.genericStaticMethod);
+  const CheckIdentical(topLevelFunction, cTopLevelFunction);
+  const CheckIdentical(A.staticMethod, cStaticMethod);
+  const CheckIdentical(genericTopLevelFunction, cGenericTopLevelFunction);
+  const CheckIdentical(A.genericStaticMethod, cGenericStaticMethod);
+  const CheckIdentical(cIntTopLevelFunction1, cIntTopLevelFunction2);
+  const CheckIdentical(cIntStaticMethod1, cIntStaticMethod2);
+
+  checkUnequal(topLevelFunction, genericTopLevelFunction);
+  checkUnequal(topLevelFunction, A.staticMethod);
+  checkUnequal(topLevelFunction, A.genericStaticMethod);
+  checkUnequal(topLevelFunction, a.instanceMethod);
+  checkUnequal(topLevelFunction, a.genericInstanceMethod);
+  checkUnequal(genericTopLevelFunction, topLevelFunction);
+  checkUnequal(genericTopLevelFunction, A.staticMethod);
+  checkUnequal(genericTopLevelFunction, A.genericStaticMethod);
+  checkUnequal(genericTopLevelFunction, a.instanceMethod);
+  checkUnequal(genericTopLevelFunction, a.genericInstanceMethod);
+  checkUnequal(A.staticMethod, topLevelFunction);
+  checkUnequal(A.staticMethod, genericTopLevelFunction);
+  checkUnequal(A.staticMethod, A.genericStaticMethod);
+  checkUnequal(A.staticMethod, a.instanceMethod);
+  checkUnequal(A.staticMethod, a.genericInstanceMethod);
+  checkUnequal(A.genericStaticMethod, topLevelFunction);
+  checkUnequal(A.genericStaticMethod, genericTopLevelFunction);
+  checkUnequal(A.genericStaticMethod, A.staticMethod);
+  checkUnequal(A.genericStaticMethod, a.instanceMethod);
+  checkUnequal(A.genericStaticMethod, a.genericInstanceMethod);
+  checkUnequal(a.instanceMethod, topLevelFunction);
+  checkUnequal(a.instanceMethod, genericTopLevelFunction);
+  checkUnequal(a.instanceMethod, A.staticMethod);
+  checkUnequal(a.instanceMethod, A.genericStaticMethod);
+  checkUnequal(a.instanceMethod, a.genericInstanceMethod);
+  checkUnequal(a.genericInstanceMethod, topLevelFunction);
+  checkUnequal(a.genericInstanceMethod, genericTopLevelFunction);
+  checkUnequal(a.genericInstanceMethod, A.staticMethod);
+  checkUnequal(a.genericInstanceMethod, A.genericStaticMethod);
+  checkUnequal(a.genericInstanceMethod, a.instanceMethod);
+  checkUnequal(topLevelFunction, cGenericTopLevelFunction);
+  checkUnequal(topLevelFunction, cStaticMethod);
+  checkUnequal(topLevelFunction, cGenericStaticMethod);
+  checkUnequal(genericTopLevelFunction, cTopLevelFunction);
+  checkUnequal(genericTopLevelFunction, cStaticMethod);
+  checkUnequal(genericTopLevelFunction, cGenericStaticMethod);
+  checkUnequal(A.staticMethod, cTopLevelFunction);
+  checkUnequal(A.staticMethod, cGenericTopLevelFunction);
+  checkUnequal(A.staticMethod, cGenericStaticMethod);
+  checkUnequal(A.genericStaticMethod, cTopLevelFunction);
+  checkUnequal(A.genericStaticMethod, cGenericTopLevelFunction);
+  checkUnequal(A.genericStaticMethod, cStaticMethod);
+  checkUnequal(a.instanceMethod, cTopLevelFunction);
+  checkUnequal(a.instanceMethod, cGenericTopLevelFunction);
+  checkUnequal(a.instanceMethod, cStaticMethod);
+  checkUnequal(a.instanceMethod, cGenericStaticMethod);
+  checkUnequal(a.genericInstanceMethod, cTopLevelFunction);
+  checkUnequal(a.genericInstanceMethod, cGenericTopLevelFunction);
+  checkUnequal(a.genericInstanceMethod, cStaticMethod);
+  checkUnequal(a.genericInstanceMethod, cGenericStaticMethod);
+  checkUnequal(topLevelFunction, vGenericTopLevelFunction);
+  checkUnequal(topLevelFunction, vStaticMethod);
+  checkUnequal(topLevelFunction, vGenericStaticMethod);
+  checkUnequal(topLevelFunction, vInstanceMethod);
+  checkUnequal(topLevelFunction, vGenericInstanceMethod);
+  checkUnequal(genericTopLevelFunction, vTopLevelFunction);
+  checkUnequal(genericTopLevelFunction, vStaticMethod);
+  checkUnequal(genericTopLevelFunction, vGenericStaticMethod);
+  checkUnequal(genericTopLevelFunction, vInstanceMethod);
+  checkUnequal(genericTopLevelFunction, vGenericInstanceMethod);
+  checkUnequal(A.staticMethod, vTopLevelFunction);
+  checkUnequal(A.staticMethod, vGenericTopLevelFunction);
+  checkUnequal(A.staticMethod, vGenericStaticMethod);
+  checkUnequal(A.staticMethod, vInstanceMethod);
+  checkUnequal(A.staticMethod, vGenericInstanceMethod);
+  checkUnequal(A.genericStaticMethod, vTopLevelFunction);
+  checkUnequal(A.genericStaticMethod, vGenericTopLevelFunction);
+  checkUnequal(A.genericStaticMethod, vStaticMethod);
+  checkUnequal(A.genericStaticMethod, vInstanceMethod);
+  checkUnequal(A.genericStaticMethod, vGenericInstanceMethod);
+  checkUnequal(a.instanceMethod, vTopLevelFunction);
+  checkUnequal(a.instanceMethod, vGenericTopLevelFunction);
+  checkUnequal(a.instanceMethod, vStaticMethod);
+  checkUnequal(a.instanceMethod, vGenericStaticMethod);
+  checkUnequal(a.instanceMethod, vGenericInstanceMethod);
+  checkUnequal(a.genericInstanceMethod, vTopLevelFunction);
+  checkUnequal(a.genericInstanceMethod, vGenericTopLevelFunction);
+  checkUnequal(a.genericInstanceMethod, vStaticMethod);
+  checkUnequal(a.genericInstanceMethod, vGenericStaticMethod);
+  checkUnequal(a.genericInstanceMethod, vInstanceMethod);
+  checkUnequal(cTopLevelFunction, vGenericTopLevelFunction);
+  checkUnequal(cTopLevelFunction, vStaticMethod);
+  checkUnequal(cTopLevelFunction, vGenericStaticMethod);
+  checkUnequal(cTopLevelFunction, vInstanceMethod);
+  checkUnequal(cTopLevelFunction, vGenericInstanceMethod);
+  checkUnequal(cGenericTopLevelFunction, vTopLevelFunction);
+  checkUnequal(cGenericTopLevelFunction, vStaticMethod);
+  checkUnequal(cGenericTopLevelFunction, vGenericStaticMethod);
+  checkUnequal(cGenericTopLevelFunction, vInstanceMethod);
+  checkUnequal(cGenericTopLevelFunction, vGenericInstanceMethod);
+  checkUnequal(cStaticMethod, vTopLevelFunction);
+  checkUnequal(cStaticMethod, vGenericTopLevelFunction);
+  checkUnequal(cStaticMethod, vGenericStaticMethod);
+  checkUnequal(cStaticMethod, vInstanceMethod);
+  checkUnequal(cStaticMethod, vGenericInstanceMethod);
+  checkUnequal(cGenericStaticMethod, vTopLevelFunction);
+  checkUnequal(cGenericStaticMethod, vGenericTopLevelFunction);
+  checkUnequal(cGenericStaticMethod, vStaticMethod);
+  checkUnequal(cGenericStaticMethod, vInstanceMethod);
+  checkUnequal(cGenericStaticMethod, vGenericInstanceMethod);
+
+  var a2 = A();
+  var v2InstanceMethod = a2.instanceMethod;
+  var v2GenericInstanceMethod = a2.genericInstanceMethod;
+
+  checkUnequal(vInstanceMethod, v2InstanceMethod);
+  checkUnequal(vGenericInstanceMethod, v2GenericInstanceMethod);
+
+  const CheckNotIdentical(topLevelFunction, genericTopLevelFunction);
+  const CheckNotIdentical(topLevelFunction, A.staticMethod);
+  const CheckNotIdentical(topLevelFunction, A.genericStaticMethod);
+  const CheckNotIdentical(genericTopLevelFunction, topLevelFunction);
+  const CheckNotIdentical(genericTopLevelFunction, A.staticMethod);
+  const CheckNotIdentical(genericTopLevelFunction, A.genericStaticMethod);
+  const CheckNotIdentical(A.staticMethod, topLevelFunction);
+  const CheckNotIdentical(A.staticMethod, genericTopLevelFunction);
+  const CheckNotIdentical(A.staticMethod, A.genericStaticMethod);
+  const CheckNotIdentical(A.genericStaticMethod, topLevelFunction);
+  const CheckNotIdentical(A.genericStaticMethod, genericTopLevelFunction);
+  const CheckNotIdentical(A.genericStaticMethod, A.staticMethod);
+  const CheckNotIdentical(topLevelFunction, cGenericTopLevelFunction);
+  const CheckNotIdentical(topLevelFunction, cStaticMethod);
+  const CheckNotIdentical(topLevelFunction, cGenericStaticMethod);
+  const CheckNotIdentical(genericTopLevelFunction, cTopLevelFunction);
+  const CheckNotIdentical(genericTopLevelFunction, cStaticMethod);
+  const CheckNotIdentical(genericTopLevelFunction, cGenericStaticMethod);
+  const CheckNotIdentical(A.staticMethod, cTopLevelFunction);
+  const CheckNotIdentical(A.staticMethod, cGenericTopLevelFunction);
+  const CheckNotIdentical(A.staticMethod, cGenericStaticMethod);
+  const CheckNotIdentical(A.genericStaticMethod, cTopLevelFunction);
+  const CheckNotIdentical(A.genericStaticMethod, cGenericTopLevelFunction);
+  const CheckNotIdentical(A.genericStaticMethod, cStaticMethod);
+
+  checkUnequal(cIntTopLevelFunction1, cIntStaticMethod1);
+  checkUnequal(cIntTopLevelFunction1, vIntStaticMethod1);
+  checkUnequal(cIntTopLevelFunction1, vIntInstanceMethod1);
+  checkUnequal(cIntStaticMethod1, vIntTopLevelFunction1);
+  checkUnequal(cIntStaticMethod1, vIntInstanceMethod1);
+  checkUnequal(vIntTopLevelFunction1, vIntStaticMethod1);
+  checkUnequal(vIntTopLevelFunction1, vIntInstanceMethod1);
+  checkUnequal(vIntStaticMethod1, vIntInstanceMethod1);
+
+  int? Function() v2IntInstanceMethod = a2.genericInstanceMethod;
+
+  checkUnequal(vIntInstanceMethod1, v2IntInstanceMethod);
+  checkUnequal(vIntInstanceMethod1, vStringInstanceMethod);
+
+  const CheckNotIdentical(cIntTopLevelFunction1, cIntStaticMethod1);
+
+  const CheckNotIdentical(cIntTopLevelFunction1, cStringTopLevelFunction);
+  const CheckNotIdentical(cIntStaticMethod1, cStringStaticMethod);
+
+  <X>() {
+    X? Function() vXTopLevelFunction1 = genericTopLevelFunction;
+    X? Function() vXStaticMethod1 = A.genericStaticMethod;
+    X? Function() vXTopLevelFunction2 = genericTopLevelFunction;
+    X? Function() vXStaticMethod2 = A.genericStaticMethod;
+    X? Function() vXInstanceMethod1 = a.genericInstanceMethod;
+    X? Function() vXInstanceMethod2 = a.genericInstanceMethod;
+
+    checkUnequal(vXTopLevelFunction1, vXStaticMethod1);
+    checkUnequal(vXTopLevelFunction1, vXInstanceMethod1);
+    checkUnequal(vXStaticMethod1, vXInstanceMethod1);
+
+    int? Function() v2XInstanceMethod = a2.genericInstanceMethod;
+
+    checkUnequal(vXInstanceMethod1, v2XInstanceMethod);
+    checkUnequal(vXInstanceMethod1, vStringInstanceMethod);
+  }<int>();
+}
diff --git a/tools/VERSION b/tools/VERSION
index c974f59..70d8216 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 251
+PRERELEASE 252
 PRERELEASE_PATCH 0
\ No newline at end of file