Version 2.14.0-183.0.dev

Merge commit '80160d3efb1cdb4f011b2f2675cab4b5a9646ab7' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index c53d050..745683b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -43,6 +43,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/ast_binary_flags.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/workspace/pub.dart';
 import 'package:meta/meta.dart';
 
 /// This class computes [AnalysisResult]s for Dart files.
@@ -142,6 +143,7 @@
   /// The salt to mix into all hashes used as keys for linked data.
   final Uint32List _saltForResolution = Uint32List(3 +
       AnalysisOptionsImpl.signatureLength +
+      AnalysisOptionsImpl.signatureLength +
       _declaredVariablesSignatureLength);
 
   /// The set of priority files, that should be analyzed sooner.
@@ -1899,6 +1901,25 @@
     _saltForResolution[index] = enableDebugResolutionMarkers ? 1 : 0;
     index++;
 
+    // TODO(scheglov) Just combine everything into one signature.
+    {
+      var buffer = ApiSignature();
+
+      var workspace = analysisContext?.contextRoot.workspace;
+      // TODO(scheglov) Generalize?
+      if (workspace is PubWorkspace) {
+        buffer.addString(workspace.pubspecContent ?? '');
+      }
+
+      var bytes = buffer.toByteList();
+      _saltForResolution.setAll(
+        index,
+        // TODO(scheglov) Add a special method to ApiSignature?
+        Uint8List.fromList(bytes).buffer.asUint32List(),
+      );
+      index += AnalysisOptionsImpl.signatureLength;
+    }
+
     _saltForResolution.setAll(index, _analysisOptions.signature);
     index += AnalysisOptionsImpl.signatureLength;
 
diff --git a/pkg/analyzer/lib/src/dart/error/lint_codes.dart b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
index d2c467a..536a0cb 100644
--- a/pkg/analyzer/lib/src/dart/error/lint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
@@ -39,13 +39,6 @@
       other is LintCode && uniqueName == other.uniqueName;
 }
 
-@Deprecated('Use SecurityLintCode and its uniqueName')
-class LintCodeWithUniqueName extends LintCode {
-  const LintCodeWithUniqueName(String name, String uniqueName, String message,
-      {String? correction})
-      : super(name, message, uniqueName: uniqueName, correction: correction);
-}
-
 /// Defines security-related best practice recommendations.
 ///
 /// The primary difference from [LintCode]s is that these codes cannot be
@@ -59,11 +52,3 @@
   @override
   bool get isIgnorable => false;
 }
-
-@Deprecated('Use SecurityLintCode and its uniqueName')
-class SecurityLintCodeWithUniqueName extends SecurityLintCode {
-  const SecurityLintCodeWithUniqueName(
-      String name, String uniqueName, String message,
-      {String? correction})
-      : super(name, message, uniqueName: uniqueName, correction: correction);
-}
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 638fe05..c2b43c0 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -345,11 +345,7 @@
       _linker.elementNodes[element] = node;
       _enclosingContext.addParameter(null, element);
     }
-
-    // TODO(scheglov) https://github.com/dart-lang/sdk/issues/46039
-    // element.hasImplicitType = node.type == null && node.parameters == null;
-    element.hasImplicitType = false;
-
+    element.hasImplicitType = node.type == null && node.parameters == null;
     element.isExplicitlyCovariant = node.covariantKeyword != null;
     element.isFinal = node.isFinal;
     element.metadata = _buildAnnotations(node.metadata);
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index f9bf281..5f82cce 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -251,12 +251,6 @@
     required this.units,
   });
 
-  @Deprecated('Use LinkInputLibrary() with instead')
-  LinkInputLibrary.tmp1({
-    required this.source,
-    required this.units,
-  });
-
   Uri get uri => source.uri;
 
   String get uriStr => '$uri';
@@ -277,15 +271,6 @@
     required this.unit,
   });
 
-  @Deprecated('Use LinkInputUnit() with instead')
-  LinkInputUnit.tmp1({
-    required this.partDirectiveIndex,
-    this.partUriStr,
-    required this.source,
-    required this.isSynthetic,
-    required this.unit,
-  });
-
   Uri get uri => source.uri;
 
   String get uriStr => '$uri';
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 5d76afe..2dd428d 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -153,7 +152,7 @@
   _ConstructorInferenceNode(this._walker, this._constructor) {
     for (var parameter in _constructor.parameters) {
       if (parameter is FieldFormalParameterElementImpl) {
-        if (_hasImplicitType(parameter)) {
+        if (parameter.hasImplicitType) {
           var field = parameter.field;
           if (field != null) {
             _parameters.add(
@@ -234,18 +233,6 @@
     }
     isEvaluated = true;
   }
-
-  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/46039
-  bool _hasImplicitType(FieldFormalParameterElementImpl parameter) {
-    var parameterNode = _walker._linker.getLinkingNode(parameter);
-    if (parameterNode is DefaultFormalParameter) {
-      parameterNode = parameterNode.parameter;
-    }
-    return parameterNode is FieldFormalParameterImpl &&
-        parameterNode.type == null &&
-        parameterNode.parameters == null;
-    // return parameter.hasImplicitType;
-  }
 }
 
 /// A field formal parameter with a non-nullable field.
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index 94716f7..fc64f2a 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -190,6 +190,13 @@
   UriResolver get packageUriResolver => PackageBuildPackageUriResolver(
       this, PackageMapUriResolver(provider, packageMap));
 
+  @override
+  String? get pubspecContent {
+    try {
+      return _pubspecFile.readAsStringSync();
+    } catch (_) {}
+  }
+
   /// For some package file, which may or may not be a package source (it could
   /// be in `bin/`, `web/`, etc), find where its built counterpart will exist if
   /// its a generated source.
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
index 9ec1ee7..76b85c1 100644
--- a/pkg/analyzer/lib/src/workspace/pub.dart
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -31,6 +31,13 @@
     _theOnlyPackage = PubWorkspacePackage(root, this);
   }
 
+  /// Return the content of the pubspec file, `null` if cannot be read.
+  String? get pubspecContent {
+    try {
+      return _pubspecFile.readAsStringSync();
+    } catch (_) {}
+  }
+
   @override
   WorkspacePackage? findPackageFor(String filePath) {
     final Folder folder = provider.getFolder(filePath);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index ac0dca1..621c1a4 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -2,6 +2,7 @@
 // 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/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:test/test.dart';
@@ -144,6 +145,66 @@
     _assertNoLinkedCycles();
   }
 
+  test_lint_dependOnReferencedPackage_update_pubspec_addDependency() async {
+    useEmptyByteStore();
+
+    var aaaPackageRootPath = '$packagesRootPath/aaa';
+    newFile('$aaaPackageRootPath/lib/a.dart', content: '');
+
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaPackageRootPath),
+    );
+
+    // Configure with the lint.
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(lints: ['depend_on_referenced_packages']),
+    );
+
+    // Configure without dependencies, but with a (required) name.
+    // So, the lint rule will be activated.
+    writeTestPackagePubspecYamlFile(
+      PubspecYamlFileConfig(
+        name: 'my_test',
+        dependencies: [],
+      ),
+    );
+
+    newFile(testFilePath, content: r'''
+// ignore:unused_import
+import 'package:aaa/a.dart';
+''');
+
+    // We don't have a dependency on `package:aaa`, so there is a lint.
+    _assertHasLintReported(
+      await _computeTestFileErrors(),
+      'depend_on_referenced_packages',
+    );
+
+    // The summary for the library was linked.
+    _assertContainsLinkedCycle({testFilePath}, andClear: true);
+
+    // We will recreate it with new pubspec.yaml content.
+    // But we will reuse the byte store, so can reuse summaries.
+    disposeAnalysisContextCollection();
+
+    // Add dependency on `package:aaa`.
+    writeTestPackagePubspecYamlFile(
+      PubspecYamlFileConfig(
+        name: 'my_test',
+        dependencies: [
+          PubspecYamlFileDependency(name: 'aaa'),
+        ],
+      ),
+    );
+
+    // With dependency on `package:aaa` added, no lint is reported.
+    expect(await _computeTestFileErrors(), isEmpty);
+
+    // Lints don't affect summaries, nothing should be linked.
+    _assertNoLinkedCycles();
+  }
+
   test_lints() async {
     useEmptyByteStore();
 
@@ -204,4 +265,17 @@
   void _assertNoLinkedCycles() {
     expect(_linkedCycles, isEmpty);
   }
+
+  /// Note that we intentionally use this method, we don't want to use
+  /// [resolveFile] instead. Resolving a file will force to produce its
+  /// resolved AST, and as a result to recompute the errors.
+  ///
+  /// But this method is used to check returning errors from the cache, or
+  /// recomputing when the cache key is expected to be different.
+  Future<List<AnalysisError>> _computeTestFileErrors() async {
+    var errorsResult = await contextFor(testFilePath)
+        .currentSession
+        .getErrors2(testFilePath) as ErrorsResult;
+    return errorsResult.errors;
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index c8ffb4d..bfbaa94 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -347,22 +347,49 @@
 }
 
 class PubspecYamlFileConfig {
+  final String? name;
   final String? sdkVersion;
+  final List<PubspecYamlFileDependency> dependencies;
 
-  PubspecYamlFileConfig({this.sdkVersion});
+  PubspecYamlFileConfig({
+    this.name,
+    this.sdkVersion,
+    this.dependencies = const [],
+  });
 
   String toContent() {
     var buffer = StringBuffer();
 
+    if (name != null) {
+      buffer.writeln('name: $name');
+    }
+
     if (sdkVersion != null) {
       buffer.writeln('environment:');
       buffer.writeln("  sdk: '$sdkVersion'");
     }
 
+    if (dependencies.isNotEmpty) {
+      buffer.writeln('dependencies:');
+      for (var dependency in dependencies) {
+        buffer.writeln('  ${dependency.name}: ${dependency.version}');
+      }
+    }
+
     return buffer.toString();
   }
 }
 
+class PubspecYamlFileDependency {
+  final String name;
+  final String version;
+
+  PubspecYamlFileDependency({
+    required this.name,
+    this.version = 'any',
+  });
+}
+
 mixin WithNoImplicitCastsMixin on PubPackageResolutionTest {
   Future<void> assertErrorsWithNoImplicitCasts(
     String code,
diff --git a/pkg/analyzer/test/src/diagnostics/avoid_types_as_parameter_names_test.dart b/pkg/analyzer/test/src/diagnostics/avoid_types_as_parameter_names_test.dart
deleted file mode 100644
index f6563a0..0000000
--- a/pkg/analyzer/test/src/diagnostics/avoid_types_as_parameter_names_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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:analyzer/src/dart/error/lint_codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-/// TODO(scheglov) Remove the file after fixing the linter.
-/// https://github.com/dart-lang/sdk/issues/46039
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AvoidTypesAsParameterNamesTest);
-  });
-}
-
-@reflectiveTest
-class AvoidTypesAsParameterNamesTest extends PubPackageResolutionTest {
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageAnalysisOptionsFile(
-      AnalysisOptionsFileConfig(
-        lints: [
-          'avoid_types_as_parameter_names',
-        ],
-      ),
-    );
-  }
-
-  test_fieldFormalParameter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  final int num;
-  const A(this.num);
-}
-''');
-  }
-
-  test_simpleFormalParameter_function() async {
-    await assertErrorsInCode(r'''
-void f(int) {}
-''', [
-      error(LintCode('avoid_types_as_parameter_names', ''), 7, 3),
-    ]);
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
index 89c5750..00b7f90 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -25,10 +24,6 @@
 }
 ''', [
       error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 27, 1),
-      // TODO(srawlins): Don't report this from within a mixin.
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/46039
-      error(
-          CompileTimeErrorCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, 29, 6),
     ]);
 
     var element = findElement.mixin('M');
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 97e5005..0625bd7 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -35,8 +35,6 @@
 import 'async_for_in_wrong_context_test.dart' as async_for_in_wrong_context;
 import 'async_keyword_used_as_identifier_test.dart'
     as async_keyword_used_as_identifier;
-import 'avoid_types_as_parameter_names_test.dart'
-    as avoid_types_as_parameter_names;
 import 'await_in_late_local_variable_initializer_test.dart'
     as await_in_late_local_variable_initializer;
 import 'await_in_wrong_context_test.dart' as await_in_wrong_context;
@@ -728,7 +726,6 @@
     assignment_to_type.main();
     async_for_in_wrong_context.main();
     async_keyword_used_as_identifier.main();
-    avoid_types_as_parameter_names.main();
     await_in_late_local_variable_initializer.main();
     await_in_wrong_context.main();
     binary_operator_written_out.main();
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index eb5b694..da97a49 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -243,13 +243,13 @@
   __ movq(RDI, Address(RSP, 4 * target::kWordSize));  // x_digits
   __ movq(R8, Address(RSP, 3 * target::kWordSize));   // x_used is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(R8, R8);
+  __ movsxd(R8, R8);
 #endif
   __ subq(R8, Immediate(2));  // x_used > 0, Smi. R8 = x_used - 1, round up.
   __ sarq(R8, Immediate(2));  // R8 + 1 = number of digit pairs to read.
   __ movq(RCX, Address(RSP, 2 * target::kWordSize));  // n is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RCX, RCX);
+  __ movsxd(RCX, RCX);
 #endif
   __ SmiUntag(RCX);
   __ movq(RBX, Address(RSP, 1 * target::kWordSize));  // r_digits
@@ -289,7 +289,7 @@
   __ movq(RDI, Address(RSP, 4 * target::kWordSize));  // x_digits
   __ movq(RCX, Address(RSP, 2 * target::kWordSize));  // n is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RCX, RCX);
+  __ movsxd(RCX, RCX);
 #endif
   __ SmiUntag(RCX);
   __ movq(RBX, Address(RSP, 1 * target::kWordSize));  // r_digits
@@ -297,7 +297,7 @@
   __ sarq(RDX, Immediate(6));  // RDX = n ~/ (2*_DIGIT_BITS).
   __ movq(RSI, Address(RSP, 3 * target::kWordSize));  // x_used is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RSI, RSI);
+  __ movsxd(RSI, RSI);
 #endif
   __ subq(RSI, Immediate(2));  // x_used > 0, Smi. RSI = x_used - 1, round up.
   __ sarq(RSI, Immediate(2));
@@ -335,14 +335,14 @@
   __ movq(RDI, Address(RSP, 5 * target::kWordSize));  // digits
   __ movq(R8, Address(RSP, 4 * target::kWordSize));   // used is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(R8, R8);
+  __ movsxd(R8, R8);
 #endif
   __ addq(R8, Immediate(2));  // used > 0, Smi. R8 = used + 1, round up.
   __ sarq(R8, Immediate(2));  // R8 = number of digit pairs to process.
   __ movq(RSI, Address(RSP, 3 * target::kWordSize));  // a_digits
   __ movq(RCX, Address(RSP, 2 * target::kWordSize));  // a_used is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RCX, RCX);
+  __ movsxd(RCX, RCX);
 #endif
   __ addq(RCX, Immediate(2));  // a_used > 0, Smi. R8 = a_used + 1, round up.
   __ sarq(RCX, Immediate(2));  // R8 = number of digit pairs to process.
@@ -402,14 +402,14 @@
   __ movq(RDI, Address(RSP, 5 * target::kWordSize));  // digits
   __ movq(R8, Address(RSP, 4 * target::kWordSize));   // used is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(R8, R8);
+  __ movsxd(R8, R8);
 #endif
   __ addq(R8, Immediate(2));  // used > 0, Smi. R8 = used + 1, round up.
   __ sarq(R8, Immediate(2));  // R8 = number of digit pairs to process.
   __ movq(RSI, Address(RSP, 3 * target::kWordSize));  // a_digits
   __ movq(RCX, Address(RSP, 2 * target::kWordSize));  // a_used is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RCX, RCX);
+  __ movsxd(RCX, RCX);
 #endif
   __ addq(RCX, Immediate(2));  // a_used > 0, Smi. R8 = a_used + 1, round up.
   __ sarq(RCX, Immediate(2));  // R8 = number of digit pairs to process.
@@ -489,7 +489,7 @@
   __ movq(RCX, Address(RSP, 7 * target::kWordSize));  // x_digits
   __ movq(RAX, Address(RSP, 6 * target::kWordSize));  // xi is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RAX, RAX);
+  __ movsxd(RAX, RAX);
 #endif
   __ movq(RBX,
           FieldAddress(RCX, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -499,7 +499,7 @@
   // R8 = (SmiUntag(n) + 1)/2, no_op if n == 0
   __ movq(R8, Address(RSP, 1 * target::kWordSize));  // n is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(R8, R8);
+  __ movsxd(R8, R8);
 #endif
   __ addq(R8, Immediate(2));
   __ sarq(R8, Immediate(2));  // R8 = number of digit pairs to process.
@@ -509,7 +509,7 @@
   __ movq(RDI, Address(RSP, 5 * target::kWordSize));  // m_digits
   __ movq(RAX, Address(RSP, 4 * target::kWordSize));  // i is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RAX, RAX);
+  __ movsxd(RAX, RAX);
 #endif
   __ leaq(RDI,
           FieldAddress(RDI, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -518,7 +518,7 @@
   __ movq(RSI, Address(RSP, 3 * target::kWordSize));  // a_digits
   __ movq(RAX, Address(RSP, 2 * target::kWordSize));  // j is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RAX, RAX);
+  __ movsxd(RAX, RAX);
 #endif
   __ leaq(RSI,
           FieldAddress(RSI, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -609,7 +609,7 @@
   __ movq(RDI, Address(RSP, 4 * target::kWordSize));  // x_digits
   __ movq(RAX, Address(RSP, 3 * target::kWordSize));  // i is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RAX, RAX);
+  __ movsxd(RAX, RAX);
 #endif
   __ leaq(RDI,
           FieldAddress(RDI, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -730,7 +730,7 @@
   __ movq(RBX, Address(RSP, 2 * target::kWordSize));  // digits
   __ movq(RAX, Address(RSP, 1 * target::kWordSize));  // i is Smi and odd.
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RAX, RAX);
+  __ movsxd(RAX, RAX);
 #endif
   __ leaq(RBX, FieldAddress(
                    RBX, RAX, TIMES_2,
@@ -785,7 +785,7 @@
   __ movq(RBX, Address(RSP, 2 * target::kWordSize));  // digits
   __ movq(RAX, Address(RSP, 1 * target::kWordSize));  // i is Smi
 #if defined(DART_COMPRESSED_POINTERS)
-  __ movsxw(RAX, RAX);
+  __ movsxd(RAX, RAX);
 #endif
   __ movq(RAX,
           FieldAddress(RBX, RAX, TIMES_2, target::TypedData::data_offset()));
diff --git a/sdk/lib/html/doc/WORKAROUNDS.md b/sdk/lib/html/doc/WORKAROUNDS.md
index d3d8456..39a1c06 100644
--- a/sdk/lib/html/doc/WORKAROUNDS.md
+++ b/sdk/lib/html/doc/WORKAROUNDS.md
@@ -26,7 +26,7 @@
 missing the API `readAsBinaryString` ([#42834][]). We can work around this by
 doing something like the following:
 
-```
+```dart
 import 'dart:html';
 import 'dart:js_util' as js_util;
 
@@ -50,7 +50,7 @@
 `callConstructor`. For example, instead of using the factory constructor for
 `KeyboardEvent`, we can do the following:
 
-```
+```dart
 import 'dart:html';
 import 'dart:js_util' as js_util;
 
@@ -77,7 +77,7 @@
 again to circumvent this issue. For example, we can manipulate a
 `_SubtleCrypto` object:
 
-```
+```dart
 import 'dart:html';
 import 'dart:js_util' as js_util;
 import 'dart:typed_data';
@@ -99,7 +99,7 @@
 What you shouldn’t do is attempt to cast these native objects using your own JS
 interop types, e.g.
 
-```
+```dart
 import 'dart:html';
 
 import 'package:js/js.dart';
diff --git a/tests/corelib/very_big_integer_test.dart b/tests/corelib/very_big_integer_test.dart
new file mode 100644
index 0000000..cbfc609
--- /dev/null
+++ b/tests/corelib/very_big_integer_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.
+
+import "package:expect/expect.dart";
+
+main() {
+  // x and y have lengths in 32-bit digits that overflow 16 bits.
+  var x = new BigInt.from(13) << (65000 * 32);
+  var y = new BigInt.from(42) << (65000 * 32);
+  print(x.bitLength);
+  Expect.equals(x, (x + y) - y);
+  Expect.equals(x, -((-x + y) - y));
+  Expect.equals(x, (x << 2) >> 2);
+  Expect.equals(x, (x >> 3) << 3);
+  Expect.equals(0, (x ^ x).toInt());
+  Expect.equals(0, (y ^ y).toInt());
+}
diff --git a/tests/corelib_2/very_big_integer_test.dart b/tests/corelib_2/very_big_integer_test.dart
new file mode 100644
index 0000000..11465f9
--- /dev/null
+++ b/tests/corelib_2/very_big_integer_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// @dart = 2.9
+
+import "package:expect/expect.dart";
+
+main() {
+  // x and y have lengths in 32-bit digits that overflow 16 bits.
+  var x = new BigInt.from(13) << (65000 * 32);
+  var y = new BigInt.from(42) << (65000 * 32);
+  print(x.bitLength);
+  Expect.equals(x, (x + y) - y);
+  Expect.equals(x, -((-x + y) - y));
+  Expect.equals(x, (x << 2) >> 2);
+  Expect.equals(x, (x >> 3) << 3);
+  Expect.equals(0, (x ^ x).toInt());
+  Expect.equals(0, (y ^ y).toInt());
+}
diff --git a/tools/VERSION b/tools/VERSION
index addd689..8d3dadb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 182
+PRERELEASE 183
 PRERELEASE_PATCH 0
\ No newline at end of file