Version 2.14.0-276.0.dev

Merge commit 'e94ae6cbf33fa695ec6feff2f6f2892736fec557' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 4985f7d..fa2b398 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -712,7 +712,8 @@
   TreeNode visitInstantiation(Instantiation node, TreeNode? removalSentinel) {
     Instantiation result =
         super.visitInstantiation(node, removalSentinel) as Instantiation;
-    if (result.expression is ConstantExpression &&
+    if (enableConstructorTearOff &&
+        result.expression is ConstantExpression &&
         result.typeArguments.every(isInstantiated)) {
       return evaluateAndTransformWithContext(node, result);
     }
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart
index f60235a..955feff 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart
@@ -2,6 +2,15 @@
 // 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.13
+
+// This test is similar to
+//
+//   constructor_tearoffs/identical_instantiated_function_tearoffs.dart
+//
+// but verifies that before the constructor-tearoffs experiment was enabled,
+// instantiations in non-constant context were not canonicalized.
+
 T id<T>(T t) => t;
 
 int Function(int) implicitInstantiation = id;
@@ -11,10 +20,10 @@
 
 main() {
   expect(true, identical(implicitInstantiation, implicitInstantiation));
-  expect(true, identical(implicitInstantiation, implicitConstInstantiation));
+  expect(false, identical(implicitInstantiation, implicitConstInstantiation));
   expect(false, identical(implicitInstantiation, create<int>()));
 
-  expect(true, identical(implicitConstInstantiation, implicitInstantiation));
+  expect(false, identical(implicitConstInstantiation, implicitInstantiation));
   expect(
       true, identical(implicitConstInstantiation, implicitConstInstantiation));
   expect(false, identical(implicitConstInstantiation, create<int>()));
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline.expect
index 42d4b37..90e26eb 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline.expect
@@ -1,3 +1,4 @@
+// @dart = 2.13
 T id<T>(T t) => t;
 int Function(int) implicitInstantiation = id;
 const int Function(int) implicitConstInstantiation = id;
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline_modelled.expect
index 9a6b746..a0e9251 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.textual_outline_modelled.expect
@@ -1,3 +1,4 @@
+// @dart = 2.13
 T Function(T) create<T>() => id;
 T id<T>(T t) => t;
 const int Function(int) implicitConstInstantiation = id;
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect
index 2190c5f..daf6f36 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field (core::int) → core::int implicitInstantiation = #C2;
+static field (core::int) → core::int implicitInstantiation = #C1<core::int>;
 static const field (core::int) → core::int implicitConstInstantiation = #C2;
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   return t;
@@ -10,9 +10,9 @@
   return #C1<self::create::T%>;
 static method main() → dynamic {
   self::expect(true, core::identical(self::implicitInstantiation, self::implicitInstantiation));
-  self::expect(true, core::identical(self::implicitInstantiation, #C2));
+  self::expect(false, core::identical(self::implicitInstantiation, #C2));
   self::expect(false, core::identical(self::implicitInstantiation, self::create<core::int>()));
-  self::expect(true, core::identical(#C2, self::implicitInstantiation));
+  self::expect(false, core::identical(#C2, self::implicitInstantiation));
   self::expect(true, core::identical(#C2, #C2));
   self::expect(false, core::identical(#C2, self::create<core::int>()));
 }
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.outline.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.outline.expect
index bf07e2b..9e4506e 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.outline.expect
@@ -15,5 +15,5 @@
 
 
 Extra constant evaluation status:
-Evaluated: Instantiation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:8:54 -> InstantiationConstant(id<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:17:54 -> InstantiationConstant(id<int*>)
 Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
index 00ad1f6..e0f574c 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field (core::int) → core::int implicitInstantiation = #C2;
+static field (core::int) → core::int implicitInstantiation = #C1<core::int>;
 static const field (core::int) → core::int implicitConstInstantiation = #C2;
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   return t;
@@ -10,9 +10,9 @@
   return #C1<self::create::T%>;
 static method main() → dynamic {
   self::expect(true, core::identical(self::implicitInstantiation, self::implicitInstantiation));
-  self::expect(true, core::identical(self::implicitInstantiation, #C2));
+  self::expect(false, core::identical(self::implicitInstantiation, #C2));
   self::expect(false, core::identical(self::implicitInstantiation, self::create<core::int>()));
-  self::expect(true, core::identical(#C2, self::implicitInstantiation));
+  self::expect(false, core::identical(#C2, self::implicitInstantiation));
   self::expect(true, core::identical(#C2, #C2));
   self::expect(false, core::identical(#C2, self::create<core::int>()));
 }
@@ -27,5 +27,6 @@
 }
 
 Extra constant evaluation status:
-Evaluated: StaticInvocation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:19:13 -> BoolConstant(true)
-Extra constant evaluation: evaluated: 29, effectively constant: 1
+Evaluated: StaticInvocation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:28:13 -> BoolConstant(true)
+Evaluated: Instantiation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:16:43 -> InstantiationConstant(id<int*>)
+Extra constant evaluation: evaluated: 30, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
index 4c414f6..2c7b116 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
@@ -104,42 +104,42 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic {
-  self::takeIII(#C2);
-  self::takeDDD(#C3);
-  self::takeNNN(#C4);
-  self::takeIDN(#C4);
-  self::takeDIN(#C4);
-  self::takeIIN(#C2);
-  self::takeDDN(#C3);
-  self::takeIIO(#C2);
-  self::takeDDO(#C3);
-  self::takeOOI((#C5) as{TypeError} (core::Object*, core::Object*) →* core::int*);
+  self::takeIII(#C1<core::int*>);
+  self::takeDDD(#C1<core::double*>);
+  self::takeNNN(#C1<core::num*>);
+  self::takeIDN(#C1<core::num*>);
+  self::takeDIN(#C1<core::num*>);
+  self::takeIIN(#C1<core::int*>);
+  self::takeDDN(#C1<core::double*>);
+  self::takeIIO(#C1<core::int*>);
+  self::takeDDO(#C1<core::double*>);
+  self::takeOOI((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final Never* #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (#C4) as{TypeError} (core::double*, core::int*) →* core::int*);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final Never* #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (#C4) as{TypeError} (core::int*, core::double*) →* core::double*);
-  self::takeOON((#C5) as{TypeError} (core::Object*, core::Object*) →* core::num*);
-  self::takeOOO((#C5) as{TypeError} (core::Object*, core::Object*) →* core::num*);
-  self::takeIII(#C7);
-  self::takeDDD(#C8);
-  self::takeNNN(#C9);
-  self::takeIDN(#C9);
-  self::takeDIN(#C9);
-  self::takeIIN(#C7);
-  self::takeDDN(#C8);
-  self::takeIIO(#C7);
-  self::takeDDO(#C8);
-  self::takeOOI((#C10) as{TypeError} (core::Object*, core::Object*) →* core::int*);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(#C2<core::int*>);
+  self::takeDDD(#C2<core::double*>);
+  self::takeNNN(#C2<core::num*>);
+  self::takeIDN(#C2<core::num*>);
+  self::takeDIN(#C2<core::num*>);
+  self::takeIIN(#C2<core::int*>);
+  self::takeDDN(#C2<core::double*>);
+  self::takeIIO(#C2<core::int*>);
+  self::takeDDO(#C2<core::double*>);
+  self::takeOOI((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final Never* #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (#C9) as{TypeError} (core::double*, core::int*) →* core::int*);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final Never* #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (#C9) as{TypeError} (core::int*, core::double*) →* core::double*);
-  self::takeOON((#C10) as{TypeError} (core::Object*, core::Object*) →* core::num*);
-  self::takeOOO((#C10) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
   self::takeIII(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::int*>);
   self::takeDDD(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::double*>);
   self::takeNNN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>);
@@ -177,13 +177,5 @@
 
 constants  {
   #C1 = tearoff math::max
-  #C2 = partial-instantiation math::max <core::int*>
-  #C3 = partial-instantiation math::max <core::double*>
-  #C4 = partial-instantiation math::max <core::num*>
-  #C5 = partial-instantiation math::max <core::Object*>
-  #C6 = tearoff math::min
-  #C7 = partial-instantiation math::min <core::int*>
-  #C8 = partial-instantiation math::min <core::double*>
-  #C9 = partial-instantiation math::min <core::num*>
-  #C10 = partial-instantiation math::min <core::Object*>
+  #C2 = tearoff math::min
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
index 4c414f6..9dc6b9b 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
@@ -104,42 +104,42 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic {
-  self::takeIII(#C2);
-  self::takeDDD(#C3);
-  self::takeNNN(#C4);
-  self::takeIDN(#C4);
-  self::takeDIN(#C4);
-  self::takeIIN(#C2);
-  self::takeDDN(#C3);
-  self::takeIIO(#C2);
-  self::takeDDO(#C3);
-  self::takeOOI((#C5) as{TypeError} (core::Object*, core::Object*) →* core::int*);
+  self::takeIII(#C1<core::int*>);
+  self::takeDDD(#C1<core::double*>);
+  self::takeNNN(#C1<core::num*>);
+  self::takeIDN(#C1<core::num*>);
+  self::takeDIN(#C1<core::num*>);
+  self::takeIIN(#C1<core::int*>);
+  self::takeDDN(#C1<core::double*>);
+  self::takeIIO(#C1<core::int*>);
+  self::takeDDO(#C1<core::double*>);
+  self::takeOOI((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final Never* #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (#C4) as{TypeError} (core::double*, core::int*) →* core::int*);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final Never* #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (#C4) as{TypeError} (core::int*, core::double*) →* core::double*);
-  self::takeOON((#C5) as{TypeError} (core::Object*, core::Object*) →* core::num*);
-  self::takeOOO((#C5) as{TypeError} (core::Object*, core::Object*) →* core::num*);
-  self::takeIII(#C7);
-  self::takeDDD(#C8);
-  self::takeNNN(#C9);
-  self::takeIDN(#C9);
-  self::takeDIN(#C9);
-  self::takeIIN(#C7);
-  self::takeDDN(#C8);
-  self::takeIIO(#C7);
-  self::takeDDO(#C8);
-  self::takeOOI((#C10) as{TypeError} (core::Object*, core::Object*) →* core::int*);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(#C2<core::int*>);
+  self::takeDDD(#C2<core::double*>);
+  self::takeNNN(#C2<core::num*>);
+  self::takeIDN(#C2<core::num*>);
+  self::takeDIN(#C2<core::num*>);
+  self::takeIIN(#C2<core::int*>);
+  self::takeDDN(#C2<core::double*>);
+  self::takeIIO(#C2<core::int*>);
+  self::takeDDO(#C2<core::double*>);
+  self::takeOOI((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final Never* #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (#C9) as{TypeError} (core::double*, core::int*) →* core::int*);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final Never* #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (#C9) as{TypeError} (core::int*, core::double*) →* core::double*);
-  self::takeOON((#C10) as{TypeError} (core::Object*, core::Object*) →* core::num*);
-  self::takeOOO((#C10) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
   self::takeIII(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::int*>);
   self::takeDDD(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::double*>);
   self::takeNNN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>);
@@ -177,13 +177,36 @@
 
 constants  {
   #C1 = tearoff math::max
-  #C2 = partial-instantiation math::max <core::int*>
-  #C3 = partial-instantiation math::max <core::double*>
-  #C4 = partial-instantiation math::max <core::num*>
-  #C5 = partial-instantiation math::max <core::Object*>
-  #C6 = tearoff math::min
-  #C7 = partial-instantiation math::min <core::int*>
-  #C8 = partial-instantiation math::min <core::double*>
-  #C9 = partial-instantiation math::min <core::num*>
-  #C10 = partial-instantiation math::min <core::Object*>
+  #C2 = tearoff math::min
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:16:16 -> InstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:17:16 -> InstantiationConstant(max<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:18:16 -> InstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:19:16 -> InstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:20:16 -> InstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:21:16 -> InstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:22:16 -> InstantiationConstant(max<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:23:16 -> InstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:24:16 -> InstantiationConstant(max<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:26:70 -> InstantiationConstant(max<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:28:73 -> InstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:30:73 -> InstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:31:70 -> InstantiationConstant(max<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:32:70 -> InstantiationConstant(max<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:35:11 -> InstantiationConstant(min<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:36:11 -> InstantiationConstant(min<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:37:11 -> InstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:38:11 -> InstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:39:11 -> InstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:40:11 -> InstantiationConstant(min<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:41:11 -> InstantiationConstant(min<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:42:11 -> InstantiationConstant(min<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:43:11 -> InstantiationConstant(min<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:45:65 -> InstantiationConstant(min<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:46:72 -> InstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:47:72 -> InstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:48:65 -> InstantiationConstant(min<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:49:65 -> InstantiationConstant(min<Object*>)
+Extra constant evaluation: evaluated: 133, effectively constant: 28
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect
index a4f335a..34108a8 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.expect
@@ -39,11 +39,10 @@
 static method main() → dynamic {
   core::List<self::Trace*>* traces = <self::Trace*>[];
   core::int* longest = traces.{core::Iterable::map}<core::int*>((self::Trace* trace) → core::int* {
-    return trace.{self::Trace::frames}{core::List<self::Frame*>*}.{core::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}{core::String*}.{core::String::length}{core::int*}){((self::Frame*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C2){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
-  }){((self::Trace*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C2){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+    return trace.{self::Trace::frames}{core::List<self::Frame*>*}.{core::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}{core::String*}.{core::String::length}{core::int*}){((self::Frame*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C1<core::int*>){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+  }){((self::Trace*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C1<core::int*>){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
 }
 
 constants  {
   #C1 = tearoff math::max
-  #C2 = partial-instantiation math::max <core::int*>
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect
index 712cd8d..8af73b0 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.transformed.expect
@@ -39,11 +39,15 @@
 static method main() → dynamic {
   core::List<self::Trace*>* traces = core::_GrowableList::•<self::Trace*>(0);
   core::int* longest = traces.{core::Iterable::map}<core::int*>((self::Trace* trace) → core::int* {
-    return trace.{self::Trace::frames}{core::List<self::Frame*>*}.{core::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}{core::String*}.{core::String::length}{core::int*}){((self::Frame*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C2){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
-  }){((self::Trace*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C2){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+    return trace.{self::Trace::frames}{core::List<self::Frame*>*}.{core::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}{core::String*}.{core::String::length}{core::int*}){((self::Frame*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C1<core::int*>){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+  }){((self::Trace*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C1<core::int*>){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
 }
 
 constants  {
   #C1 = tearoff math::max
-  #C2 = partial-instantiation math::max <core::int*>
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_nested_generic_instantiation.dart:28:71 -> InstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_nested_generic_instantiation.dart:29:67 -> InstantiationConstant(max<int*>)
+Extra constant evaluation: evaluated: 16, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
index 060082e..41e2e41 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
@@ -36,16 +36,14 @@
   function h<T extends core::Object* = dynamic>(T* x) → T*
     return x;
   (core::int*) →* core::int* func;
-  func = #C2;
+  func = #C1<core::int*>;
   func = new self::C::•().{self::C::f}{<T extends core::Object* = dynamic>(T*) →* T*}<core::int*>;
-  func = #C4;
+  func = #C2<core::int*>;
   func = h<core::int*>;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = tearoff self::f
-  #C2 = partial-instantiation self::f <core::int*>
-  #C3 = tearoff self::C::g
-  #C4 = partial-instantiation self::C::g <core::int*>
+  #C2 = tearoff self::C::g
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect
index 060082e..4c5080b 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.transformed.expect
@@ -36,16 +36,19 @@
   function h<T extends core::Object* = dynamic>(T* x) → T*
     return x;
   (core::int*) →* core::int* func;
-  func = #C2;
+  func = #C1<core::int*>;
   func = new self::C::•().{self::C::f}{<T extends core::Object* = dynamic>(T*) →* T*}<core::int*>;
-  func = #C4;
+  func = #C2<core::int*>;
   func = h<core::int*>;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = tearoff self::f
-  #C2 = partial-instantiation self::f <core::int*>
-  #C3 = tearoff self::C::g
-  #C4 = partial-instantiation self::C::g <core::int*>
+  #C2 = tearoff self::C::g
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///instantiate_tearoff.dart:25:10 -> InstantiationConstant(f<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///instantiate_tearoff.dart:27:12 -> InstantiationConstant(C.g<int*>)
+Extra constant evaluation: evaluated: 18, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
index ca3b3bf..2d7f2f7 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
@@ -10,10 +10,9 @@
 }
 static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
-  (self::X?) → dynamic t2 = #C2;
+  (self::X?) → dynamic t2 = #C1<self::X>;
 }
 
 constants  {
   #C1 = tearoff self::checkme
-  #C2 = partial-instantiation self::checkme <self::X>
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
index ca3b3bf..62a035b 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -10,10 +10,13 @@
 }
 static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
-  (self::X?) → dynamic t2 = #C2;
+  (self::X?) → dynamic t2 = #C1<self::X>;
 }
 
 constants  {
   #C1 = tearoff self::checkme
-  #C2 = partial-instantiation self::checkme <self::X>
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> InstantiationConstant(checkme<X>)
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
index d2dd558..2d7f2f7 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
@@ -10,10 +10,9 @@
 }
 static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
-  (self::X?) → dynamic t2 = #C2;
+  (self::X?) → dynamic t2 = #C1<self::X>;
 }
 
 constants  {
   #C1 = tearoff self::checkme
-  #C2 = partial-instantiation self::checkme <self::X*>
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
index d2dd558..0fd30a8 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -10,10 +10,13 @@
 }
 static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
-  (self::X?) → dynamic t2 = #C2;
+  (self::X?) → dynamic t2 = #C1<self::X>;
 }
 
 constants  {
   #C1 = tearoff self::checkme
-  #C2 = partial-instantiation self::checkme <self::X*>
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> InstantiationConstant(checkme<X*>)
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/tools/VERSION b/tools/VERSION
index b35aa89..a619ee9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 275
+PRERELEASE 276
 PRERELEASE_PATCH 0
\ No newline at end of file