Version 2.14.0-148.0.dev

Merge commit '130aaeacc3d28e847b1d45338ac6f704e813d3d4' into 'dev'
diff --git a/DEPS b/DEPS
index 871d214..4017423 100644
--- a/DEPS
+++ b/DEPS
@@ -63,8 +63,8 @@
   # The list of revisions for these tools comes from Fuchsia, here:
   # https://fuchsia.googlesource.com/integration/+/HEAD/prebuilts
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
-  "clang_revision": "7e9747b50bcb1be28d4a3236571e8050835497a6",
-  "gn_revision": "1e3fd10c5df6b704fc764ee388149e4f32862823",
+  "clang_revision": "3dc24bc31edbc01dea085b24a6a6b024d7ae531c",
+  "gn_revision": "39a87c0b36310bdf06b692c098f199a0d97fc810",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -106,7 +106,7 @@
   "dart_style_rev": "f17c23e0eea9a870601c19d904e2a9c1a7c81470",
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_rev" : "e6a9b7c536a85e49233c97bb892bbb0ab778e425",
+  "dartdoc_rev" : "305713608c25106d95f9114418d895e08d1a9e9c",
   "devtools_rev" : "e138d55437a59838607415ef21f20bd6c4955dbc",
   "jsshell_tag": "version:88.0",
   "ffi_rev": "f3346299c55669cc0db48afae85b8110088bf8da",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index f1ac8c2..91586be 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -294,6 +294,10 @@
       # Clang doesn't support these flags.
       cflags += [ "-finline-limit=64" ]
     }
+    if (current_cpu == "arm64") {
+      # TODO (https://github.com/flutter/flutter/issues/75348).
+      cflags += [ "-mno-outline-atomics" ]
+    }
     if (is_asan) {
       # Android build relies on -Wl,--gc-sections removing unreachable code.
       # ASan instrumentation for globals inhibits this and results in a library
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index d78d0d5..fbff8be 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -16,8 +16,6 @@
 import 'package:analyzer/src/summary2/element_builder.dart';
 import 'package:analyzer/src/summary2/export.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/metadata_resolver.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/summary2/reference_resolver.dart';
@@ -28,11 +26,9 @@
   final Linker linker;
   final Uri uri;
   final Reference reference;
-  late final List<Reference> exports;
+  final LibraryElementImpl element;
+  final List<LinkingUnit> units;
 
-  late final LinkedLibraryContext context;
-
-  late final LibraryElementImpl element;
   late final LibraryScope scope;
 
   /// Local declarations.
@@ -42,8 +38,15 @@
   final Scope exportScope = Scope.top();
 
   final List<Export> exporters = [];
+  late final List<Reference> exports;
 
-  LibraryBuilder._(this.linker, this.uri, this.reference);
+  LibraryBuilder._({
+    required this.linker,
+    required this.uri,
+    required this.reference,
+    required this.element,
+    required this.units,
+  });
 
   void addExporters() {
     for (var element in element.exports) {
@@ -97,24 +100,19 @@
     return true;
   }
 
-  void buildElement() {
-    element = linker.elementFactory.createLibraryElementForLinking(context)
-        as LibraryElementImpl;
-  }
-
   /// Build elements for declarations in the library units, add top-level
   /// declarations to the local scope, for combining into export scopes.
   void buildElements() {
-    for (var unitContext in context.units) {
+    for (var linkingUnit in units) {
       var elementBuilder = ElementBuilder(
         libraryBuilder: this,
-        unitReference: unitContext.reference,
-        unitElement: unitContext.element,
+        unitReference: linkingUnit.reference,
+        unitElement: linkingUnit.element,
       );
-      if (unitContext.indexInLibrary == 0) {
-        elementBuilder.buildLibraryElementChildren(unitContext.unit);
+      if (linkingUnit.isDefiningUnit) {
+        elementBuilder.buildLibraryElementChildren(linkingUnit.node);
       }
-      elementBuilder.buildDeclarationElements(unitContext.unit);
+      elementBuilder.buildDeclarationElements(linkingUnit.node);
     }
     if ('$uri' == 'dart:core') {
       localScope.declare('dynamic', reference.getChild('dynamic'));
@@ -137,8 +135,8 @@
   }
 
   void collectMixinSuperInvokedNames() {
-    for (var unitContext in context.units) {
-      for (var declaration in unitContext.unit.declarations) {
+    for (var linkingUnit in units) {
+      for (var declaration in linkingUnit.node.declarations) {
         if (declaration is ast.MixinDeclaration) {
           var names = <String>{};
           var collector = MixinSuperInvokedNamesCollector(names);
@@ -163,28 +161,24 @@
   }
 
   void resolveMetadata() {
-    for (var unitContext in context.units) {
-      var unitElement =
-          unitContext.reference.element as CompilationUnitElementImpl;
-      var resolver = MetadataResolver(linker, scope, unitElement);
-      unitContext.unit.accept(resolver);
+    for (var linkingUnit in units) {
+      var resolver = MetadataResolver(linker, scope, linkingUnit.element);
+      linkingUnit.node.accept(resolver);
     }
   }
 
   void resolveTypes(NodesToBuildType nodesToBuildType) {
-    for (var unitContext in context.units) {
-      var unitRef = reference.getChild('@unit');
-      var unitReference = unitRef.getChild(unitContext.uriStr);
+    for (var linkingUnit in units) {
       var resolver = ReferenceResolver(
         linker,
         nodesToBuildType,
         linker.elementFactory,
         element,
-        unitReference,
-        unitContext.unit.featureSet.isEnabled(Feature.non_nullable),
+        linkingUnit.reference,
+        linkingUnit.node.featureSet.isEnabled(Feature.non_nullable),
         scope,
       );
-      unitContext.unit.accept(resolver);
+      linkingUnit.node.accept(resolver);
     }
   }
 
@@ -209,32 +203,102 @@
   }
 
   static void build(Linker linker, LinkInputLibrary inputLibrary) {
-    var uriStr = inputLibrary.uriStr;
-    var reference = linker.rootReference.getChild(uriStr);
-
     var elementFactory = linker.elementFactory;
-    var context = LinkedLibraryContext(elementFactory, uriStr, reference);
 
-    var unitRef = reference.getChild('@unit');
-    var unitIndex = 0;
-    for (var inputUnit in inputLibrary.units) {
-      var uriStr = inputUnit.uriStr;
-      var reference = unitRef.getChild(uriStr);
-      context.units.add(
-        LinkedUnitContext(
-          context,
-          unitIndex++,
-          inputUnit.partUriStr,
-          uriStr,
-          reference,
-          inputUnit.isSynthetic,
-          unit: inputUnit.unit as ast.CompilationUnitImpl,
-        ),
-      );
+    var rootReference = linker.rootReference;
+    var libraryUriStr = inputLibrary.uriStr;
+    var libraryReference = rootReference.getChild(libraryUriStr);
+
+    var definingUnit = inputLibrary.units[0];
+    var definingUnitNode = definingUnit.unit as ast.CompilationUnitImpl;
+
+    var name = '';
+    var nameOffset = -1;
+    var nameLength = 0;
+    for (var directive in definingUnitNode.directives) {
+      if (directive is ast.LibraryDirective) {
+        name = directive.name.components.map((e) => e.name).join('.');
+        nameOffset = directive.name.offset;
+        nameLength = directive.name.length;
+        break;
+      }
     }
 
-    var builder = LibraryBuilder._(linker, inputLibrary.uri, reference);
+    var libraryElement = LibraryElementImpl(
+      elementFactory.analysisContext,
+      elementFactory.analysisSession,
+      name,
+      nameOffset,
+      nameLength,
+      definingUnitNode.featureSet,
+    );
+    libraryElement.isSynthetic = definingUnit.isSynthetic;
+    libraryElement.languageVersion = definingUnitNode.languageVersion!;
+    _bindReference(libraryReference, libraryElement);
+    elementFactory.setLibraryTypeSystem(libraryElement);
+
+    var unitContainerRef = libraryReference.getChild('@unit');
+    var unitElements = <CompilationUnitElementImpl>[];
+    var isDefiningUnit = true;
+    var linkingUnits = <LinkingUnit>[];
+    for (var inputUnit in inputLibrary.units) {
+      var unitNode = inputUnit.unit as ast.CompilationUnitImpl;
+
+      var unitElement = CompilationUnitElementImpl();
+      unitElement.isSynthetic = inputUnit.isSynthetic;
+      unitElement.librarySource = inputLibrary.source;
+      unitElement.lineInfo = unitNode.lineInfo;
+      unitElement.source = inputUnit.source;
+      unitElement.uri = inputUnit.partUriStr;
+
+      var unitReference = unitContainerRef.getChild(inputUnit.uriStr);
+      _bindReference(unitReference, unitElement);
+
+      unitElements.add(unitElement);
+      linkingUnits.add(
+        LinkingUnit(
+          input: inputUnit,
+          isDefiningUnit: isDefiningUnit,
+          reference: unitReference,
+          node: unitNode,
+          element: unitElement,
+        ),
+      );
+      isDefiningUnit = false;
+    }
+
+    libraryElement.definingCompilationUnit = unitElements[0];
+    libraryElement.parts = unitElements.skip(1).toList();
+
+    var builder = LibraryBuilder._(
+      linker: linker,
+      uri: inputLibrary.uri,
+      reference: libraryReference,
+      element: libraryElement,
+      units: linkingUnits,
+    );
+
     linker.builders[builder.uri] = builder;
-    builder.context = context;
   }
+
+  static void _bindReference(Reference reference, ElementImpl element) {
+    reference.element = element;
+    element.reference = reference;
+  }
+}
+
+class LinkingUnit {
+  final LinkInputUnit input;
+  final bool isDefiningUnit;
+  final Reference reference;
+  final ast.CompilationUnitImpl node;
+  final CompilationUnitElementImpl element;
+
+  LinkingUnit({
+    required this.input,
+    required this.isDefiningUnit,
+    required this.reference,
+    required this.node,
+    required this.element,
+  });
 }
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index d3408d6..225b860 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -115,10 +115,6 @@
 
   void _computeLibraryScopes() {
     for (var library in builders.values) {
-      library.buildElement();
-    }
-
-    for (var library in builders.values) {
       library.buildElements();
     }
 
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index fcd971f..92f3296 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -2,7 +2,6 @@
 // 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
@@ -10,7 +9,6 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 
 class LinkedElementFactory {
@@ -68,69 +66,6 @@
     return Namespace(exportedNames);
   }
 
-  LibraryElementImpl? createLibraryElementForLinking(
-    LinkedLibraryContext libraryContext,
-  ) {
-    var sourceFactory = analysisContext.sourceFactory;
-    var libraryUriStr = libraryContext.uriStr;
-    var librarySource = sourceFactory.forUri(libraryUriStr);
-
-    // The URI cannot be resolved, we don't know the library.
-    if (librarySource == null) return null;
-
-    var definingUnitContext = libraryContext.definingUnit;
-    var definingUnitNode = definingUnitContext.unit;
-
-    // TODO(scheglov) Do we need this?
-    var name = '';
-    var nameOffset = -1;
-    var nameLength = 0;
-    for (var directive in definingUnitNode.directives) {
-      if (directive is LibraryDirective) {
-        name = directive.name.components.map((e) => e.name).join('.');
-        nameOffset = directive.name.offset;
-        nameLength = directive.name.length;
-        break;
-      }
-    }
-
-    var libraryElement = LibraryElementImpl(
-      analysisContext,
-      analysisSession,
-      name,
-      nameOffset,
-      nameLength,
-      definingUnitNode.featureSet,
-    );
-    libraryElement.isSynthetic = definingUnitContext.isSynthetic;
-    libraryElement.languageVersion = definingUnitNode.languageVersion!;
-    _bindReference(libraryContext.reference, libraryElement);
-    _setLibraryTypeSystem(libraryElement);
-
-    var units = <CompilationUnitElementImpl>[];
-    for (var unitContext in libraryContext.units) {
-      var unitNode = unitContext.unit;
-
-      var unitSource = sourceFactory.forUri(unitContext.uriStr);
-      if (unitSource == null) continue;
-
-      var unitElement = CompilationUnitElementImpl();
-      unitElement.isSynthetic = unitContext.isSynthetic;
-      unitElement.librarySource = librarySource;
-      unitElement.lineInfo = unitNode.lineInfo;
-      unitElement.source = unitSource;
-      unitElement.uri = unitContext.partUriStr;
-      _bindReference(unitContext.reference, unitElement);
-
-      units.add(unitElement);
-    }
-
-    libraryElement.definingCompilationUnit = units[0];
-    libraryElement.parts = units.skip(1).toList();
-
-    return libraryElement;
-  }
-
   LibraryElementImpl? createLibraryElementForReading(String uriStr) {
     var sourceFactory = analysisContext.sourceFactory;
     var librarySource = sourceFactory.forUri(uriStr);
@@ -149,7 +84,7 @@
     var libraryElement = reader.readElement(
       librarySource: librarySource,
     );
-    _setLibraryTypeSystem(libraryElement);
+    setLibraryTypeSystem(libraryElement);
     return libraryElement;
   }
 
@@ -179,7 +114,7 @@
     for (var reference in rootReference.children) {
       var libraryElement = reference.element as LibraryElementImpl?;
       if (libraryElement != null && !libraryElement.hasTypeProviderSystemSet) {
-        _setLibraryTypeSystem(libraryElement);
+        setLibraryTypeSystem(libraryElement);
       }
     }
   }
@@ -276,13 +211,7 @@
     analysisSession.inheritanceManager.removeOfLibraries(uriStrSet);
   }
 
-  void _declareDartCoreDynamicNever() {
-    var dartCoreRef = rootReference.getChild('dart:core');
-    dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
-    dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
-  }
-
-  void _setLibraryTypeSystem(LibraryElementImpl libraryElement) {
+  void setLibraryTypeSystem(LibraryElementImpl libraryElement) {
     // During linking we create libraries when typeProvider is not ready.
     // And if we link dart:core and dart:async, we cannot create it.
     // We will set typeProvider later, during [createTypeProviders].
@@ -302,8 +231,9 @@
     libraryElement.createLoadLibraryFunction();
   }
 
-  static void _bindReference(Reference reference, ElementImpl element) {
-    reference.element = element;
-    element.reference = reference;
+  void _declareDartCoreDynamicNever() {
+    var dartCoreRef = rootReference.getChild('dart:core');
+    dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
+    dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/linked_library_context.dart b/pkg/analyzer/lib/src/summary2/linked_library_context.dart
deleted file mode 100644
index e9c7e77..0000000
--- a/pkg/analyzer/lib/src/summary2/linked_library_context.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// 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 file.
-
-import 'package:analyzer/src/summary2/linked_element_factory.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-
-class LinkedLibraryContext {
-  final LinkedElementFactory elementFactory;
-  final String uriStr;
-  final Reference reference;
-  final List<LinkedUnitContext> units = [];
-
-  LinkedLibraryContext(this.elementFactory, this.uriStr, this.reference);
-
-  LinkedUnitContext get definingUnit => units.first;
-}
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
deleted file mode 100644
index 472f5cb..0000000
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2019, 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:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-
-/// The context of a unit - the context of the bundle, and the unit tokens.
-class LinkedUnitContext {
-  final LinkedLibraryContext libraryContext;
-  final int indexInLibrary;
-  final String? partUriStr;
-  final String uriStr;
-  final Reference reference;
-  final bool isSynthetic;
-  final CompilationUnitImpl unit;
-
-  LinkedUnitContext(this.libraryContext, this.indexInLibrary, this.partUriStr,
-      this.uriStr, this.reference, this.isSynthetic,
-      {required this.unit});
-
-  CompilationUnitElementImpl get element {
-    return reference.element as CompilationUnitElementImpl;
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index 4ff3555..b48b646 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -10,8 +10,8 @@
   /// Check typedefs and mark the ones having self references.
   void perform(Linker linker) {
     for (var builder in linker.builders.values) {
-      for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+      for (var linkingUnit in builder.units) {
+        for (var node in linkingUnit.node.declarations) {
           if (node is FunctionTypeAlias) {
             var finder = _Finder(linker, node);
             finder.functionTypeAlias(node);
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 8d7438d..8543179 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -21,8 +21,8 @@
 
   void perform() {
     for (var builder in _linker.builders.values) {
-      for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+      for (var linkingUnit in builder.units) {
+        for (var node in linkingUnit.node.declarations) {
           if (node is FunctionTypeAlias) {
             _pending.add(node);
           } else if (node is GenericTypeAlias) {
@@ -33,8 +33,8 @@
     }
 
     for (var builder in _linker.builders.values) {
-      for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+      for (var linkingUnit in builder.units) {
+        for (var node in linkingUnit.node.declarations) {
           if (node is ClassTypeAlias) {
             _typeParameters(node.typeParameters);
           } else if (node is ClassDeclaration) {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
index 2bf9161..9d8b897 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
@@ -13,9 +13,10 @@
   });
 }
 
-/// todo(pq): add tests for topLevelVariables: https://dart-review.googlesource.com/c/sdk/+/200301
 @reflectiveTest
 class InvalidAnnotationTargetTest extends PubPackageResolutionTest {
+  // todo(pq): add tests for topLevelVariables:
+  // https://dart-review.googlesource.com/c/sdk/+/200301
   void test_classType_class() async {
     writeTestPackageConfigWithMeta();
     await assertNoErrorsInCode('''
diff --git a/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart b/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
index 2b0c310..3584005 100644
--- a/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
@@ -117,6 +117,34 @@
 ''');
   }
 
+  test_nonFunctionTypeAlias_explicitTypeArg() async {
+    writeTestPackageConfigWithMeta();
+    await assertNoErrorsInCode('''
+typedef List2<T> = List<T>;
+void f(List2<int> a) {}
+''');
+  }
+
+  test_nonFunctionTypeAlias_missingTypeArg() async {
+    writeTestPackageConfigWithMeta();
+    await assertErrorsInCode('''
+typedef List2<T> = List<T>;
+void f(List2 a) {}
+''', [
+      error(HintCode.STRICT_RAW_TYPE, 35, 5),
+    ]);
+  }
+
+  test_nonFunctionTypeAlias_optionalTypeArgs() async {
+    writeTestPackageConfigWithMeta();
+    await assertNoErrorsInCode('''
+import 'package:meta/meta.dart';
+@optionalTypeArgs
+typedef List2<T> = List<T>;
+void f(List2 a) {}
+''');
+  }
+
   test_parameter_missingTypeArg() async {
     await assertErrorsInCode(r'''
 void f(List a) {}
@@ -181,21 +209,21 @@
 ''', [error(HintCode.STRICT_RAW_TYPE, 11, 4)]);
   }
 
-  test_typedef_classic_missingTypeArg() async {
+  test_typeAlias_classic_missingTypeArg() async {
     await assertErrorsInCode(r'''
 typedef T F1<T>(T _);
 F1 func = (a) => a;
 ''', [error(HintCode.STRICT_RAW_TYPE, 22, 2)]);
   }
 
-  test_typedef_modern_missingTypeArg() async {
+  test_typeAlias_modern_missingTypeArg() async {
     await assertErrorsInCode(r'''
 typedef F1<T> = T Function(T);
 F1 func = (a) => a;
 ''', [error(HintCode.STRICT_RAW_TYPE, 31, 2)]);
   }
 
-  test_typedef_modern_optionalTypeArgs() async {
+  test_typeAlias_modern_optionalTypeArgs() async {
     writeTestPackageConfigWithMeta();
     await assertNoErrorsInCode(r'''
 import 'package:meta/meta.dart';
@@ -208,7 +236,7 @@
 ''');
   }
 
-  test_typedef_modern_withTypeArg() async {
+  test_typeAlias_modern_withTypeArg() async {
     await assertNoErrorsInCode(r'''
 typedef T F1<T>(T _);
 typedef F2<T> = T Function(T);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 66dfa4d..925dec6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -12749,6 +12749,8 @@
 part 'test.dart';
 class B {
 }
+class B {
+}
 ''');
   }
 
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 5841c60..6bebee4 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -199,8 +199,10 @@
 ///   overriding member `m`.
 const _NonVirtual nonVirtual = _NonVirtual();
 
-/// Used to annotate a class, mixin, or extension declaration `C`. Indicates
-/// that any type arguments declared on `C` are to be treated as optional.
+/// Used to annotate a class, mixin, extension, function, method, or typedef
+/// declaration `C`. Indicates that any type arguments declared on `C` are to
+/// be treated as optional.
+///
 /// Tools such as the analyzer and linter can use this information to suppress
 /// warnings that would otherwise require type arguments on `C` to be provided.
 const _OptionalTypeArgs optionalTypeArgs = _OptionalTypeArgs();
@@ -396,6 +398,14 @@
   const _NonVirtual();
 }
 
+@Target({
+  TargetKind.classType,
+  TargetKind.extension,
+  TargetKind.function,
+  TargetKind.method,
+  TargetKind.mixinType,
+  TargetKind.typedefType,
+})
 class _OptionalTypeArgs {
   const _OptionalTypeArgs();
 }
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index a5d848f..e15ff53 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -1133,6 +1133,7 @@
     Exceptions::ThrowArgumentError(error);
     UNREACHABLE();
   }
+  tpeer->handle()->EnsureFreedExternal(IsolateGroup::Current());
   tpeer->ClearData();
 
   const ExternalTypedData& typed_data = ExternalTypedData::Handle(
diff --git a/runtime/tests/vm/dart/transferable_allocations_test.dart b/runtime/tests/vm/dart/transferable_allocations_test.dart
new file mode 100644
index 0000000..ec61786
--- /dev/null
+++ b/runtime/tests/vm/dart/transferable_allocations_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// Verifies that Transferable (external old space) objects are promptly gc'ed.
+// The test will run out of ia32 3GB heap allocation if objects are not gc'ed.
+
+// VMOptions=--old_gen_heap_size=32
+
+import 'dart:isolate';
+import 'dart:typed_data';
+
+void main() {
+  final data = Uint8List.view(new Uint8List(5 * 1024 * 1024).buffer);
+  for (int i = 0; i < 1000; i++) {
+    TransferableTypedData.fromList(<Uint8List>[data]).materialize();
+  }
+}
diff --git a/runtime/tests/vm/dart_2/transferable_allocations_test.dart b/runtime/tests/vm/dart_2/transferable_allocations_test.dart
new file mode 100644
index 0000000..ec61786
--- /dev/null
+++ b/runtime/tests/vm/dart_2/transferable_allocations_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// Verifies that Transferable (external old space) objects are promptly gc'ed.
+// The test will run out of ia32 3GB heap allocation if objects are not gc'ed.
+
+// VMOptions=--old_gen_heap_size=32
+
+import 'dart:isolate';
+import 'dart:typed_data';
+
+void main() {
+  final data = Uint8List.view(new Uint8List(5 * 1024 * 1024).buffer);
+  for (int i = 0; i < 1000; i++) {
+    TransferableTypedData.fromList(<Uint8List>[data]).materialize();
+  }
+}
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 411dbce..616c6bf 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -163,6 +163,9 @@
   }
 
   if (old_space_.ReachedHardThreshold()) {
+    if (last_gc_was_old_space_) {
+      CollectNewSpaceGarbage(Thread::Current(), kFull);
+    }
     CollectGarbage(kMarkSweep, kExternal);
   } else {
     CheckStartConcurrentMarking(Thread::Current(), kExternal);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bdef06a..6f0bc6c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -24851,8 +24851,7 @@
 }
 
 TransferableTypedDataPtr TransferableTypedData::New(uint8_t* data,
-                                                    intptr_t length,
-                                                    Heap::Space space) {
+                                                    intptr_t length) {
   TransferableTypedDataPeer* peer = new TransferableTypedDataPeer(data, length);
 
   Thread* thread = Thread::Current();
@@ -24860,7 +24859,8 @@
   {
     ObjectPtr raw = Object::Allocate(
         TransferableTypedData::kClassId, TransferableTypedData::InstanceSize(),
-        space, TransferableTypedData::ContainsCompressedPointers());
+        thread->heap()->SpaceForExternal(length),
+        TransferableTypedData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     thread->heap()->SetPeer(raw, peer);
     result ^= raw;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 8461552..c3361b3 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -11138,9 +11138,7 @@
 
 class TransferableTypedData : public Instance {
  public:
-  static TransferableTypedDataPtr New(uint8_t* data,
-                                      intptr_t len,
-                                      Heap::Space space = Heap::kNew);
+  static TransferableTypedDataPtr New(uint8_t* data, intptr_t len);
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(UntaggedTransferableTypedData));
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 6617eec..655857e 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1689,7 +1689,7 @@
   ASSERT(reader != nullptr);
 
   ASSERT(!Snapshot::IsFull(kind));
-  const intptr_t length = reader->Read<int32_t>();
+  const intptr_t length = reader->Read<int64_t>();
 
   const FinalizableData finalizable_data =
       static_cast<MessageSnapshotReader*>(reader)->finalizable_data()->Take();
@@ -1726,7 +1726,7 @@
 
   writer->WriteIndexedObject(GetClassId());
   writer->WriteTags(writer->GetObjectTags(this));
-  writer->Write<int32_t>(length);
+  writer->Write<int64_t>(length);
 
   static_cast<MessageWriter*>(writer)->finalizable_data()->Put(
       length, data, tpeer,
diff --git a/tools/VERSION b/tools/VERSION
index 443649c..4791dbb5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 147
+PRERELEASE 148
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/gn.py b/tools/gn.py
index f711dd3..108adca 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -175,6 +175,8 @@
     if gn_args['target_os'] in ['linux', 'win']:
         gn_args['dart_use_fallback_root_certificates'] = True
 
+    gn_args['bssl_use_clang_integrated_as'] = True
+
     # Use tcmalloc only when targeting Linux and when not using ASAN.
     gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') and
                                     sanitizer == 'none')