diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index ff28b32..cfe297c4 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -4019,7 +4019,7 @@
             var element = parameter.declaredElement!;
             errorReporter.reportErrorForNode(
               CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
-              parameter,
+              parameter.name,
               [element.displayName, element.bound],
             );
             break;
diff --git a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
index fea9303..001d947 100644
--- a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
@@ -22,7 +22,7 @@
 class A<T extends T> {
 }
 ''', [
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 1),
     ]);
   }
 
@@ -34,7 +34,7 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 1),
     ]);
   }
 
@@ -43,8 +43,8 @@
 class A<T1 extends T3, T2, T3 extends T1> {
 }
 ''', [
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 13),
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 13),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 2),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 2),
     ]);
   }
 }
diff --git a/pkg/nnbd_migration/tool/postmortem.dart b/pkg/nnbd_migration/tool/postmortem.dart
deleted file mode 100644
index a523b3a..0000000
--- a/pkg/nnbd_migration/tool/postmortem.dart
+++ /dev/null
@@ -1,21 +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:args/args.dart';
-import 'package:meta/meta.dart';
-
-void main(List<String> args) {}
-
-class Subcommand {
-  final String name;
-  final String suffix;
-  final String help;
-  final ArgParser argParser;
-
-  Subcommand(
-      {@required this.name,
-      this.suffix,
-      @required this.help,
-      @required this.argParser});
-}
diff --git a/sdk/lib/math/rectangle.dart b/sdk/lib/math/rectangle.dart
index e80d790..1fe8ea9 100644
--- a/sdk/lib/math/rectangle.dart
+++ b/sdk/lib/math/rectangle.dart
@@ -137,9 +137,12 @@
   /// single point `(left, top)`.
   const Rectangle(this.left, this.top, T width, T height)
       : width = (width < 0)
-            ? (-width * 0) as dynamic
-            : width, // Inline _clampToZero<num>.
-        height = (height < 0) ? (-height * 0) as dynamic : height;
+            ? (width == double.negativeInfinity ? 0.0 : (-width * 0)) as dynamic
+            : (width + 0 as dynamic), // Inline _clampToZero<num>.
+        height = (height < 0)
+            ? (height == double.negativeInfinity ? 0.0 : (-height * 0))
+                as dynamic
+            : (height + 0 as dynamic);
 
   /// Create a rectangle spanned by the points [a] and [b];
   ///
@@ -189,8 +192,10 @@
   /// If `width` and `height` are zero, the "rectangle" comprises only the
   /// single point `(left, top)`.
   MutableRectangle(this.left, this.top, T width, T height)
-      : this._width = (width < 0) ? _clampToZero<T>(width) : width,
-        this._height = (height < 0) ? _clampToZero<T>(height) : height;
+      : this._width =
+            (width < 0) ? _clampToZero<T>(width) : (width + 0 as dynamic),
+        this._height =
+            (height < 0) ? _clampToZero<T>(height) : (height + 0 as dynamic);
 
   /// Create a mutable rectangle spanned by the points [a] and [b];
   ///
@@ -244,5 +249,6 @@
 /// Returns `0` if value is int, `0.0` if value is double.
 T _clampToZero<T extends num>(T value) {
   assert(value < 0);
-  return (-value * 0) as T;
+  if (value == double.negativeInfinity) return 0.0 as dynamic;
+  return (-value * 0) as dynamic;
 }
diff --git a/tests/lib/math/rectangle_test.dart b/tests/lib/math/rectangle_test.dart
index f6cf2b2..15422e7 100644
--- a/tests/lib/math/rectangle_test.dart
+++ b/tests/lib/math/rectangle_test.dart
@@ -22,25 +22,24 @@
   testNaNHeight();
 }
 
-Rectangle? createRectangle(List<num>? a) {
-  return a != null ? new Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
-}
+Rectangle? createRectangle(List<num>? a) =>
+    a != null ? Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
 
 testConstruction() {
-  var r0 = new Rectangle(10, 20, 30, 40);
+  var r0 = Rectangle(10, 20, 30, 40);
   Expect.equals('Rectangle (10, 20) 30 x 40', r0.toString());
   Expect.equals(40, r0.right);
   Expect.equals(60, r0.bottom);
 
-  var r1 = new Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
+  var r1 = Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
   Expect.equals(r0, r1);
 
-  var r2 = new Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
+  var r2 = Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
   Expect.equals(r0, r2);
 }
 
 testIntersection() {
-  var tests = <List<List<num>?>>[
+  var tests = [
     [
       [10, 10, 20, 20],
       [15, 15, 25, 25],
@@ -64,19 +63,19 @@
   ];
 
   for (var test in tests) {
-    var r0 = createRectangle(test[0]);
-    var r1 = createRectangle(test[1]);
+    var r0 = createRectangle(test[0])!;
+    var r1 = createRectangle(test[1])!;
     var expected = createRectangle(test[2]);
 
-    Expect.equals(expected, r0?.intersection(r1!));
-    Expect.equals(expected, r1?.intersection(r0!));
+    Expect.equals(expected, r0.intersection(r1));
+    Expect.equals(expected, r1.intersection(r0));
   }
 }
 
 testIntersects() {
-  var r0 = new Rectangle(10, 10, 20, 20);
-  var r1 = new Rectangle(15, 15, 25, 25);
-  var r2 = new Rectangle(0, 0, 1, 1);
+  var r0 = Rectangle(10, 10, 20, 20);
+  var r1 = Rectangle(15, 15, 25, 25);
+  var r2 = Rectangle(0, 0, 1, 1);
 
   Expect.isTrue(r0.intersects(r1));
   Expect.isTrue(r1.intersects(r0));
@@ -110,75 +109,75 @@
   ];
 
   for (var test in tests) {
-    var r0 = createRectangle(test[0]);
-    var r1 = createRectangle(test[1]);
-    var expected = createRectangle(test[2]);
+    var r0 = createRectangle(test[0])!;
+    var r1 = createRectangle(test[1])!;
+    var expected = createRectangle(test[2])!;
 
-    Expect.equals(expected, r0?.boundingBox(r1!));
-    Expect.equals(expected, r1?.boundingBox(r0!));
+    Expect.equals(expected, r0.boundingBox(r1));
+    Expect.equals(expected, r1.boundingBox(r0));
   }
 }
 
 testContainsRectangle() {
-  var r = new Rectangle(-10, 0, 20, 10);
+  var r = Rectangle(-10, 0, 20, 10);
   Expect.isTrue(r.containsRectangle(r));
 
   Expect.isFalse(r.containsRectangle(
-      new Rectangle(double.nan, double.nan, double.nan, double.nan)));
+      Rectangle(double.nan, double.nan, double.nan, double.nan)));
 
-  var r2 = new Rectangle(0, 2, 5, 5);
+  var r2 = Rectangle(0, 2, 5, 5);
   Expect.isTrue(r.containsRectangle(r2));
   Expect.isFalse(r2.containsRectangle(r));
 
-  r2 = new Rectangle(-11, 2, 5, 5);
+  r2 = Rectangle(-11, 2, 5, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 15, 5);
+  r2 = Rectangle(0, 2, 15, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 5, 10);
+  r2 = Rectangle(0, 2, 5, 10);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 0, 5, 10);
+  r2 = Rectangle(0, 0, 5, 10);
   Expect.isTrue(r.containsRectangle(r2));
 }
 
 testContainsPoint() {
-  var r = new Rectangle(20, 40, 60, 80);
+  var r = Rectangle(20, 40, 60, 80);
 
   // Test middle.
-  Expect.isTrue(r.containsPoint(new Point(50, 80)));
+  Expect.isTrue(r.containsPoint(Point(50, 80)));
 
   // Test edges.
-  Expect.isTrue(r.containsPoint(new Point(20, 40)));
-  Expect.isTrue(r.containsPoint(new Point(50, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 80)));
-  Expect.isTrue(r.containsPoint(new Point(80, 120)));
-  Expect.isTrue(r.containsPoint(new Point(50, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 80)));
+  Expect.isTrue(r.containsPoint(Point(20, 40)));
+  Expect.isTrue(r.containsPoint(Point(50, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 80)));
+  Expect.isTrue(r.containsPoint(Point(80, 120)));
+  Expect.isTrue(r.containsPoint(Point(50, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 80)));
 
   // Test outside.
-  Expect.isFalse(r.containsPoint(new Point(0, 0)));
-  Expect.isFalse(r.containsPoint(new Point(50, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 80)));
-  Expect.isFalse(r.containsPoint(new Point(100, 160)));
-  Expect.isFalse(r.containsPoint(new Point(50, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 80)));
+  Expect.isFalse(r.containsPoint(Point(0, 0)));
+  Expect.isFalse(r.containsPoint(Point(50, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 80)));
+  Expect.isFalse(r.containsPoint(Point(100, 160)));
+  Expect.isFalse(r.containsPoint(Point(50, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 80)));
 }
 
 testHashCode() {
-  var a = new Rectangle(0, 1, 2, 3);
-  var b = new Rectangle(0, 1, 2, 3);
+  var a = Rectangle(0, 1, 2, 3);
+  var b = Rectangle(0, 1, 2, 3);
   Expect.equals(b.hashCode, a.hashCode);
 
-  var c = new Rectangle(1, 0, 2, 3);
+  var c = Rectangle(1, 0, 2, 3);
   Expect.isFalse(a.hashCode == c.hashCode);
 }
 
 testEdgeCases() {
   edgeTest(double a, double l) {
-    var r = new Rectangle(a, a, l, l);
+    var r = Rectangle(a, a, l, l);
     Expect.equals(r, r.boundingBox(r));
     Expect.equals(r, r.intersection(r));
   }
@@ -196,8 +195,8 @@
 
 testEquality() {
   var bignum = 0x80000000000008 + 0.0;
-  var r1 = new Rectangle(bignum, bignum, 1.0, 1.0);
-  var r2 = new Rectangle(bignum, bignum, 2.0, 2.0);
+  var r1 = Rectangle(bignum, bignum, 1.0, 1.0);
+  var r2 = Rectangle(bignum, bignum, 2.0, 2.0);
   Expect.equals(r2, r1);
   Expect.equals(r2.hashCode, r1.hashCode);
   Expect.equals(r2.right, r1.right);
@@ -208,17 +207,22 @@
 
 testNegativeLengths() {
   // Constructor allows negative lengths, but clamps them to zero.
-  Expect.equals(new Rectangle(4, 4, 0, 0), new Rectangle(4, 4, -2, -2));
-  Expect.equals(new Rectangle(4, 4, 0, 0), new MutableRectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), Rectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), MutableRectangle(4, 4, -2, -2));
 
   // Setters clamp negative lengths to zero.
-  var mutable = new MutableRectangle(0, 0, 1, 1);
+  var mutable = MutableRectangle(0, 0, 1, 1);
   mutable.width = -1;
   mutable.height = -1;
-  Expect.equals(new Rectangle(0, 0, 0, 0), mutable);
+  Expect.equals(Rectangle(0, 0, 0, 0), mutable);
 
   // Test that doubles are clamped to double zero.
-  var rectangle = new Rectangle(1.5, 1.5, -2.5, -2.5);
+  var rectangle = Rectangle(1.5, 1.5, -2.5, -2.5);
+  Expect.isTrue(identical(rectangle.width, 0.0));
+  Expect.isTrue(identical(rectangle.height, 0.0));
+
+  var inf = double.infinity;
+  rectangle = Rectangle(1.5, 1.5, -inf, -inf);
   Expect.isTrue(identical(rectangle.width, 0.0));
   Expect.isTrue(identical(rectangle.height, 0.0));
 }
@@ -226,14 +230,14 @@
 testNaNLeft() {
   var rectangles = [
     const Rectangle(double.nan, 1, 2, 3),
-    new MutableRectangle(double.nan, 1, 2, 3),
-    new Rectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
+    MutableRectangle(double.nan, 1, 2, 3),
+    Rectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.left.isNaN);
     Expect.isTrue(r.right.isNaN);
   }
@@ -242,14 +246,14 @@
 testNaNTop() {
   var rectangles = [
     const Rectangle(0, double.nan, 2, 3),
-    new MutableRectangle(0, double.nan, 2, 3),
-    new Rectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
+    MutableRectangle(0, double.nan, 2, 3),
+    Rectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.top.isNaN);
     Expect.isTrue(r.bottom.isNaN);
   }
@@ -258,14 +262,14 @@
 testNaNWidth() {
   var rectangles = [
     const Rectangle(0, 1, double.nan, 3),
-    new MutableRectangle(0, 1, double.nan, 3),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
+    MutableRectangle(0, 1, double.nan, 3),
+    Rectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.right.isNaN);
     Expect.isTrue(r.width.isNaN);
   }
@@ -274,14 +278,14 @@
 testNaNHeight() {
   var rectangles = [
     const Rectangle(0, 1, 2, double.nan),
-    new MutableRectangle(0, 1, 2, double.nan),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
+    MutableRectangle(0, 1, 2, double.nan),
+    Rectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.bottom.isNaN);
     Expect.isTrue(r.height.isNaN);
   }
diff --git a/tests/lib_2/math/rectangle_test.dart b/tests/lib_2/math/rectangle_test.dart
index 2681023..296cb41 100644
--- a/tests/lib_2/math/rectangle_test.dart
+++ b/tests/lib_2/math/rectangle_test.dart
@@ -24,20 +24,19 @@
   testNaNHeight();
 }
 
-Rectangle createRectangle(List<num> a) {
-  return a != null ? new Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
-}
+Rectangle createRectangle(List<num> a) =>
+    a != null ? Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
 
 testConstruction() {
-  var r0 = new Rectangle(10, 20, 30, 40);
+  var r0 = Rectangle(10, 20, 30, 40);
   Expect.equals('Rectangle (10, 20) 30 x 40', r0.toString());
   Expect.equals(40, r0.right);
   Expect.equals(60, r0.bottom);
 
-  var r1 = new Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
+  var r1 = Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
   Expect.equals(r0, r1);
 
-  var r2 = new Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
+  var r2 = Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
   Expect.equals(r0, r2);
 }
 
@@ -76,9 +75,9 @@
 }
 
 testIntersects() {
-  var r0 = new Rectangle(10, 10, 20, 20);
-  var r1 = new Rectangle(15, 15, 25, 25);
-  var r2 = new Rectangle(0, 0, 1, 1);
+  var r0 = Rectangle(10, 10, 20, 20);
+  var r1 = Rectangle(15, 15, 25, 25);
+  var r2 = Rectangle(0, 0, 1, 1);
 
   Expect.isTrue(r0.intersects(r1));
   Expect.isTrue(r1.intersects(r0));
@@ -122,65 +121,65 @@
 }
 
 testContainsRectangle() {
-  var r = new Rectangle(-10, 0, 20, 10);
+  var r = Rectangle(-10, 0, 20, 10);
   Expect.isTrue(r.containsRectangle(r));
 
   Expect.isFalse(r.containsRectangle(
-      new Rectangle(double.nan, double.nan, double.nan, double.nan)));
+      Rectangle(double.nan, double.nan, double.nan, double.nan)));
 
-  var r2 = new Rectangle(0, 2, 5, 5);
+  var r2 = Rectangle(0, 2, 5, 5);
   Expect.isTrue(r.containsRectangle(r2));
   Expect.isFalse(r2.containsRectangle(r));
 
-  r2 = new Rectangle(-11, 2, 5, 5);
+  r2 = Rectangle(-11, 2, 5, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 15, 5);
+  r2 = Rectangle(0, 2, 15, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 5, 10);
+  r2 = Rectangle(0, 2, 5, 10);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 0, 5, 10);
+  r2 = Rectangle(0, 0, 5, 10);
   Expect.isTrue(r.containsRectangle(r2));
 }
 
 testContainsPoint() {
-  var r = new Rectangle(20, 40, 60, 80);
+  var r = Rectangle(20, 40, 60, 80);
 
   // Test middle.
-  Expect.isTrue(r.containsPoint(new Point(50, 80)));
+  Expect.isTrue(r.containsPoint(Point(50, 80)));
 
   // Test edges.
-  Expect.isTrue(r.containsPoint(new Point(20, 40)));
-  Expect.isTrue(r.containsPoint(new Point(50, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 80)));
-  Expect.isTrue(r.containsPoint(new Point(80, 120)));
-  Expect.isTrue(r.containsPoint(new Point(50, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 80)));
+  Expect.isTrue(r.containsPoint(Point(20, 40)));
+  Expect.isTrue(r.containsPoint(Point(50, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 80)));
+  Expect.isTrue(r.containsPoint(Point(80, 120)));
+  Expect.isTrue(r.containsPoint(Point(50, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 80)));
 
   // Test outside.
-  Expect.isFalse(r.containsPoint(new Point(0, 0)));
-  Expect.isFalse(r.containsPoint(new Point(50, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 80)));
-  Expect.isFalse(r.containsPoint(new Point(100, 160)));
-  Expect.isFalse(r.containsPoint(new Point(50, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 80)));
+  Expect.isFalse(r.containsPoint(Point(0, 0)));
+  Expect.isFalse(r.containsPoint(Point(50, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 80)));
+  Expect.isFalse(r.containsPoint(Point(100, 160)));
+  Expect.isFalse(r.containsPoint(Point(50, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 80)));
 }
 
 testHashCode() {
-  var a = new Rectangle(0, 1, 2, 3);
-  var b = new Rectangle(0, 1, 2, 3);
+  var a = Rectangle(0, 1, 2, 3);
+  var b = Rectangle(0, 1, 2, 3);
   Expect.equals(b.hashCode, a.hashCode);
 
-  var c = new Rectangle(1, 0, 2, 3);
+  var c = Rectangle(1, 0, 2, 3);
   Expect.isFalse(a.hashCode == c.hashCode);
 }
 
 testEdgeCases() {
   edgeTest(double a, double l) {
-    var r = new Rectangle(a, a, l, l);
+    var r = Rectangle(a, a, l, l);
     Expect.equals(r, r.boundingBox(r));
     Expect.equals(r, r.intersection(r));
   }
@@ -198,8 +197,8 @@
 
 testEquality() {
   var bignum = 0x80000000000008 + 0.0;
-  var r1 = new Rectangle(bignum, bignum, 1.0, 1.0);
-  var r2 = new Rectangle(bignum, bignum, 2.0, 2.0);
+  var r1 = Rectangle(bignum, bignum, 1.0, 1.0);
+  var r2 = Rectangle(bignum, bignum, 2.0, 2.0);
   Expect.equals(r2, r1);
   Expect.equals(r2.hashCode, r1.hashCode);
   Expect.equals(r2.right, r1.right);
@@ -210,17 +209,22 @@
 
 testNegativeLengths() {
   // Constructor allows negative lengths, but clamps them to zero.
-  Expect.equals(new Rectangle(4, 4, 0, 0), new Rectangle(4, 4, -2, -2));
-  Expect.equals(new Rectangle(4, 4, 0, 0), new MutableRectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), Rectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), MutableRectangle(4, 4, -2, -2));
 
   // Setters clamp negative lengths to zero.
-  var mutable = new MutableRectangle(0, 0, 1, 1);
+  var mutable = MutableRectangle(0, 0, 1, 1);
   mutable.width = -1;
   mutable.height = -1;
-  Expect.equals(new Rectangle(0, 0, 0, 0), mutable);
+  Expect.equals(Rectangle(0, 0, 0, 0), mutable);
 
   // Test that doubles are clamped to double zero.
-  var rectangle = new Rectangle(1.5, 1.5, -2.5, -2.5);
+  var rectangle = Rectangle(1.5, 1.5, -2.5, -2.5);
+  Expect.isTrue(identical(rectangle.width, 0.0));
+  Expect.isTrue(identical(rectangle.height, 0.0));
+
+  var inf = double.infinity;
+  rectangle = Rectangle(1.5, 1.5, -inf, -inf);
   Expect.isTrue(identical(rectangle.width, 0.0));
   Expect.isTrue(identical(rectangle.height, 0.0));
 }
@@ -228,14 +232,14 @@
 testNaNLeft() {
   var rectangles = [
     const Rectangle(double.nan, 1, 2, 3),
-    new MutableRectangle(double.nan, 1, 2, 3),
-    new Rectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
+    MutableRectangle(double.nan, 1, 2, 3),
+    Rectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.left.isNaN);
     Expect.isTrue(r.right.isNaN);
   }
@@ -244,14 +248,14 @@
 testNaNTop() {
   var rectangles = [
     const Rectangle(0, double.nan, 2, 3),
-    new MutableRectangle(0, double.nan, 2, 3),
-    new Rectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
+    MutableRectangle(0, double.nan, 2, 3),
+    Rectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.top.isNaN);
     Expect.isTrue(r.bottom.isNaN);
   }
@@ -260,14 +264,14 @@
 testNaNWidth() {
   var rectangles = [
     const Rectangle(0, 1, double.nan, 3),
-    new MutableRectangle(0, 1, double.nan, 3),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
+    MutableRectangle(0, 1, double.nan, 3),
+    Rectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.right.isNaN);
     Expect.isTrue(r.width.isNaN);
   }
@@ -276,14 +280,14 @@
 testNaNHeight() {
   var rectangles = [
     const Rectangle(0, 1, 2, double.nan),
-    new MutableRectangle(0, 1, 2, double.nan),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
+    MutableRectangle(0, 1, 2, double.nan),
+    Rectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.bottom.isNaN);
     Expect.isTrue(r.height.isNaN);
   }
diff --git a/tools/VERSION b/tools/VERSION
index a9fccb7..45803c1d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 230
+PRERELEASE 231
 PRERELEASE_PATCH 0
\ No newline at end of file
