Version 2.14.0-380.0.dev
Merge commit '9491cafc2f6a1f914cf114ce66eeea67b7c2496e' 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 5bc55d2..840ea47 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -726,10 +726,10 @@
Instantiation result =
super.visitInstantiation(node, removalSentinel) as Instantiation;
Expression expression = result.expression;
- if (enableConstructorTearOff && expression is ConstantExpression) {
+ if (expression is ConstantExpression) {
if (result.typeArguments.every(isInstantiated)) {
return evaluateAndTransformWithContext(node, result);
- } else {
+ } else if (enableConstructorTearOff) {
Constant constant = expression.constant;
if (constant is TypedefTearOffConstant) {
Substitution substitution =
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 955feff..f60235a 100644
--- a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart
@@ -2,15 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @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;
@@ -20,10 +11,10 @@
main() {
expect(true, identical(implicitInstantiation, implicitInstantiation));
- expect(false, identical(implicitInstantiation, implicitConstInstantiation));
+ expect(true, identical(implicitInstantiation, implicitConstInstantiation));
expect(false, identical(implicitInstantiation, create<int>()));
- expect(false, identical(implicitConstInstantiation, implicitInstantiation));
+ expect(true, 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 90e26eb..42d4b37 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,4 +1,3 @@
-// @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 a0e9251..9a6b746 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,4 +1,3 @@
-// @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 db34700..1f6296f 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 = #C1<core::int>;
+static field (core::int) → core::int implicitInstantiation = #C2;
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(false, core::identical(self::implicitInstantiation, #C2));
+ self::expect(true, core::identical(self::implicitInstantiation, #C2));
self::expect(false, core::identical(self::implicitInstantiation, self::create<core::int>()));
- self::expect(false, core::identical(#C2, self::implicitInstantiation));
+ self::expect(true, 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 9e4506e..bf07e2b 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:17:54 -> InstantiationConstant(id<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:8: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 acbe826..6aa6e81 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 = #C1<core::int>;
+static field (core::int) → core::int implicitInstantiation = #C2;
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(false, core::identical(self::implicitInstantiation, #C2));
+ self::expect(true, core::identical(self::implicitInstantiation, #C2));
self::expect(false, core::identical(self::implicitInstantiation, self::create<core::int>()));
- self::expect(false, core::identical(#C2, self::implicitInstantiation));
+ self::expect(true, core::identical(#C2, self::implicitInstantiation));
self::expect(true, core::identical(#C2, #C2));
self::expect(false, core::identical(#C2, self::create<core::int>()));
}
@@ -27,6 +27,5 @@
}
Extra constant evaluation status:
-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
+Evaluated: StaticInvocation @ org-dartlang-testcase:///identical_instantiated_function_tearoffs.dart:19:13 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 29, effectively constant: 1
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 759489c..1474987 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(#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::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::takeIDI(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 (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
+ ^" in (#C4) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(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 (#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*);
+ ^" 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*);
self::takeIDI(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 (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
+ ^" in (#C9) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(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 (#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*);
+ ^" 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*);
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,5 +177,13 @@
constants {
#C1 = static-tearoff math::max
- #C2 = static-tearoff math::min
+ #C2 = instantiation math::max <core::int*>
+ #C3 = instantiation math::max <core::double*>
+ #C4 = instantiation math::max <core::num*>
+ #C5 = instantiation math::max <core::Object*>
+ #C6 = static-tearoff math::min
+ #C7 = instantiation math::min <core::int*>
+ #C8 = instantiation math::min <core::double*>
+ #C9 = instantiation math::min <core::num*>
+ #C10 = instantiation math::min <core::Object*>
}
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 dbd1d673..1474987 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(#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::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::takeIDI(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 (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
+ ^" in (#C4) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(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 (#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*);
+ ^" 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*);
self::takeIDI(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 (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
+ ^" in (#C9) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(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 (#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*);
+ ^" 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*);
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,32 +177,13 @@
constants {
#C1 = static-tearoff math::max
- #C2 = static-tearoff math::min
+ #C2 = instantiation math::max <core::int*>
+ #C3 = instantiation math::max <core::double*>
+ #C4 = instantiation math::max <core::num*>
+ #C5 = instantiation math::max <core::Object*>
+ #C6 = static-tearoff math::min
+ #C7 = instantiation math::min <core::int*>
+ #C8 = instantiation math::min <core::double*>
+ #C9 = instantiation math::min <core::num*>
+ #C10 = instantiation math::min <core::Object*>
}
-
-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: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: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: 111, effectively constant: 24
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 3d04d1f..5a16fe2 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,10 +39,11 @@
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, #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*};
+ 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*};
}
constants {
#C1 = static-tearoff math::max
+ #C2 = 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 b46e8a6..39218a6 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,15 +39,11 @@
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, #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*};
+ 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*};
}
constants {
#C1 = static-tearoff math::max
+ #C2 = 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 5d83e0a..ba2952c 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.expect
@@ -36,14 +36,16 @@
function h<T extends core::Object* = dynamic>(T* x) → T*
return x;
(core::int*) →* core::int* func;
- func = #C1<core::int*>;
+ func = #C2;
func = new self::C::•().{self::C::f}{<T extends core::Object* = dynamic>(T*) →* T*}<core::int*>;
- func = #C2<core::int*>;
+ func = #C4;
func = h<core::int*>;
}
static method main() → dynamic {}
constants {
#C1 = static-tearoff self::f
- #C2 = static-tearoff self::C::g
+ #C2 = instantiation self::f <core::int*>
+ #C3 = static-tearoff self::C::g
+ #C4 = instantiation self::C::g <core::int*>
}
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 87decf1..ba2952c 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,19 +36,16 @@
function h<T extends core::Object* = dynamic>(T* x) → T*
return x;
(core::int*) →* core::int* func;
- func = #C1<core::int*>;
+ func = #C2;
func = new self::C::•().{self::C::f}{<T extends core::Object* = dynamic>(T*) →* T*}<core::int*>;
- func = #C2<core::int*>;
+ func = #C4;
func = h<core::int*>;
}
static method main() → dynamic {}
constants {
#C1 = static-tearoff self::f
- #C2 = static-tearoff self::C::g
+ #C2 = instantiation self::f <core::int*>
+ #C3 = static-tearoff self::C::g
+ #C4 = instantiation self::C::g <core::int*>
}
-
-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 81da4f2..66fe67c 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
@@ -10,9 +10,10 @@
}
static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
static method main() → dynamic {
- (self::X?) → dynamic t2 = #C1<self::X>;
+ (self::X?) → dynamic t2 = #C2;
}
constants {
#C1 = static-tearoff self::checkme
+ #C2 = 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 d4ca87d..66fe67c 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -10,13 +10,10 @@
}
static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
static method main() → dynamic {
- (self::X?) → dynamic t2 = #C1<self::X>;
+ (self::X?) → dynamic t2 = #C2;
}
constants {
#C1 = static-tearoff self::checkme
+ #C2 = 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 81da4f2..17ca8c8 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
@@ -10,9 +10,10 @@
}
static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
static method main() → dynamic {
- (self::X?) → dynamic t2 = #C1<self::X>;
+ (self::X?) → dynamic t2 = #C2;
}
constants {
#C1 = static-tearoff self::checkme
+ #C2 = 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 005edee..17ca8c8 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -10,13 +10,10 @@
}
static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
static method main() → dynamic {
- (self::X?) → dynamic t2 = #C1<self::X>;
+ (self::X?) → dynamic t2 = #C2;
}
constants {
#C1 = static-tearoff self::checkme
+ #C2 = 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/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 54768af..584fe42 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -357,11 +357,29 @@
})
class UseResult {
/// A human-readable explanation of the reason why the value returned by
- /// accessing this member should be checked.
+ /// accessing this member should be used.
final String reason;
+ /// Names a parameter of a method or function that, when present, signals that
+ /// the annotated member's value is used by that method or function and does
+ /// not need to be further checked.
+ final String? parameterDefined;
+
/// Initialize a newly created instance to have the given [reason].
- const UseResult([this.reason = '']);
+ const UseResult([this.reason = '']) : parameterDefined = null;
+
+ /// Initialize a newly created instance to annotate a function or method that
+ /// identifies a parameter [parameterDefined] that when present signals that
+ /// the result is used by the annotated member and does not need to be further
+ /// checked. For values that need to be used unconditionally, use the unnamed
+ /// `UseResult` constructor, or if no reason is specified, the [useResult]
+ /// constant.
+ ///
+ /// Tools, such as the analyzer, can provide feedback if
+ ///
+ /// * a parameter named by [parameterDefined] is not declared by the annotated
+ /// method or function.
+ const UseResult.unless({required this.parameterDefined, this.reason = ''});
}
class _AlwaysThrows {
diff --git a/tests/language/constructor/tear_off_test.dart b/tests/language/constructor/tear_off_test.dart
index a0764886..f70127d 100644
--- a/tests/language/constructor/tear_off_test.dart
+++ b/tests/language/constructor/tear_off_test.dart
@@ -196,21 +196,21 @@
testImplicit<GFacRedir<int> Function(int)>(GFacRedir.named, GFacRedir.named);
// Using a type variable, not a constant type expression.
- // Results are not canonicalized and not equal.
+ // Canonicalization is unspecified, but equality holds.
(<T>() {
// Tear off with explicit instantation to the same non-constant type.
- Expect.notEquals(GGen<T>.new, GGen<T>.new);
- Expect.notEquals(GGen<T>.named, GGen<T>.named);
- Expect.notEquals(GGenRedir<T>.new, GGenRedir<T>.new);
- Expect.notEquals(GGenRedir<T>.named, GGenRedir<T>.named);
- Expect.notEquals(GFac<T>.new, GFac<T>.new);
- Expect.notEquals(GFac<T>.named, GFac<T>.named);
- Expect.notEquals(GFacRedir<T>.new, GFacRedir<T>.new);
- Expect.notEquals(GFacRedir<T>.named, GFacRedir<T>.named);
+ Expect.equals(GGen<T>.new, GGen<T>.new);
+ Expect.equals(GGen<T>.named, GGen<T>.named);
+ Expect.equals(GGenRedir<T>.new, GGenRedir<T>.new);
+ Expect.equals(GGenRedir<T>.named, GGenRedir<T>.named);
+ Expect.equals(GFac<T>.new, GFac<T>.new);
+ Expect.equals(GFac<T>.named, GFac<T>.named);
+ Expect.equals(GFacRedir<T>.new, GFacRedir<T>.new);
+ Expect.equals(GFacRedir<T>.named, GFacRedir<T>.named);
// Tear off with implicit instantiation to the same non-constant type.
void testImplicit2<T>(T f1, T f2) {
- Expect.notEquals(f1, f2);
+ Expect.equals(f1, f2);
}
testImplicit2<GGen<T> Function(int)>(GGen.new, GGen.new);
diff --git a/tests/language/typedef/aliased_constructor_tear_off_test.dart b/tests/language/typedef/aliased_constructor_tear_off_test.dart
index 7d51dfb..9adb357 100644
--- a/tests/language/typedef/aliased_constructor_tear_off_test.dart
+++ b/tests/language/typedef/aliased_constructor_tear_off_test.dart
@@ -209,23 +209,23 @@
);
(<T extends num>() {
- // Non-constant type instantiation prevents canonicalization and equality.
- // Also not constant.
- Expect.notEquals(Direct<T>.new, Direct<T>.new);
- Expect.notEquals(Direct<T>.named, Direct<T>.named);
- Expect.notEquals(Bounded<T>.new, Bounded<T>.new);
- Expect.notEquals(Bounded<T>.named, Bounded<T>.named);
- Expect.notEquals(Wrapping<T>.new, Wrapping<T>.new);
- Expect.notEquals(Wrapping<T>.named, Wrapping<T>.named);
- Expect.notEquals(Extra<T, String>.new, Extra<T, String>.new);
- Expect.notEquals(Extra<T, String>.named, Extra<T, String>.named);
+ // Non-constant type instantiation implies non-constant expressions.
+ // Canonicalization is unspecified, but equality holds.
+ Expect.equals(Direct<T>.new, Direct<T>.new);
+ Expect.equals(Direct<T>.named, Direct<T>.named);
+ Expect.equals(Bounded<T>.new, Bounded<T>.new);
+ Expect.equals(Bounded<T>.named, Bounded<T>.named);
+ Expect.equals(Wrapping<T>.new, Wrapping<T>.new);
+ Expect.equals(Wrapping<T>.named, Wrapping<T>.named);
+ Expect.equals(Extra<T, String>.new, Extra<T, String>.new);
+ Expect.equals(Extra<T, String>.named, Extra<T, String>.named);
// Also if the non-constant type doesn't occur in the expansion.
- Expect.notEquals(Extra<int, T>.new, Extra<int, T>.new);
- Expect.notEquals(Extra<int, T>.named, Extra<int, T>.named);
+ Expect.equals(Extra<int, T>.new, Extra<int, T>.new);
+ Expect.equals(Extra<int, T>.named, Extra<int, T>.named);
- Expect.notEquals(Swapped<T, int>.new, Swapped<T, int>.new);
- Expect.notEquals(Swapped<T, int>.named, Swapped<T, int>.named);
- Expect.notEquals(Swapped<int, T>.new, Swapped<int, T>.new);
- Expect.notEquals(Swapped<int, T>.named, Swapped<int, T>.named);
+ Expect.equals(Swapped<T, int>.new, Swapped<T, int>.new);
+ Expect.equals(Swapped<T, int>.named, Swapped<T, int>.named);
+ Expect.equals(Swapped<int, T>.new, Swapped<int, T>.new);
+ Expect.equals(Swapped<int, T>.named, Swapped<int, T>.named);
}<int>());
}
diff --git a/tools/VERSION b/tools/VERSION
index c6aab7e..b40e8cf 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 379
+PRERELEASE 380
PRERELEASE_PATCH 0
\ No newline at end of file