Version 2.13.0-14.0.dev

Merge commit '6d58f653b1b86d8d4754e1ba38a86be05e3ea1c5' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index 1f5bbe7..26f56fc 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -107,6 +107,8 @@
       typeParameters = <TypeParameter>[];
       for (TypeVariableBuilder t in typeVariables) {
         typeParameters.add(t.parameter);
+        // Build the bound to detect cycles in typedefs.
+        t.bound?.build(library, origin);
       }
     }
     return new FunctionType(positionalParameters, builtReturnType,
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index c4c5502..2f94d08 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -426,4 +426,18 @@
   }
 }
 
+/// Used to detect cycles in the declaration of a typedef
+///
+/// When a typedef is built, [pendingTypeAliasMarker] is used as a placeholder
+/// value to indicated that the process has started.  If somewhere in the
+/// process of building the typedef this value is encountered, it's replaced
+/// with [cyclicTypeAliasMarker] as the result of the build process.
+final InvalidType pendingTypeAliasMarker = new InvalidType();
+
+/// Used to detect cycles in the declaration of a typedef
+///
+/// When a typedef is built, [pendingTypeAliasMarker] is used as a placeholder
+/// value to indicated that the process has started.  If somewhere in the
+/// process of building the typedef this value is encountered, it's replaced
+/// with [cyclicTypeAliasMarker] as the result of the build process.
 final InvalidType cyclicTypeAliasMarker = new InvalidType();
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 22a3f8b..cf844af 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -6,6 +6,9 @@
 
 library fasta.incremental_compiler;
 
+import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
+    show ScannerConfiguration;
+
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/base/nnbd_mode.dart';
@@ -1021,7 +1024,17 @@
       if (previousSource == null || previousSource.isEmpty) {
         return null;
       }
-      String before = textualOutline(previousSource, performModelling: true);
+      ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
+          enableExtensionMethods: true /* can't be disabled */,
+          enableNonNullable: builder
+              .isNonNullableByDefault /* depends on language version etc */,
+          enableTripleShift:
+              /* should this be on the library? */
+              /* this is what the constant evaluator does */
+              userCode
+                  .isExperimentEnabledGlobally(ExperimentalFlag.tripleShift));
+      String before = textualOutline(previousSource, scannerConfiguration,
+          performModelling: true);
       if (before == null) {
         return null;
       }
@@ -1029,8 +1042,8 @@
       FileSystemEntity entity =
           c.options.fileSystem.entityForUri(builder.fileUri);
       if (await entity.exists()) {
-        now =
-            textualOutline(await entity.readAsBytes(), performModelling: true);
+        now = textualOutline(await entity.readAsBytes(), scannerConfiguration,
+            performModelling: true);
       }
       if (before != now) {
         return null;
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index 5f1a2d2..b84b276 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -128,17 +128,20 @@
 
   DartType buildThisType() {
     if (thisType != null) {
-      if (identical(thisType, cyclicTypeAliasMarker)) {
+      if (identical(thisType, pendingTypeAliasMarker)) {
+        thisType = cyclicTypeAliasMarker;
         library.addProblem(templateCyclicTypedef.withArguments(name),
             charOffset, noLength, fileUri);
         return const InvalidType();
+      } else if (identical(thisType, cyclicTypeAliasMarker)) {
+        return const InvalidType();
       }
       return thisType;
     }
     // It is a compile-time error for an alias (typedef) to refer to itself. We
     // detect cycles by detecting recursive calls to this method using an
     // instance of InvalidType that isn't identical to `const InvalidType()`.
-    thisType = cyclicTypeAliasMarker;
+    thisType = pendingTypeAliasMarker;
     TypeBuilder type = this.type;
     if (type != null) {
       DartType builtType =
@@ -150,7 +153,11 @@
             tv.bound?.build(library);
           }
         }
-        return thisType = builtType;
+        if (identical(thisType, cyclicTypeAliasMarker)) {
+          return thisType = const InvalidType();
+        } else {
+          return thisType = builtType;
+        }
       } else {
         return thisType = const InvalidType();
       }
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index 3f1cb92..a658bc4 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
@@ -26,6 +26,8 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
+import '../messages.dart' show Message;
+
 abstract class _Chunk implements Comparable<_Chunk> {
   int originalPosition;
 
@@ -422,11 +424,14 @@
 //              "show A show B" could just be "show A, B".
 //              "show A, B, C hide A show A" would be empty.
 
-String textualOutline(List<int> rawBytes,
-    {ScannerConfiguration configuration,
-    bool throwOnUnexpected: false,
-    bool performModelling: false,
-    bool addMarkerForUnknownForTest: false}) {
+String textualOutline(
+  List<int> rawBytes,
+  ScannerConfiguration configuration, {
+  bool throwOnUnexpected: false,
+  bool performModelling: false,
+  bool addMarkerForUnknownForTest: false,
+  bool returnNullOnError: true,
+}) {
   Uint8List bytes = new Uint8List(rawBytes.length + 1);
   bytes.setRange(0, rawBytes.length, rawBytes);
 
@@ -451,6 +456,9 @@
   TextualOutlineListener listener = new TextualOutlineListener();
   ClassMemberParser classMemberParser = new ClassMemberParser(listener);
   classMemberParser.parseUnit(firstToken);
+  if (listener.gotError && returnNullOnError) {
+    return null;
+  }
 
   Token nextToken = firstToken;
   _UnknownTokenBuilder currentUnknown = new _UnknownTokenBuilder();
@@ -653,16 +661,17 @@
 main(List<String> args) {
   File f = new File(args[0]);
   Uint8List data = f.readAsBytesSync();
-  String outline =
-      textualOutline(data, throwOnUnexpected: true, performModelling: true);
+  ScannerConfiguration scannerConfiguration = new ScannerConfiguration();
+  String outline = textualOutline(data, scannerConfiguration,
+      throwOnUnexpected: true, performModelling: true);
   if (args.length > 1 && args[1] == "--overwrite") {
     f.writeAsStringSync(outline);
   } else if (args.length > 1 && args[1] == "--benchmark") {
     Stopwatch stopwatch = new Stopwatch()..start();
     int numRuns = 100;
     for (int i = 0; i < numRuns; i++) {
-      String outline2 =
-          textualOutline(data, throwOnUnexpected: true, performModelling: true);
+      String outline2 = textualOutline(data, scannerConfiguration,
+          throwOnUnexpected: true, performModelling: true);
       if (outline2 != outline) throw "Not the same result every time";
     }
     stopwatch.stop();
@@ -671,8 +680,8 @@
     stopwatch = new Stopwatch()..start();
     numRuns = 2500;
     for (int i = 0; i < numRuns; i++) {
-      String outline2 =
-          textualOutline(data, throwOnUnexpected: true, performModelling: true);
+      String outline2 = textualOutline(data, scannerConfiguration,
+          throwOnUnexpected: true, performModelling: true);
       if (outline2 != outline) throw "Not the same result every time";
     }
     stopwatch.stop();
@@ -684,11 +693,12 @@
 }
 
 class TextualOutlineListener extends Listener {
-  Map<Token, _ClassChunk> classStartToChunk = {};
-  Map<Token, _TokenChunk> elementStartToChunk = {};
-  Map<Token, _MetadataChunk> metadataStartToChunk = {};
-  Map<Token, _SingleImportExportChunk> importExportsStartToChunk = {};
-  Map<Token, _TokenChunk> unsortableElementStartToChunk = {};
+  bool gotError = false;
+  final Map<Token, _ClassChunk> classStartToChunk = {};
+  final Map<Token, _TokenChunk> elementStartToChunk = {};
+  final Map<Token, _MetadataChunk> metadataStartToChunk = {};
+  final Map<Token, _SingleImportExportChunk> importExportsStartToChunk = {};
+  final Map<Token, _TokenChunk> unsortableElementStartToChunk = {};
 
   @override
   void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
@@ -869,4 +879,10 @@
     _combinators = null;
     firstShowOrHide = null;
   }
+
+  @override
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    gotError = true;
+  }
 }
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index 0749061..be6565f 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -983,7 +983,8 @@
       // instead.
       if (uri.toString().endsWith(".dart")) {
         String textualOutlined =
-            textualOutline(data)?.replaceAll(RegExp(r'\n+'), "\n");
+            textualOutline(data, _getScannerConfiguration(uri))
+                ?.replaceAll(RegExp(r'\n+'), "\n");
 
         bool outlined = false;
         if (textualOutlined != null) {
@@ -1765,7 +1766,14 @@
     return false;
   }
 
-  bool _isUriNnbd(Uri uri) {
+  ScannerConfiguration _getScannerConfiguration(Uri uri) {
+    return new ScannerConfiguration(
+        enableExtensionMethods: true,
+        enableNonNullable: _isUriNnbd(uri, crashOnFail: false),
+        enableTripleShift: false);
+  }
+
+  bool _isUriNnbd(Uri uri, {bool crashOnFail: true}) {
     Uri asImportUri = _getImportUri(uri);
     LibraryBuilder libraryBuilder = _latestCrashingIncrementalCompiler
         .userCode.loader.builders[asImportUri];
@@ -1788,7 +1796,11 @@
         }
       }
     }
-    throw "Couldn't lookup $uri at all!";
+    if (crashOnFail) {
+      throw "Couldn't lookup $uri at all!";
+    } else {
+      return false;
+    }
   }
 
   Future<bool> _crashesOnCompile(Component initialComponent) async {
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index 7688f80..0a88cd1 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.dart
@@ -83,12 +83,15 @@
       TestDescription description, Context context) async {
     List<int> bytes = new File.fromUri(description.uri).readAsBytesSync();
     for (bool modelled in [false, true]) {
-      String result = textualOutline(bytes,
-          throwOnUnexpected: true,
-          performModelling: modelled,
-          addMarkerForUnknownForTest: modelled,
-          configuration:
-              const ScannerConfiguration(enableExtensionMethods: true));
+      // TODO(jensj): NNBD should be configured correctly.
+      String result = textualOutline(
+        bytes,
+        const ScannerConfiguration(enableExtensionMethods: true),
+        throwOnUnexpected: true,
+        performModelling: modelled,
+        addMarkerForUnknownForTest: modelled,
+        returnNullOnError: false,
+      );
       if (result == null) {
         return new Result(
             null, context.expectationSet["EmptyOutput"], description.uri);
diff --git a/pkg/front_end/test/textual_outline_test.dart b/pkg/front_end/test/textual_outline_test.dart
index b6ea904..345fa42 100644
--- a/pkg/front_end/test/textual_outline_test.dart
+++ b/pkg/front_end/test/textual_outline_test.dart
@@ -5,14 +5,22 @@
 // @dart = 2.9
 
 import "dart:convert";
-import "package:front_end/src/fasta/util/textual_outline.dart";
+
+import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
+    show ScannerConfiguration;
+
+import "package:front_end/src/fasta/util/textual_outline.dart"
+    show textualOutline;
+
+const ScannerConfiguration scannerConfiguration =
+    const ScannerConfiguration(enableExtensionMethods: true);
 
 main() {
   // Doesn't sort if not asked to perform modelling.
   String result = textualOutline(utf8.encode("""
 b() { print("hello"); }
 a() { print("hello"); }
-"""), throwOnUnexpected: true, performModelling: false);
+"""), scannerConfiguration, throwOnUnexpected: true, performModelling: false);
   if (result !=
       """
 b() {}
@@ -25,7 +33,7 @@
   result = textualOutline(utf8.encode("""
 b() { print("hello"); }
 a() { print("hello"); }
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -41,7 +49,7 @@
   // Procedure without content.
   result = textualOutline(utf8.encode("""
 a() {}
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -56,7 +64,7 @@
 a() {
   // Whatever
 }
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -70,7 +78,7 @@
   result = textualOutline(utf8.encode("""
 class B {}
 class A {}
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -87,7 +95,7 @@
 class A {
   // Whatever
 }
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -106,7 +114,7 @@
 @a
 @A(3)
 int f1, f2;
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -130,7 +138,7 @@
 @a
 @A(3)
 int f1, f2;
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -151,7 +159,7 @@
 class C<T> = Object with A<Function(T)>;
 class B<T> = Object with A<Function(T)>;
 class A<T> {}
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -176,10 +184,11 @@
 main() {}
 
 import "baz.dart";
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
-      addMarkerForUnknownForTest: true);
+      addMarkerForUnknownForTest: true,
+      returnNullOnError: false);
   if (result !=
       """
 import "bar.dart";
@@ -202,10 +211,11 @@
 main() {}
 
 export "baz.dart";
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
-      addMarkerForUnknownForTest: true);
+      addMarkerForUnknownForTest: true,
+      returnNullOnError: false);
   if (result !=
       """
 export "bar.dart";
@@ -233,10 +243,11 @@
 
 export "baz.dart";
 import "baz.dart";
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
-      addMarkerForUnknownForTest: true);
+      addMarkerForUnknownForTest: true,
+      returnNullOnError: false);
   if (result !=
       """
 export "bar.dart";
@@ -260,10 +271,11 @@
 bar() {
   // whatever
 }
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
-      addMarkerForUnknownForTest: true);
+      addMarkerForUnknownForTest: true,
+      returnNullOnError: false);
   if (result !=
       """
 part "foo.dart";
@@ -284,10 +296,11 @@
 }
 
 @Object1()
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
-      addMarkerForUnknownForTest: true);
+      addMarkerForUnknownForTest: true,
+      returnNullOnError: false);
   if (result !=
       """
 @Object2()
@@ -305,7 +318,7 @@
   Class1 get nonNullable1 => property1;
   Class2 get property1 => new Class1();
 }
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -326,7 +339,7 @@
 class C<V> extends Super<V> with Mixin<V> {}
 class D extends Super with Mixin {}
 class D2 = Super with Mixin;
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -352,7 +365,7 @@
 export "a1.dart";
 @Object4
 import "a0.dart";
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
@@ -385,10 +398,11 @@
 export "a2.dart" show
 // ok line
 export "a3.dart" show foo;
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
-      addMarkerForUnknownForTest: true);
+      addMarkerForUnknownForTest: true,
+      returnNullOnError: false);
   if (result !=
       """
 ---- unknown chunk starts ----
@@ -411,7 +425,7 @@
 main() {
   x;
 }
-"""),
+"""), scannerConfiguration,
       throwOnUnexpected: true,
       performModelling: true,
       addMarkerForUnknownForTest: true);
diff --git a/pkg/front_end/testcases/general/constants/various.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/various.dart.textual_outline_modelled.expect
deleted file mode 100644
index 068970b..0000000
--- a/pkg/front_end/testcases/general/constants/various.dart.textual_outline_modelled.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-ConstClassWithFailingAssertWithEmptyMessage failedAssertEmptyMessage =
-    const ConstClassWithFailingAssertWithEmptyMessage();
-
-abstract class AbstractClass {}
-
-class ConstClassWithFailingAssertWithEmptyMessage {
-  const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
-}
-
-class Foo {
-  const Foo(int x)
-      : this.x = x,
-        this.y = "hello".length;
-  final int x;
-  final int y;
-}
-
-class NotAbstractClass {
-  @AbstractClass()
-  Object foo;
-}
-
-const Foo foo = const Foo(42);
-const Symbol barFoo = const Symbol("Foo");
-const bool barFromEnv = const bool.fromEnvironment("bar");
-const bool hasBarEnv = const bool.hasEnvironment("bar");
-const function_const = () {};
-const x1 = --x;
-const x2 = ++x;
-const x3 = x--;
-const x4 = x++;
-const y = 1;
-const y1 = --y;
-const y2 = ++y;
-const y3 = y--;
-const y4 = y++;
-main() {}
-var function_var = () {};
-var x = 1;
diff --git a/pkg/front_end/testcases/general/issue43975.dart b/pkg/front_end/testcases/general/issue43975.dart
new file mode 100644
index 0000000..929affa
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart
@@ -0,0 +1,6 @@
+// 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.
+
+typedef F = void Function<X extends F>() Function();
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue43975.dart.outline.expect b/pkg/front_end/testcases/general/issue43975.dart.outline.expect
new file mode 100644
index 0000000..a61aa23
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart.outline.expect
@@ -0,0 +1,13 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43975.dart:5:9: Error: The typedef 'F' has a reference to itself.
+// typedef F = void Function<X extends F>() Function();
+//         ^
+//
+import self as self;
+
+typedef F = invalid-type;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/issue43975.dart.strong.expect b/pkg/front_end/testcases/general/issue43975.dart.strong.expect
new file mode 100644
index 0000000..a1da936
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart.strong.expect
@@ -0,0 +1,12 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43975.dart:5:9: Error: The typedef 'F' has a reference to itself.
+// typedef F = void Function<X extends F>() Function();
+//         ^
+//
+import self as self;
+
+typedef F = invalid-type;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/issue43975.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue43975.dart.strong.transformed.expect
new file mode 100644
index 0000000..a1da936
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart.strong.transformed.expect
@@ -0,0 +1,12 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43975.dart:5:9: Error: The typedef 'F' has a reference to itself.
+// typedef F = void Function<X extends F>() Function();
+//         ^
+//
+import self as self;
+
+typedef F = invalid-type;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/issue43975.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue43975.dart.textual_outline.expect
new file mode 100644
index 0000000..ccb87d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+typedef F = void Function<X extends F>() Function();
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue43975.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue43975.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ccb87d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+typedef F = void Function<X extends F>() Function();
+void main() {}
diff --git a/pkg/front_end/testcases/general/three_typedefs_loop.dart.outline.expect b/pkg/front_end/testcases/general/three_typedefs_loop.dart.outline.expect
index 12b78a9..f030616 100644
--- a/pkg/front_end/testcases/general/three_typedefs_loop.dart.outline.expect
+++ b/pkg/front_end/testcases/general/three_typedefs_loop.dart.outline.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<unrelated T extends core::Object* = dynamic> = (((invalid-type) →* void) →* void) →* void;
+typedef Foo<unrelated T extends core::Object* = dynamic> = invalid-type;
 typedef Bar<unrelated T extends core::Object* = dynamic> = ((invalid-type) →* void) →* void;
 typedef Baz<unrelated T extends core::Object* = dynamic> = (invalid-type) →* void;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.expect b/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.expect
index 3773b6f..bd2fff9 100644
--- a/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<unrelated T extends core::Object* = dynamic> = (((invalid-type) →* void) →* void) →* void;
+typedef Foo<unrelated T extends core::Object* = dynamic> = invalid-type;
 typedef Bar<unrelated T extends core::Object* = dynamic> = ((invalid-type) →* void) →* void;
 typedef Baz<unrelated T extends core::Object* = dynamic> = (invalid-type) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.transformed.expect
index 3773b6f..bd2fff9 100644
--- a/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/three_typedefs_loop.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<unrelated T extends core::Object* = dynamic> = (((invalid-type) →* void) →* void) →* void;
+typedef Foo<unrelated T extends core::Object* = dynamic> = invalid-type;
 typedef Bar<unrelated T extends core::Object* = dynamic> = ((invalid-type) →* void) →* void;
 typedef Baz<unrelated T extends core::Object* = dynamic> = (invalid-type) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.expect
index de06f6f..d648775a 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<unrelated T extends core::Object* = dynamic> = (((invalid-type) →* void) →* void) →* void;
+typedef Foo<unrelated T extends core::Object* = dynamic> = invalid-type;
 typedef Bar<unrelated T extends core::Object* = dynamic> = ((invalid-type) →* void) →* void;
 typedef Baz<unrelated T extends core::Object* = dynamic> = (invalid-type) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.transformed.expect
index de06f6f..d648775a 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/three_typedefs_loop.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<unrelated T extends core::Object* = dynamic> = (((invalid-type) →* void) →* void) →* void;
+typedef Foo<unrelated T extends core::Object* = dynamic> = invalid-type;
 typedef Bar<unrelated T extends core::Object* = dynamic> = ((invalid-type) →* void) →* void;
 typedef Baz<unrelated T extends core::Object* = dynamic> = (invalid-type) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
index df6b22b..3d630a8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
@@ -34,7 +34,7 @@
           method(new A());
         }
         extension Extension2 on A {
-          boz() => 87;
+          boz() { return 87; }
         }
     expectedLibraryCount: 3
   - entry: main.dart
@@ -73,8 +73,7 @@
           method(new A());
         }
         extension Extension2 on A {
-          boz() => 123;
+          boz() { return 123; }
         }
     expectedLibraryCount: 3
     expectsRebuildBodiesOnly: true
-
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
index e0981f7..eae0d04 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
@@ -56,8 +56,9 @@
   static method main() → dynamic {
     lib2::method(new main::A::•());
   }
-  static method Extension2|boz(lowered final main::A* #this) → dynamic
+  static method Extension2|boz(lowered final main::A* #this) → dynamic {
     return 87;
+  }
   static method Extension2|get#boz(lowered final main::A* #this) → () →* dynamic
     return () → dynamic => main::Extension2|boz(#this);
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
index 13f26e0..d4f85de 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
@@ -57,8 +57,9 @@
   static method main() → dynamic {
     lib2::method(new main::A::•());
   }
-  static method Extension2|boz(lowered final main::A* #this) → dynamic
+  static method Extension2|boz(lowered final main::A* #this) → dynamic {
     return 87;
+  }
   static method Extension2|get#boz(lowered final main::A* #this) → () →* dynamic
     return () → dynamic => main::Extension2|boz(#this);
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
index 562f9d8..8108d22 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
@@ -57,8 +57,9 @@
   static method main() → dynamic {
     lib2::method(new main::A::•());
   }
-  static method Extension2|boz(lowered final main::A* #this) → dynamic
+  static method Extension2|boz(lowered final main::A* #this) → dynamic {
     return 123;
+  }
   static method Extension2|get#boz(lowered final main::A* #this) → () →* dynamic
     return () → dynamic => main::Extension2|boz(#this);
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml
new file mode 100644
index 0000000..03f5018
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml
@@ -0,0 +1,26 @@
+# Copyright (c) 2020, 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.md file.
+
+# Extension methods.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        late final int x = 42;
+        extension Foo on int {
+          void x() { /*content =)*/ }
+        }
+    expectedLibraryCount: 1
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    expectedLibraryCount: 1
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml.world.1.expect
new file mode 100644
index 0000000..931579a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml.world.1.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  extension Foo on dart.core::int {
+    method x = main::Foo|x;
+    tearoff x = main::Foo|get#x;
+  }
+  late static final field dart.core::int x = 42;
+  static method Foo|x(lowered final dart.core::int #this) → void {}
+  static method Foo|get#x(lowered final dart.core::int #this) → () → void
+    return () → void => main::Foo|x(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml.world.2.expect
new file mode 100644
index 0000000..931579a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_47.yaml.world.2.expect
@@ -0,0 +1,12 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  extension Foo on dart.core::int {
+    method x = main::Foo|x;
+    tearoff x = main::Foo|get#x;
+  }
+  late static final field dart.core::int x = 42;
+  static method Foo|x(lowered final dart.core::int #this) → void {}
+  static method Foo|get#x(lowered final dart.core::int #this) → () → void
+    return () → void => main::Foo|x(#this);
+}
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart b/pkg/front_end/testcases/nnbd/issue44857.dart
new file mode 100644
index 0000000..96ac4d5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart
@@ -0,0 +1,11 @@
+// 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.
+
+typedef F = Never Function(void Function<T extends Never>(T));
+
+void main() {
+  const c = F;
+  print("Are $c, $F identical?");
+  print(identical(c, F));
+}
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.outline.expect
new file mode 100644
index 0000000..82e5613
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.outline.expect
@@ -0,0 +1,6 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+typedef F = (<T extends Never = dynamic>(T) → void) → Never;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.strong.expect
new file mode 100644
index 0000000..4a6c15d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.strong.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (<T extends Never = dynamic>(T) → void) → Never;
+static method main() → void {
+  core::print("Are ${#C1}, ${#C1} identical?");
+  core::print(core::identical(#C1, #C1));
+}
+
+constants  {
+  #C1 = TypeLiteralConstant((<T extends Never = dynamic>(Never) → void) → Never)
+}
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.strong.transformed.expect
new file mode 100644
index 0000000..3ddde37
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (<T extends Never = dynamic>(T) → void) → Never;
+static method main() → void {
+  core::print("Are ${#C1}, ${#C1} identical?");
+  core::print(core::identical(#C1, #C1));
+}
+
+constants  {
+  #C1 = TypeLiteralConstant((<T extends Never = dynamic>(Never) → void) → Never)
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue44857.dart:10:9 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.textual_outline.expect
new file mode 100644
index 0000000..cb283ab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+typedef F = Never Function(void Function<T extends Never>(T));
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..cb283ab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+typedef F = Never Function(void Function<T extends Never>(T));
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
new file mode 100644
index 0000000..ad063b4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (<T extends Never = dynamic>(T) → void) → Never;
+static method main() → void {
+  core::print("Are ${#C1}, ${#C1} identical?");
+  core::print(core::identical(#C1, #C1));
+}
+
+constants  {
+  #C1 = TypeLiteralConstant((<T extends Never* = Never*>(Never*) →* void) →* Never*)
+}
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
new file mode 100644
index 0000000..dd62920
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (<T extends Never = dynamic>(T) → void) → Never;
+static method main() → void {
+  core::print("Are ${#C1}, ${#C1} identical?");
+  core::print(core::identical(#C1, #C1));
+}
+
+constants  {
+  #C1 = TypeLiteralConstant((<T extends Never* = Never*>(Never*) →* void) →* Never*)
+}
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///issue44857.dart:10:9 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart.textual_outline_modelled.expect
deleted file mode 100644
index e42e9ac..0000000
--- a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart.textual_outline_modelled.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-// @dart = 2.5
-import 'inheritance_from_opt_in_lib.dart';
-
-class LegacyClass1 extends Class1 {}
-
-class LegacyClass2<T> extends Class2<T> {}
-
-class LegacyClass3a<T> extends Class3<T> {}
-
-class LegacyClass3b<T> extends Class3<T> implements GenericInterface<T> {}
-
-class LegacyClass4a extends Class4a {}
-
-class LegacyClass4b implements GenericInterface<num> {}
-
-class LegacyClass4c implements GenericInterface<num?> {}
-
-class LegacyClass4d extends Class4a implements GenericInterface<num> {}
-
-class LegacyClass4e implements Class4a, Class4b {}
-
-class LegacyClass5 extends Class5 implements GenericInterface<Object> {}
-
-class LegacyClass6a<T> extends Class3<T> implements GenericSubInterface<T> {}
-
-class LegacyClass6b<T> extends LegacyClass3a<T>
-    implements GenericSubInterface<T> {}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
index 6c35ab9..dc3f69b 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
@@ -7,8 +7,7 @@
 //                ^
 //
 import self as self;
-import "dart:core" as core;
 
-typedef Handle = (core::String*) →* invalid-type;
+typedef Handle = invalid-type;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
index 1cb9f39..3444c42 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
@@ -7,9 +7,8 @@
 //                ^
 //
 import self as self;
-import "dart:core" as core;
 
-typedef Handle = (core::String*) →* invalid-type;
+typedef Handle = invalid-type;
 static method main() → dynamic {
-  (core::String*) →* invalid-type h;
+  invalid-type h;
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
index 1cb9f39..3444c42 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
@@ -7,9 +7,8 @@
 //                ^
 //
 import self as self;
-import "dart:core" as core;
 
-typedef Handle = (core::String*) →* invalid-type;
+typedef Handle = invalid-type;
 static method main() → dynamic {
-  (core::String*) →* invalid-type h;
+  invalid-type h;
 }
diff --git a/pkg/kernel/lib/src/const_canonical_type.dart b/pkg/kernel/lib/src/const_canonical_type.dart
index 9a1dd42..186c980 100644
--- a/pkg/kernel/lib/src/const_canonical_type.dart
+++ b/pkg/kernel/lib/src/const_canonical_type.dart
@@ -112,14 +112,15 @@
     assert(type.declaredNullability == Nullability.nonNullable);
 
     List<TypeParameter> canonicalizedTypeParameters;
-    Map<TypeParameter, DartType> substitutionMap;
+    Substitution substitution;
     if (type.typeParameters.isEmpty) {
       canonicalizedTypeParameters = const <TypeParameter>[];
-      substitutionMap = const <TypeParameter, DartType>{};
+      substitution = null;
     } else {
-      substitutionMap = <TypeParameter, DartType>{};
-      canonicalizedTypeParameters =
-          new List<TypeParameter>.of(type.typeParameters, growable: false);
+      FreshTypeParameters freshTypeParameters =
+          getFreshTypeParameters(type.typeParameters);
+      substitution = freshTypeParameters.substitution;
+      canonicalizedTypeParameters = freshTypeParameters.freshTypeParameters;
       for (TypeParameter parameter in canonicalizedTypeParameters) {
         parameter.bound = computeConstCanonicalType(parameter.bound, coreTypes,
             isNonNullableByDefault: isNonNullableByDefault);
@@ -130,11 +131,6 @@
       for (int i = 0; i < canonicalizedTypeParameters.length; ++i) {
         canonicalizedTypeParameters[i].defaultType = defaultTypes[i];
       }
-      for (int i = 0; i < canonicalizedTypeParameters.length; ++i) {
-        substitutionMap[canonicalizedTypeParameters[i]] =
-            new TypeParameterType.forAlphaRenaming(
-                type.typeParameters[i], canonicalizedTypeParameters[i]);
-      }
     }
 
     List<DartType> canonicalizedPositionalParameters;
@@ -147,8 +143,8 @@
         DartType canonicalized = computeConstCanonicalType(
             canonicalizedPositionalParameters[i], coreTypes,
             isNonNullableByDefault: isNonNullableByDefault);
-        if (substitutionMap.isNotEmpty) {
-          canonicalized = substitute(canonicalized, substitutionMap);
+        if (substitution != null) {
+          canonicalized = substitution.substituteType(canonicalized);
         }
         canonicalizedPositionalParameters[i] = canonicalized;
       }
@@ -164,8 +160,8 @@
         DartType canonicalized = computeConstCanonicalType(
             canonicalizedNamedParameters[i].type, coreTypes,
             isNonNullableByDefault: isNonNullableByDefault);
-        if (substitutionMap.isNotEmpty) {
-          canonicalized = substitute(canonicalized, substitutionMap);
+        if (substitution != null) {
+          canonicalized = substitution.substituteType(canonicalized);
         }
         canonicalizedNamedParameters[i] = new NamedType(
             canonicalizedNamedParameters[i].name, canonicalized,
@@ -176,9 +172,9 @@
     DartType canonicalizedReturnType = computeConstCanonicalType(
         type.returnType, coreTypes,
         isNonNullableByDefault: isNonNullableByDefault);
-    if (substitutionMap.isNotEmpty) {
+    if (substitution != null) {
       canonicalizedReturnType =
-          substitute(canonicalizedReturnType, substitutionMap);
+          substitution.substituteType(canonicalizedReturnType);
     }
 
     // Canonicalize typedef type, just in case.
diff --git a/samples/ffi/sample_ffi_functions.dart b/samples/ffi/sample_ffi_functions.dart
index 749dc53..4610fa7 100644
--- a/samples/ffi/sample_ffi_functions.dart
+++ b/samples/ffi/sample_ffi_functions.dart
@@ -100,7 +100,7 @@
     print(result.runtimeType);
 
     var mint = 0x7FFFFFFFFFFFFFFF; // 2 ^ 63 - 1
-    result = intComputation(1, 1, 0, mint);
+    result = intComputation(1, 1, 1, mint);
     print(result);
     print(result.runtimeType);
   }
diff --git a/samples_2/ffi/sample_ffi_functions.dart b/samples_2/ffi/sample_ffi_functions.dart
index 53990ac..5142bc4 100644
--- a/samples_2/ffi/sample_ffi_functions.dart
+++ b/samples_2/ffi/sample_ffi_functions.dart
@@ -102,7 +102,7 @@
     print(result.runtimeType);
 
     var mint = 0x7FFFFFFFFFFFFFFF; // 2 ^ 63 - 1
-    result = intComputation(1, 1, 0, mint);
+    result = intComputation(1, 1, 1, mint);
     print(result);
     print(result.runtimeType);
   }
diff --git a/tools/VERSION b/tools/VERSION
index d37ec91..4d69655 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 13
+PRERELEASE 14
 PRERELEASE_PATCH 0
\ No newline at end of file