Version 2.15.0-286.0.dev

Merge commit 'd420995bd6da4ae626682a647569e8e71dcd3613' into 'dev'
diff --git a/tests/language/generic/typedef_test.dart b/tests/language/generic/typedef_test.dart
index 09dce80..d97bf8f 100644
--- a/tests/language/generic/typedef_test.dart
+++ b/tests/language/generic/typedef_test.dart
@@ -38,23 +38,23 @@
 main() {
   dynamic d = (int x, int y) => x + y;
   Expect.isTrue(d is A<int>);
-  Expect.equals((d as A<int>)(1, 2), 3);
+  Expect.equals((d as A<int>)(1, 2), 3); // Promotes `d` to `A<int>`.
 
   Expect.isFalse(d is B);
   Expect.throws(() => d as B);
 
-  d = <S>(S x, S y) => x is String ? x : y;
-  Expect.isFalse(d is A);
+  d = <S>(S x, S y) => x is String ? x : y; // Instantiates function literal.
+  Expect.isFalse(d is A); // `A<int>` is not a subtype of `A<dynamic>`.
   Expect.throws(() => d as A);
 
+  d = (<S>(S x, S y) => x is String ? x : y) as dynamic; // No instantiation.
   Expect.isTrue(d is B);
-  // TODO(jmesserly): Analyzer incorrectly rejects this form:
-  // Expect.equals((d as B)<int>(1, 2), 2);
+  Expect.equals((d as B)<int>(1, 2), 2);
+
   B b = d;
   Expect.equals(b<int>(1, 2), 2);
   Expect.equals(b<String>('a', 'b'), 'a');
 
-
   new G<int, String>().test();
   new G<String, String>().test();
 }
diff --git a/tools/VERSION b/tools/VERSION
index c85736a..8abe925 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 285
+PRERELEASE 286
 PRERELEASE_PATCH 0
\ No newline at end of file