[core lib] Add unimplemented int.operator >>>

This change adds a placeholder for int.operator >>>.
No implementation is added yet.

This change unblocks implementation of this operator in
the backends (VM, dart2js, DDC).

Issue: https://github.com/dart-lang/sdk/issues/44912
Issue: https://github.com/dart-lang/sdk/issues/30892
Change-Id: I9912ca9f44d594e9c5fa91f5fc65e807fe48cc7a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/185480
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
diff --git a/pkg/dev_compiler/lib/src/compiler/js_names.dart b/pkg/dev_compiler/lib/src/compiler/js_names.dart
index 7d3ff1e..81e3899 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_names.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_names.dart
@@ -399,6 +399,7 @@
   '&': 'bitAnd',
   '<<': 'leftShift',
   '>>': 'rightShift',
+  '>>>': 'tripleShift',
   '~': 'bitNot',
   // These ones are always renamed, hence the choice of `_` to avoid conflict
   // with Dart names. See _emitMemberName.
diff --git a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
index 960c5e4..98ddc8c 100644
--- a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
@@ -1,6 +1,7 @@
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|Superinterfaces don't have a valid override for '&': JSNumber.& (num Function(num)), int.& (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|Superinterfaces don't have a valid override for '<<': JSNumber.<< (num Function(num)), int.<< (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|Superinterfaces don't have a valid override for '>>': JSNumber.>> (num Function(num)), int.>> (int Function(int)).
+ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|Superinterfaces don't have a valid override for '>>>': JSNumber.>>> (num Function(num)), int.>>> (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|Superinterfaces don't have a valid override for '\|': JSNumber.\| (num Function(num)), int.\| (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|Superinterfaces don't have a valid override for '^': JSNumber.^ (num Function(num)), int.^ (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|The operator '&' isn't defined for the type 'JSInt'.
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index dd83595..f1cd943 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -478,7 +478,7 @@
 ParseStringResult _parseString(String source, {bool useNnbd}) {
   var features = FeatureSet.fromEnableFlags2(
     sdkLanguageVersion: Version.parse('2.10.0'),
-    flags: [if (useNnbd) 'non-nullable'],
+    flags: [if (useNnbd) 'non-nullable', 'triple-shift'],
   );
   return parseString(content: source, featureSet: features);
 }
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 2c56811..e08bdf9 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -141,6 +141,7 @@
 const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
     const AllowedExperimentalFlags(sdkDefaultExperiments: {
   ExperimentalFlag.nonNullable,
+  ExperimentalFlag.tripleShift,
 }, sdkLibraryExperiments: {}, packageExperiments: {
   "async": {
     ExperimentalFlag.nonNullable,
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.expect
index a425f18..bb1a380 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.expect
@@ -7,25 +7,10 @@
 // const int unaryPlus = +2;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int shiftNegative2 = 2 >>> -1;
-//                              ^^^
-//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // const int divZero = 2 / 0;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift2 = 84 >>> 1;
-//                             ^^^
-//
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift3 = 21 >>> 64;
-//                             ^^^
-//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Error: Constant evaluation error:
 // const int shiftNegative1 = 2 << -1;
 //                              ^
@@ -36,6 +21,16 @@
 // const int shiftNegative1 = 2 << -1;
 //           ^
 //
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: Constant evaluation error:
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Context: Binary operator '>>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:11: Context: While analyzing:
+// const int shiftNegative2 = 2 >>> -1;
+//           ^
+//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Error: Constant evaluation error:
 // const int shiftNegative3 = 2 >> -1;
 //                              ^
@@ -100,10 +95,7 @@
 import "dart:core" as core;
 
 static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.";
-static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int shiftNegative2 = 2 >>> -1;
-                             ^^^";
+static const field core::int* shiftNegative2 = invalid-expression "Binary operator '>>>' on '2.0' requires non-negative operand, but was '-1.0'.";
 static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.";
 static const field core::int* modZero = invalid-expression "Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -125,35 +117,30 @@
 static const field core::int* binaryAnd = #C3;
 static const field core::int* binaryXor = #C3;
 static const field core::int* binaryShift1 = #C3;
-static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift2 = 84 >>> 1;
-                            ^^^";
-static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift3 = 21 >>> 64;
-                            ^^^";
+static const field core::int* binaryShift2 = #C3;
+static const field core::int* binaryShift3 = #C4;
 static const field core::int* binaryShift4 = #C3;
-static const field core::int* binaryShift5 = #C4;
-static const field core::bool* binaryLess = #C5;
-static const field core::bool* binaryLessEqual = #C6;
-static const field core::bool* binaryGreaterEqual = #C6;
-static const field core::bool* binaryGreater = #C5;
+static const field core::int* binaryShift5 = #C5;
+static const field core::bool* binaryLess = #C6;
+static const field core::bool* binaryLessEqual = #C7;
+static const field core::bool* binaryGreaterEqual = #C7;
+static const field core::bool* binaryGreater = #C6;
 static const field core::int* doubleTruncateDiv = #C3;
 static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
-static const field core::double* doubleNan = #C7;
+static const field core::double* doubleNan = #C8;
 static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
-static const field core::int* bigNumber = #C8;
+static const field core::int* bigNumber = #C9;
 static method main() → dynamic {}
 
 constants  {
   #C1 = -2.0
   #C2 = 4294967293.0
   #C3 = 42.0
-  #C4 = 4294967295.0
-  #C5 = false
-  #C6 = true
-  #C7 = NaN
-  #C8 = 9223372036854776000.0
+  #C4 = 0.0
+  #C5 = 4294967295.0
+  #C6 = false
+  #C7 = true
+  #C8 = NaN
+  #C9 = 9223372036854776000.0
 }
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.outline.expect
index 870f990..ce47e53 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.outline.expect
@@ -7,33 +7,15 @@
 // const int unaryPlus = +2;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int shiftNegative2 = 2 >>> -1;
-//                              ^^^
-//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // const int divZero = 2 / 0;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift2 = 84 >>> 1;
-//                             ^^^
-//
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift3 = 21 >>> 64;
-//                             ^^^
-//
 import self as self;
 import "dart:core" as core;
 
 static const field core::int* shiftNegative1 = 2.{core::int::<<}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::int*};
-static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int shiftNegative2 = 2 >>> -1;
-                             ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* shiftNegative2 = 2.{core::int::>>>}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::int*};
 static const field core::int* shiftNegative3 = 2.{core::int::>>}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::int*};
 static const field core::int* modZero = 2.{core::num::%}(0){(core::num*) →* core::int*};
 static const field core::int* divZero = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -55,14 +37,8 @@
 static const field core::int* binaryAnd = 63.{core::int::&}(106){(core::int*) →* core::int*};
 static const field core::int* binaryXor = 63.{core::int::^}(21){(core::int*) →* core::int*};
 static const field core::int* binaryShift1 = 21.{core::int::<<}(1){(core::int*) →* core::int*};
-static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift2 = 84 >>> 1;
-                            ^^^" as{TypeError,ForDynamic} core::int*;
-static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift3 = 21 >>> 64;
-                            ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryShift2 = 84.{core::int::>>>}(1){(core::int*) →* core::int*};
+static const field core::int* binaryShift3 = 21.{core::int::>>>}(64){(core::int*) →* core::int*};
 static const field core::int* binaryShift4 = 84.{core::int::>>}(1){(core::int*) →* core::int*};
 static const field core::int* binaryShift5 = 1.{core::int::unary-}(){() →* core::int*}.{core::int::>>}(1){(core::int*) →* core::int*};
 static const field core::bool* binaryLess = 42.{core::num::<}(42){(core::num*) →* core::bool*};
@@ -81,6 +57,7 @@
 
 Extra constant evaluation status:
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:5:33 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:6:34 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:7:33 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:9:23 -> DoubleConstant(Infinity)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:11:24 -> DoubleConstant(-2.0)
@@ -95,6 +72,8 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:22:26 -> DoubleConstant(42.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:23:26 -> DoubleConstant(42.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:24:29 -> DoubleConstant(42.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:27:29 -> DoubleConstant(42.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:28:29 -> DoubleConstant(0.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:30:29 -> DoubleConstant(42.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:31:29 -> DoubleConstant(4294967295.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:32:28 -> BoolConstant(false)
@@ -104,4 +83,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:37:36 -> DoubleConstant(42.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///number_folds.dart:40:27 -> DoubleConstant(NaN)
 Evaluated: StaticGet @ org-dartlang-testcase:///number_folds.dart:41:42 -> DoubleConstant(NaN)
-Extra constant evaluation: evaluated: 38, effectively constant: 24
+Extra constant evaluation: evaluated: 39, effectively constant: 27
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.transformed.expect
index a425f18..bb1a380 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.transformed.expect
@@ -7,25 +7,10 @@
 // const int unaryPlus = +2;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int shiftNegative2 = 2 >>> -1;
-//                              ^^^
-//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // const int divZero = 2 / 0;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift2 = 84 >>> 1;
-//                             ^^^
-//
-// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift3 = 21 >>> 64;
-//                             ^^^
-//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Error: Constant evaluation error:
 // const int shiftNegative1 = 2 << -1;
 //                              ^
@@ -36,6 +21,16 @@
 // const int shiftNegative1 = 2 << -1;
 //           ^
 //
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: Constant evaluation error:
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Context: Binary operator '>>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:11: Context: While analyzing:
+// const int shiftNegative2 = 2 >>> -1;
+//           ^
+//
 // pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Error: Constant evaluation error:
 // const int shiftNegative3 = 2 >> -1;
 //                              ^
@@ -100,10 +95,7 @@
 import "dart:core" as core;
 
 static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.";
-static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int shiftNegative2 = 2 >>> -1;
-                             ^^^";
+static const field core::int* shiftNegative2 = invalid-expression "Binary operator '>>>' on '2.0' requires non-negative operand, but was '-1.0'.";
 static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.";
 static const field core::int* modZero = invalid-expression "Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -125,35 +117,30 @@
 static const field core::int* binaryAnd = #C3;
 static const field core::int* binaryXor = #C3;
 static const field core::int* binaryShift1 = #C3;
-static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift2 = 84 >>> 1;
-                            ^^^";
-static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift3 = 21 >>> 64;
-                            ^^^";
+static const field core::int* binaryShift2 = #C3;
+static const field core::int* binaryShift3 = #C4;
 static const field core::int* binaryShift4 = #C3;
-static const field core::int* binaryShift5 = #C4;
-static const field core::bool* binaryLess = #C5;
-static const field core::bool* binaryLessEqual = #C6;
-static const field core::bool* binaryGreaterEqual = #C6;
-static const field core::bool* binaryGreater = #C5;
+static const field core::int* binaryShift5 = #C5;
+static const field core::bool* binaryLess = #C6;
+static const field core::bool* binaryLessEqual = #C7;
+static const field core::bool* binaryGreaterEqual = #C7;
+static const field core::bool* binaryGreater = #C6;
 static const field core::int* doubleTruncateDiv = #C3;
 static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
-static const field core::double* doubleNan = #C7;
+static const field core::double* doubleNan = #C8;
 static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
-static const field core::int* bigNumber = #C8;
+static const field core::int* bigNumber = #C9;
 static method main() → dynamic {}
 
 constants  {
   #C1 = -2.0
   #C2 = 4294967293.0
   #C3 = 42.0
-  #C4 = 4294967295.0
-  #C5 = false
-  #C6 = true
-  #C7 = NaN
-  #C8 = 9223372036854776000.0
+  #C4 = 0.0
+  #C5 = 4294967295.0
+  #C6 = false
+  #C7 = true
+  #C8 = NaN
+  #C9 = 9223372036854776000.0
 }
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.expect
index f20a0df..dc5a80f 100644
--- a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.expect
@@ -7,25 +7,10 @@
 // const int unaryPlus = +2;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int shiftNegative2 = 2 >>> -1;
-//                              ^^^
-//
 // pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // const int divZero = 2 / 0;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift2 = 84 >>> 1;
-//                             ^^^
-//
-// pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift3 = 21 >>> 64;
-//                             ^^^
-//
 // pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Error: Constant evaluation error:
 // const int shiftNegative1 = 2 << -1;
 //                              ^
@@ -36,6 +21,16 @@
 // const int shiftNegative1 = 2 << -1;
 //           ^
 //
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: Constant evaluation error:
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Context: Binary operator '>>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:11: Context: While analyzing:
+// const int shiftNegative2 = 2 >>> -1;
+//           ^
+//
 // pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Error: Constant evaluation error:
 // const int shiftNegative3 = 2 >> -1;
 //                              ^
@@ -100,10 +95,7 @@
 import "dart:core" as core;
 
 static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2' requires non-negative operand, but was '-1'.";
-static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int shiftNegative2 = 2 >>> -1;
-                             ^^^";
+static const field core::int* shiftNegative2 = invalid-expression "Binary operator '>>>' on '2' requires non-negative operand, but was '-1'.";
 static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2' requires non-negative operand, but was '-1'.";
 static const field core::int* modZero = invalid-expression "Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -125,23 +117,17 @@
 static const field core::int* binaryAnd = #C3;
 static const field core::int* binaryXor = #C3;
 static const field core::int* binaryShift1 = #C3;
-static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift2 = 84 >>> 1;
-                            ^^^";
-static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift3 = 21 >>> 64;
-                            ^^^";
+static const field core::int* binaryShift2 = #C3;
+static const field core::int* binaryShift3 = #C5;
 static const field core::int* binaryShift4 = #C3;
-static const field core::bool* binaryLess = #C5;
-static const field core::bool* binaryLessEqual = #C6;
-static const field core::bool* binaryGreaterEqual = #C6;
-static const field core::bool* binaryGreater = #C5;
+static const field core::bool* binaryLess = #C6;
+static const field core::bool* binaryLessEqual = #C7;
+static const field core::bool* binaryGreaterEqual = #C7;
+static const field core::bool* binaryGreater = #C6;
 static const field core::int* doubleTruncateDiv = #C3;
 static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
-static const field core::double* doubleNan = #C7;
+static const field core::double* doubleNan = #C8;
 static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
 static method main() → dynamic {}
 
@@ -150,7 +136,8 @@
   #C2 = -3
   #C3 = 42
   #C4 = 42.0
-  #C5 = false
-  #C6 = true
-  #C7 = NaN
+  #C5 = 0
+  #C6 = false
+  #C7 = true
+  #C8 = NaN
 }
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.outline.expect
index 0c36235..f1e66af 100644
--- a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.outline.expect
@@ -7,33 +7,15 @@
 // const int unaryPlus = +2;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int shiftNegative2 = 2 >>> -1;
-//                              ^^^
-//
 // pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // const int divZero = 2 / 0;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift2 = 84 >>> 1;
-//                             ^^^
-//
-// pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift3 = 21 >>> 64;
-//                             ^^^
-//
 import self as self;
 import "dart:core" as core;
 
 static const field core::int* shiftNegative1 = 2.{core::int::<<}(1.{core::int::unary-}());
-static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int shiftNegative2 = 2 >>> -1;
-                             ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* shiftNegative2 = 2.{core::int::>>>}(1.{core::int::unary-}());
 static const field core::int* shiftNegative3 = 2.{core::int::>>}(1.{core::int::unary-}());
 static const field core::int* modZero = 2.{core::num::%}(0);
 static const field core::int* divZero = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -55,14 +37,8 @@
 static const field core::int* binaryAnd = 63.{core::int::&}(106);
 static const field core::int* binaryXor = 63.{core::int::^}(21);
 static const field core::int* binaryShift1 = 21.{core::int::<<}(1);
-static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift2 = 84 >>> 1;
-                            ^^^" as{TypeError,ForDynamic} core::int*;
-static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift3 = 21 >>> 64;
-                            ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryShift2 = 84.{core::int::>>>}(1);
+static const field core::int* binaryShift3 = 21.{core::int::>>>}(64);
 static const field core::int* binaryShift4 = 84.{core::int::>>}(1);
 static const field core::bool* binaryLess = 42.{core::num::<}(42);
 static const field core::bool* binaryLessEqual = 42.{core::num::<=}(42);
@@ -79,6 +55,7 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:5:33 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:6:34 -> IntConstant(-1)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:7:33 -> IntConstant(-1)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:9:23 -> DoubleConstant(Infinity)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:11:24 -> IntConstant(-2)
@@ -93,6 +70,8 @@
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:22:26 -> IntConstant(42)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:23:26 -> IntConstant(42)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:24:29 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:27:29 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:28:29 -> IntConstant(0)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:30:29 -> IntConstant(42)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:31:28 -> BoolConstant(false)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:32:33 -> BoolConstant(true)
@@ -101,4 +80,4 @@
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:36:36 -> IntConstant(42)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:39:27 -> DoubleConstant(NaN)
 Evaluated: StaticGet @ org-dartlang-testcase:///number_folds.dart:40:42 -> DoubleConstant(NaN)
-Extra constant evaluation: evaluated: 37, effectively constant: 23
+Extra constant evaluation: evaluated: 38, effectively constant: 26
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.transformed.expect
index f20a0df..dc5a80f 100644
--- a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.transformed.expect
@@ -7,25 +7,10 @@
 // const int unaryPlus = +2;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int shiftNegative2 = 2 >>> -1;
-//                              ^^^
-//
 // pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // const int divZero = 2 / 0;
 //                       ^
 //
-// pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift2 = 84 >>> 1;
-//                             ^^^
-//
-// pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-// Try correcting the operator to an existing operator, or defining a '>>>' operator.
-// const int binaryShift3 = 21 >>> 64;
-//                             ^^^
-//
 // pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Error: Constant evaluation error:
 // const int shiftNegative1 = 2 << -1;
 //                              ^
@@ -36,6 +21,16 @@
 // const int shiftNegative1 = 2 << -1;
 //           ^
 //
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: Constant evaluation error:
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Context: Binary operator '>>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:11: Context: While analyzing:
+// const int shiftNegative2 = 2 >>> -1;
+//           ^
+//
 // pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Error: Constant evaluation error:
 // const int shiftNegative3 = 2 >> -1;
 //                              ^
@@ -100,10 +95,7 @@
 import "dart:core" as core;
 
 static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2' requires non-negative operand, but was '-1'.";
-static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int shiftNegative2 = 2 >>> -1;
-                             ^^^";
+static const field core::int* shiftNegative2 = invalid-expression "Binary operator '>>>' on '2' requires non-negative operand, but was '-1'.";
 static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2' requires non-negative operand, but was '-1'.";
 static const field core::int* modZero = invalid-expression "Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -125,23 +117,17 @@
 static const field core::int* binaryAnd = #C3;
 static const field core::int* binaryXor = #C3;
 static const field core::int* binaryShift1 = #C3;
-static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift2 = 84 >>> 1;
-                            ^^^";
-static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
-Try correcting the operator to an existing operator, or defining a '>>>' operator.
-const int binaryShift3 = 21 >>> 64;
-                            ^^^";
+static const field core::int* binaryShift2 = #C3;
+static const field core::int* binaryShift3 = #C5;
 static const field core::int* binaryShift4 = #C3;
-static const field core::bool* binaryLess = #C5;
-static const field core::bool* binaryLessEqual = #C6;
-static const field core::bool* binaryGreaterEqual = #C6;
-static const field core::bool* binaryGreater = #C5;
+static const field core::bool* binaryLess = #C6;
+static const field core::bool* binaryLessEqual = #C7;
+static const field core::bool* binaryGreaterEqual = #C7;
+static const field core::bool* binaryGreater = #C6;
 static const field core::int* doubleTruncateDiv = #C3;
 static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
 static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
-static const field core::double* doubleNan = #C7;
+static const field core::double* doubleNan = #C8;
 static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
 static method main() → dynamic {}
 
@@ -150,7 +136,8 @@
   #C2 = -3
   #C3 = 42
   #C4 = 42.0
-  #C5 = false
-  #C6 = true
-  #C7 = NaN
+  #C5 = 0
+  #C6 = false
+  #C7 = true
+  #C8 = NaN
 }
diff --git a/sdk/lib/_internal/allowed_experiments.json b/sdk/lib/_internal/allowed_experiments.json
index 4644443..66da861 100644
--- a/sdk/lib/_internal/allowed_experiments.json
+++ b/sdk/lib/_internal/allowed_experiments.json
@@ -1,13 +1,17 @@
 {
   "version": 1,
   "experimentSets": {
+    "sdkExperiments": [
+      "non-nullable",
+      "triple-shift"
+    ],
     "nullSafety": [
       "non-nullable"
     ]
   },
   "sdk": {
     "default": {
-      "experimentSet": "nullSafety"
+      "experimentSet": "sdkExperiments"
     },
     "_example_libraries": {
       "ui": {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_number.dart b/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
index 60b9246..c70de91 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
@@ -335,6 +335,9 @@
     return _shrOtherPositive(other);
   }
 
+  int operator >>>(@nullCheck num other) =>
+    throw UnimplementedError('int.>>> is not implemented yet');
+
   @notNull
   int _shrOtherPositive(@notNull num other) {
     return JS<num>('!', '#', this) > 0
diff --git a/sdk/lib/_internal/js_runtime/lib/js_number.dart b/sdk/lib/_internal/js_runtime/lib/js_number.dart
index eac0bc3..1d3ad24 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_number.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_number.dart
@@ -404,6 +404,9 @@
     return _shrOtherPositive(other);
   }
 
+  num operator >>>(num other) =>
+    throw UnimplementedError('int.>>> is not implemented yet');
+
   num _shrOtherPositive(num other) {
     return JS('num', '#', this) > 0
         ? _shrBothPositive(other)
diff --git a/sdk/lib/_internal/vm/lib/integers.dart b/sdk/lib/_internal/vm/lib/integers.dart
index 3ce3af5..f53e439 100644
--- a/sdk/lib/_internal/vm/lib/integers.dart
+++ b/sdk/lib/_internal/vm/lib/integers.dart
@@ -105,6 +105,9 @@
   @pragma("vm:non-nullable-result-type")
   @pragma("vm:never-inline")
   int operator >>(int other) => other._shrFromInteger(this);
+  @pragma("vm:never-inline")
+  int operator >>>(int other) =>
+    throw UnimplementedError('int.>>> is not implemented yet');
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:non-nullable-result-type")
   @pragma("vm:never-inline")
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 1578770..dd35a3f 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -105,6 +105,17 @@
   /// It is an error if [shiftAmount] is negative.
   int operator >>(int shiftAmount);
 
+  /// Bitwise unsigned right shift by [shiftAmount] bits.
+  ///
+  /// NOT IMPLEMENTED YET.
+  ///
+  /// The least significant [shiftAmount] bits are dropped,
+  /// the remaining bits (if any) are shifted down,
+  /// and zero-bits are shifted in as the new most signficant bits.
+  ///
+  /// The [shiftAmount] must be non-negative.
+  int operator >>>(int shiftAmount);
+
   /// Returns this integer to the power of [exponent] modulo [modulus].
   ///
   /// The [exponent] must be non-negative and [modulus] must be