From 0f11c4ed5a72cad77f90dcaa1e90c5e5f5f474fb Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Thu, 9 Feb 2023 18:41:01 +0000 Subject: [PATCH] front_end: make use of `TypeAnalyzer.analyzeConstantPattern`. This will allow the front end to take advantage of flow analysis implied by a constant pattern (e.g. `case null` cause the scrutinee to be promoted in later cases). Fixes #51206. Change-Id: Ic8516abb4e051ffca0d4e7698339282812020cae Bug: https://github.com/dart-lang/sdk/issues/51206 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/281261 Commit-Queue: Paul Berry Reviewed-by: Johnni Winther Reviewed-by: Chloe Stefantsova --- .../lib/src/type_inference/type_analyzer.dart | 15 +++++++++------ .../type_inference/inference_visitor.dart | 4 ++-- .../pattern_assignment_final.dart | 2 +- ...pattern_assignment_final.dart.strong.expect | 3 +-- ...gnment_final.dart.strong.transformed.expect | 3 +-- .../pattern_assignment_final.dart.weak.expect | 3 +-- ...n_assignment_final.dart.weak.modular.expect | 3 +-- ...signment_final.dart.weak.transformed.expect | 3 +-- .../nnbd/return_null.dart.strong.expect | 18 ++++++++++++++++++ .../return_null.dart.strong.transformed.expect | 18 ++++++++++++++++++ .../nnbd/return_null.dart.weak.expect | 18 ++++++++++++++++++ .../nnbd/return_null.dart.weak.modular.expect | 18 ++++++++++++++++++ .../return_null.dart.weak.transformed.expect | 18 ++++++++++++++++++ .../cast_inside_if_case.dart.strong.expect | 2 +- ...side_if_case.dart.strong.transformed.expect | 2 +- .../cast_inside_if_case.dart.weak.expect | 2 +- ...ast_inside_if_case.dart.weak.modular.expect | 2 +- ...inside_if_case.dart.weak.transformed.expect | 2 +- .../patterns/const_patterns.dart.strong.expect | 2 +- ...nst_patterns.dart.strong.transformed.expect | 2 +- .../patterns/const_patterns.dart.weak.expect | 2 +- .../const_patterns.dart.weak.modular.expect | 2 +- ...const_patterns.dart.weak.transformed.expect | 2 +- ...tern_assignment_declares.dart.strong.expect | 11 +++++++++-- ...ent_declares.dart.strong.transformed.expect | 11 +++++++++-- ...attern_assignment_declares.dart.weak.expect | 11 +++++++++-- ...ssignment_declares.dart.weak.modular.expect | 11 +++++++++-- ...nment_declares.dart.weak.transformed.expect | 11 +++++++++-- .../patterns/pattern_assignment_final.dart | 2 +- ...pattern_assignment_final.dart.strong.expect | 3 +-- ...gnment_final.dart.strong.transformed.expect | 3 +-- .../pattern_assignment_final.dart.weak.expect | 3 +-- ...n_assignment_final.dart.weak.modular.expect | 3 +-- ...signment_final.dart.weak.transformed.expect | 3 +-- .../malformed_function.dart.strong.expect | 13 ++++++++++++- ...med_function.dart.strong.transformed.expect | 13 ++++++++++++- .../rasta/malformed_function.dart.weak.expect | 13 ++++++++++++- ...malformed_function.dart.weak.modular.expect | 13 ++++++++++++- ...ormed_function.dart.weak.transformed.expect | 13 ++++++++++++- .../regress/issue_39040.dart.strong.expect | 4 ++-- .../issue_39040.dart.strong.transformed.expect | 4 ++-- .../regress/issue_39040.dart.weak.expect | 13 ++++++------- .../issue_39040.dart.weak.modular.expect | 13 ++++++------- .../issue_39040.dart.weak.transformed.expect | 13 ++++++------- pkg/front_end/testcases/strong.status | 1 + pkg/front_end/testcases/weak.status | 2 +- 46 files changed, 252 insertions(+), 81 deletions(-) diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart index acace373859..f2195ab8041 100644 --- a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart +++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart @@ -369,8 +369,10 @@ mixin TypeAnalyzer< /// /// See [dispatchPattern] for the meaning of [context]. /// + /// Returns the static type of [expression]. + /// /// Stack effect: pushes (Expression). - void analyzeConstantPattern( + Type analyzeConstantPattern( MatchContext context, Node node, Expression expression) { @@ -382,8 +384,8 @@ mixin TypeAnalyzer< errors?.refutablePatternInIrrefutableContext(node, irrefutableContext); } Type matchedType = flow.getMatchedValueType(); - Type staticType = analyzeExpression(expression, matchedType); - flow.constantPattern_end(expression, staticType, + Type expressionType = analyzeExpression(expression, matchedType); + flow.constantPattern_end(expression, expressionType, patternsEnabled: options.patternsEnabled); // Stack: (Expression) if (errors != null && !options.patternsEnabled) { @@ -391,18 +393,19 @@ mixin TypeAnalyzer< if (switchScrutinee != null) { bool nullSafetyEnabled = options.nullSafetyEnabled; bool matches = nullSafetyEnabled - ? operations.isSubtypeOf(staticType, matchedType) - : operations.isAssignableTo(staticType, matchedType); + ? operations.isSubtypeOf(expressionType, matchedType) + : operations.isAssignableTo(expressionType, matchedType); if (!matches) { errors.caseExpressionTypeMismatch( caseExpression: expression, scrutinee: switchScrutinee, - caseExpressionType: staticType, + caseExpressionType: expressionType, scrutineeType: matchedType, nullSafetyEnabled: nullSafetyEnabled); } } } + return expressionType; } /// Computes the type schema for a constant pattern. diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart index 485401bc517..0bb9b89920f 100644 --- a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart +++ b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart @@ -9523,8 +9523,8 @@ class InferenceVisitorImpl extends InferenceVisitorBase int? stackBase; assert(checkStackBase(node, stackBase = stackHeight)); - DartType matchedType = flow.getMatchedValueType(); - node.expressionType = analyzeExpression(node.expression, matchedType); + node.expressionType = + analyzeConstantPattern(context, node, node.expression); assert(checkStack(node, stackBase, [ /* expression = */ ValueKinds.Expression, diff --git a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart index 37121b3dc55..3e2ffb17815 100644 --- a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart +++ b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart @@ -35,5 +35,5 @@ method(x, y, z) { definitelyAssignedFinal] = y; // Error Class(field1: definitelyAssignedLateFinal, // Error field2: [[notDefinitelyAssignedFinal, _], // Error - [1, notDefinitelyAssignedLateFinal]]) = z; // Ok + [_, notDefinitelyAssignedLateFinal]]) = z; // Ok } diff --git a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.expect b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.expect index 54d82c13e2f..3b136090217 100644 --- a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.expect +++ b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.expect @@ -108,12 +108,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#3#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t12 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t13 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t14 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t13 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t14 = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t15 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.transformed.expect index 6d10ff3ac2f..25f53c7ca31 100644 --- a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.strong.transformed.expect @@ -108,14 +108,13 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#3#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t12 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t13 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} && (let final core::int? #t14 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t13 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t14 = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in true) && (let final core::int? #t15 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } Extra constant evaluation status: diff --git a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.expect b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.expect index 00f2f8996ab..7616b4f8d24 100644 --- a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.expect +++ b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.expect @@ -123,12 +123,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#3#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t9 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t10 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t11 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t10 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t11 = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t12 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.modular.expect index 00f2f8996ab..7616b4f8d24 100644 --- a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.modular.expect +++ b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.modular.expect @@ -123,12 +123,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#3#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t9 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t10 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t11 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t10 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t11 = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t12 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.transformed.expect index af12ee0fb13..b757af80133 100644 --- a/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart.weak.transformed.expect @@ -123,12 +123,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#3#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t9 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t10 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} && (let final core::int? #t11 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t10 = (#2#9#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16#func(){() → dynamic} is{ForNonNullableByDefault} core::List && (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t11 = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(0){(core::int) → dynamic} in true) && (let final core::int? #t12 = #notDefinitelyAssignedLateFinal = (#2#16#func(){() → dynamic} as{ForNonNullableByDefault} core::List).{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int? in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect index a93443f484d..dd1c615e344 100644 --- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect +++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect @@ -22,6 +22,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// // pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null. // String returnImplicit() /* error */ { // ^ @@ -42,6 +47,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// import self as self; import "dart:core" as core; import "dart:async" as asy; @@ -125,6 +135,10 @@ static method caseReturn2(self::Enum e) → self::Enum { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +Enum caseReturn2(Enum e) /* error */ { + ^" in null; } static method localFunctions() → dynamic { function returnImplicit() → core::String { @@ -194,6 +208,10 @@ static method localFunctions() → dynamic { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. + Enum caseReturn2(Enum e) /* error */ { + ^" in null; } core::bool b = false; core::int? local1 = (() → core::int? { diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect index f960f0ddbdb..2bc62824402 100644 --- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect @@ -22,6 +22,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// // pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null. // String returnImplicit() /* error */ { // ^ @@ -42,6 +47,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// import self as self; import "dart:core" as core; import "dart:async" as asy; @@ -125,6 +135,10 @@ static method caseReturn2(self::Enum e) → self::Enum { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +Enum caseReturn2(Enum e) /* error */ { + ^" in null; } static method localFunctions() → dynamic { function returnImplicit() → core::String { @@ -194,6 +208,10 @@ static method localFunctions() → dynamic { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. + Enum caseReturn2(Enum e) /* error */ { + ^" in null; } core::bool b = false; core::int? local1 = (() → core::int? { diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect index 4a6f583ea3c..0f1f95383f3 100644 --- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect +++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect @@ -22,6 +22,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// // pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null. // String returnImplicit() /* error */ { // ^ @@ -42,6 +47,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// import self as self; import "dart:core" as core; import "dart:async" as asy; @@ -125,6 +135,10 @@ static method caseReturn2(self::Enum e) → self::Enum { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +Enum caseReturn2(Enum e) /* error */ { + ^" in null; } static method localFunctions() → dynamic { function returnImplicit() → core::String { @@ -194,6 +208,10 @@ static method localFunctions() → dynamic { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. + Enum caseReturn2(Enum e) /* error */ { + ^" in null; } core::bool b = false; core::int? local1 = (() → core::int? { diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect index 4a6f583ea3c..0f1f95383f3 100644 --- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect +++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect @@ -22,6 +22,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// // pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null. // String returnImplicit() /* error */ { // ^ @@ -42,6 +47,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// import self as self; import "dart:core" as core; import "dart:async" as asy; @@ -125,6 +135,10 @@ static method caseReturn2(self::Enum e) → self::Enum { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +Enum caseReturn2(Enum e) /* error */ { + ^" in null; } static method localFunctions() → dynamic { function returnImplicit() → core::String { @@ -194,6 +208,10 @@ static method localFunctions() → dynamic { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. + Enum caseReturn2(Enum e) /* error */ { + ^" in null; } core::bool b = false; core::int? local1 = (() → core::int? { diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect index b24e32ce9ba..58ea758d2f2 100644 --- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect @@ -22,6 +22,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// // pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null. // String returnImplicit() /* error */ { // ^ @@ -42,6 +47,11 @@ library /*isNonNullableByDefault*/; // FutureOr returnAsync3() async {} // error // ^ // +// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. +// - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +// Enum caseReturn2(Enum e) /* error */ { +// ^ +// import self as self; import "dart:core" as core; import "dart:async" as asy; @@ -125,6 +135,10 @@ static method caseReturn2(self::Enum e) → self::Enum { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. +Enum caseReturn2(Enum e) /* error */ { + ^" in null; } static method localFunctions() → dynamic { function returnImplicit() → core::String { @@ -194,6 +208,10 @@ static method localFunctions() → dynamic { else { } } + return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null. + - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'. + Enum caseReturn2(Enum e) /* error */ { + ^" in null; } core::bool b = false; core::int? local1 = (() → core::int? { diff --git a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.expect b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.expect index 7dcd60c8968..c312014c6c0 100644 --- a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.expect +++ b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.expect @@ -33,7 +33,7 @@ static method test(dynamic x) → dynamic { } } { - final dynamic #4#0 = x; + final core::int #4#0 = x{core::int}; if(let final dynamic #t8 = #4#0 as{ForNonNullableByDefault} core::String in true) { return 4; } diff --git a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.transformed.expect index 5f214c1139d..9ead10a4388 100644 --- a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.strong.transformed.expect @@ -37,7 +37,7 @@ static method test(dynamic x) → dynamic { } } { - final dynamic #4#0 = x; + final core::int #4#0 = x{core::int}; if(let final core::String #t8 = #4#0 as{ForNonNullableByDefault} core::String in true) { return 4; } diff --git a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.expect b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.expect index 7dcd60c8968..c312014c6c0 100644 --- a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.expect +++ b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.expect @@ -33,7 +33,7 @@ static method test(dynamic x) → dynamic { } } { - final dynamic #4#0 = x; + final core::int #4#0 = x{core::int}; if(let final dynamic #t8 = #4#0 as{ForNonNullableByDefault} core::String in true) { return 4; } diff --git a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.modular.expect index 7dcd60c8968..c312014c6c0 100644 --- a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.modular.expect +++ b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.modular.expect @@ -33,7 +33,7 @@ static method test(dynamic x) → dynamic { } } { - final dynamic #4#0 = x; + final core::int #4#0 = x{core::int}; if(let final dynamic #t8 = #4#0 as{ForNonNullableByDefault} core::String in true) { return 4; } diff --git a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.transformed.expect index 5f214c1139d..9ead10a4388 100644 --- a/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/patterns/cast_inside_if_case.dart.weak.transformed.expect @@ -37,7 +37,7 @@ static method test(dynamic x) → dynamic { } } { - final dynamic #4#0 = x; + final core::int #4#0 = x{core::int}; if(let final core::String #t8 = #4#0 as{ForNonNullableByDefault} core::String in true) { return 4; } diff --git a/pkg/front_end/testcases/patterns/const_patterns.dart.strong.expect b/pkg/front_end/testcases/patterns/const_patterns.dart.strong.expect index e05d5bb83bb..118d204b876 100644 --- a/pkg/front_end/testcases/patterns/const_patterns.dart.strong.expect +++ b/pkg/front_end/testcases/patterns/const_patterns.dart.strong.expect @@ -274,7 +274,7 @@ class Class extends core::Object /*hasConstConstructor*/ { else if(#1#0 is{ForNonNullableByDefault} void && (let final dynamic #t1 = fun = #1#0{void} in true)) { { - () → Never {}; + () → Null {}; invalid-expression "pkg/front_end/testcases/patterns/const_patterns.dart:40:25: Error: This couldn't be parsed. case void fun() {}: // Error ^"; diff --git a/pkg/front_end/testcases/patterns/const_patterns.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/const_patterns.dart.strong.transformed.expect index 59ad3a8d593..7aebd86cc91 100644 --- a/pkg/front_end/testcases/patterns/const_patterns.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/patterns/const_patterns.dart.strong.transformed.expect @@ -274,7 +274,7 @@ class Class extends core::Object /*hasConstConstructor*/ { else if(#1#0 is{ForNonNullableByDefault} void && (let final void #t1 = fun = #1#0{void} in true)) { { - () → Never {}; + () → Null {}; invalid-expression "pkg/front_end/testcases/patterns/const_patterns.dart:40:25: Error: This couldn't be parsed. case void fun() {}: // Error ^"; diff --git a/pkg/front_end/testcases/patterns/const_patterns.dart.weak.expect b/pkg/front_end/testcases/patterns/const_patterns.dart.weak.expect index 66bbfe13126..e8bc4acc689 100644 --- a/pkg/front_end/testcases/patterns/const_patterns.dart.weak.expect +++ b/pkg/front_end/testcases/patterns/const_patterns.dart.weak.expect @@ -274,7 +274,7 @@ class Class extends core::Object /*hasConstConstructor*/ { else if(#1#0 is{ForNonNullableByDefault} void && (let final dynamic #t1 = fun = #1#0{void} in true)) { { - () → Never {}; + () → Null {}; invalid-expression "pkg/front_end/testcases/patterns/const_patterns.dart:40:25: Error: This couldn't be parsed. case void fun() {}: // Error ^"; diff --git a/pkg/front_end/testcases/patterns/const_patterns.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/const_patterns.dart.weak.modular.expect index 66bbfe13126..e8bc4acc689 100644 --- a/pkg/front_end/testcases/patterns/const_patterns.dart.weak.modular.expect +++ b/pkg/front_end/testcases/patterns/const_patterns.dart.weak.modular.expect @@ -274,7 +274,7 @@ class Class extends core::Object /*hasConstConstructor*/ { else if(#1#0 is{ForNonNullableByDefault} void && (let final dynamic #t1 = fun = #1#0{void} in true)) { { - () → Never {}; + () → Null {}; invalid-expression "pkg/front_end/testcases/patterns/const_patterns.dart:40:25: Error: This couldn't be parsed. case void fun() {}: // Error ^"; diff --git a/pkg/front_end/testcases/patterns/const_patterns.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/const_patterns.dart.weak.transformed.expect index 65742842503..efa5ed1dbe4 100644 --- a/pkg/front_end/testcases/patterns/const_patterns.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/patterns/const_patterns.dart.weak.transformed.expect @@ -274,7 +274,7 @@ class Class extends core::Object /*hasConstConstructor*/ { else if(#1#0 is{ForNonNullableByDefault} void && (let final void #t1 = fun = #1#0{void} in true)) { { - () → Never {}; + () → Null {}; invalid-expression "pkg/front_end/testcases/patterns/const_patterns.dart:40:25: Error: This couldn't be parsed. case void fun() {}: // Error ^"; diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect index 0a9bf3a1692..0818a01f64a 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.expect @@ -27,6 +27,11 @@ library /*isNonNullableByDefault*/; // Class(field1: a, field2: [[var e, _], [1, var f]]) = z; // ^ // +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// import self as self; import "dart:core" as core; import "dart:_internal" as _in; @@ -67,7 +72,10 @@ Try using a preexisting variable or changing the assignment to a pattern variabl if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; - ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t8 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; ^"))))) @@ -77,5 +85,4 @@ Try using a preexisting variable or changing the assignment to a pattern variabl constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect index f132dcf0b38..f4f311b939e 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.strong.transformed.expect @@ -27,6 +27,11 @@ library /*isNonNullableByDefault*/; // Class(field1: a, field2: [[var e, _], [1, var f]]) = z; // ^ // +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// import self as self; import "dart:core" as core; import "dart:_internal" as _in; @@ -73,7 +78,10 @@ Try using a preexisting variable or changing the assignment to a pattern variabl if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; - ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t8 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; ^"))))) @@ -83,5 +91,4 @@ Try using a preexisting variable or changing the assignment to a pattern variabl constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect index 0a9bf3a1692..0818a01f64a 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.expect @@ -27,6 +27,11 @@ library /*isNonNullableByDefault*/; // Class(field1: a, field2: [[var e, _], [1, var f]]) = z; // ^ // +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// import self as self; import "dart:core" as core; import "dart:_internal" as _in; @@ -67,7 +72,10 @@ Try using a preexisting variable or changing the assignment to a pattern variabl if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; - ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t8 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; ^"))))) @@ -77,5 +85,4 @@ Try using a preexisting variable or changing the assignment to a pattern variabl constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect index 0a9bf3a1692..0818a01f64a 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.modular.expect @@ -27,6 +27,11 @@ library /*isNonNullableByDefault*/; // Class(field1: a, field2: [[var e, _], [1, var f]]) = z; // ^ // +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// import self as self; import "dart:core" as core; import "dart:_internal" as _in; @@ -67,7 +72,10 @@ Try using a preexisting variable or changing the assignment to a pattern variabl if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; - ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t8 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; ^"))))) @@ -77,5 +85,4 @@ Try using a preexisting variable or changing the assignment to a pattern variabl constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect index f132dcf0b38..f4f311b939e 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_declares.dart.weak.transformed.expect @@ -27,6 +27,11 @@ library /*isNonNullableByDefault*/; // Class(field1: a, field2: [[var e, _], [1, var f]]) = z; // ^ // +// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// Class(field1: a, field2: [[var e, _], [1, var f]]) = z; +// ^ +// import self as self; import "dart:core" as core; import "dart:_internal" as _in; @@ -73,7 +78,10 @@ Try using a preexisting variable or changing the assignment to a pattern variabl if(!(#2#0 is{ForNonNullableByDefault} self::Class && (let final dynamic #t4 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; - ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. + ^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + Class(field1: a, field2: [[var e, _], [1, var f]]) = z; + ^") && (let final dynamic #t8 = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment. Try using a preexisting variable or changing the assignment to a pattern variable declaration. Class(field1: a, field2: [[var e, _], [1, var f]]) = z; ^"))))) @@ -83,5 +91,4 @@ Try using a preexisting variable or changing the assignment to a pattern variabl constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart index 37121b3dc55..3e2ffb17815 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart +++ b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart @@ -35,5 +35,5 @@ method(x, y, z) { definitelyAssignedFinal] = y; // Error Class(field1: definitelyAssignedLateFinal, // Error field2: [[notDefinitelyAssignedFinal, _], // Error - [1, notDefinitelyAssignedLateFinal]]) = z; // Ok + [_, notDefinitelyAssignedLateFinal]]) = z; // Ok } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.expect b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.expect index f95cded1f61..6d3fae258f7 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.expect @@ -73,12 +73,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t8 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.transformed.expect index 46a9bd7c0bb..c46d7f83079 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.strong.transformed.expect @@ -79,12 +79,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final core::int #t7 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final core::int #t8 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.expect b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.expect index f95cded1f61..6d3fae258f7 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.expect @@ -73,12 +73,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t8 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.modular.expect index f95cded1f61..6d3fae258f7 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.modular.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.modular.expect @@ -73,12 +73,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final dynamic #t7 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final dynamic #t8 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.transformed.expect index 46a9bd7c0bb..c46d7f83079 100644 --- a/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.transformed.expect @@ -79,12 +79,11 @@ static method method(dynamic x, dynamic y, dynamic z) → dynamic { Class(field1: definitelyAssignedLateFinal, // Error ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3 is{ForNonNullableByDefault} core::List && #2#3{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is{ForNonNullableByDefault} core::List && #2#9{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = #2#9{core::List}.{core::List::[]}(0){(core::int) → dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point. field2: [[notDefinitelyAssignedFinal, _], // Error - ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} && (let final core::int #t7 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (let final dynamic #t6 = #2#9{core::List}.{core::List::[]}(1){(core::int) → dynamic} in true)) && (#2#16 is{ForNonNullableByDefault} core::List && #2#16{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #2#16{core::List}.{core::List::[]}(0){(core::int) → dynamic} in true) && (let final core::int #t8 = notDefinitelyAssignedLateFinal = #2#16{core::List}.{core::List::[]}(1){(core::int) → dynamic} as{ForNonNullableByDefault} core::int in true))))) throw new _in::ReachabilityError::•(); } =>#2#0; } constants { #C1 = 2 - #C2 = 1 } diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect index 782546aedc8..7db7b4da460 100644 --- a/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect +++ b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect @@ -1,11 +1,22 @@ library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// (null) = null; +// ^ +// import self as self; import "dart:_internal" as _in; static method main() → dynamic { block { final has-declared-initializer dynamic #0#0 = null; - if(!(#0#0 == null)) + if(!invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + (null) = null; + ^") throw new _in::ReachabilityError::•(); } =>#0#0; } diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect index 782546aedc8..7db7b4da460 100644 --- a/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect @@ -1,11 +1,22 @@ library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// (null) = null; +// ^ +// import self as self; import "dart:_internal" as _in; static method main() → dynamic { block { final has-declared-initializer dynamic #0#0 = null; - if(!(#0#0 == null)) + if(!invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + (null) = null; + ^") throw new _in::ReachabilityError::•(); } =>#0#0; } diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.expect index 782546aedc8..7db7b4da460 100644 --- a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.expect +++ b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.expect @@ -1,11 +1,22 @@ library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// (null) = null; +// ^ +// import self as self; import "dart:_internal" as _in; static method main() → dynamic { block { final has-declared-initializer dynamic #0#0 = null; - if(!(#0#0 == null)) + if(!invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + (null) = null; + ^") throw new _in::ReachabilityError::•(); } =>#0#0; } diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect index 782546aedc8..7db7b4da460 100644 --- a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect +++ b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect @@ -1,11 +1,22 @@ library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// (null) = null; +// ^ +// import self as self; import "dart:_internal" as _in; static method main() → dynamic { block { final has-declared-initializer dynamic #0#0 = null; - if(!(#0#0 == null)) + if(!invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + (null) = null; + ^") throw new _in::ReachabilityError::•(); } =>#0#0; } diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.transformed.expect index 782546aedc8..7db7b4da460 100644 --- a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.transformed.expect @@ -1,11 +1,22 @@ library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +// Try using an if-case, a 'switch' statement, or a 'switch' expression instead. +// (null) = null; +// ^ +// import self as self; import "dart:_internal" as _in; static method main() → dynamic { block { final has-declared-initializer dynamic #0#0 = null; - if(!(#0#0 == null)) + if(!invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:6:4: Error: Refutable patterns can't be used in an irrefutable context. +Try using an if-case, a 'switch' statement, or a 'switch' expression instead. + (null) = null; + ^") throw new _in::ReachabilityError::•(); } =>#0#0; } diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect b/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect index be078e5f93e..ed3b4d40035 100644 --- a/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect +++ b/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect @@ -18,7 +18,7 @@ static method main() → void { else if(#C2 =={core::num::==}{(core::Object) → core::bool} #1#0) { { - (() → Never { + (() → Null { #L2: { core::int #t1 = -1; @@ -46,7 +46,7 @@ static method main() → void { } } } - })(){() → Never}; + })(){() → Null}; } } } diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect index 82f52f3cdee..a96a929d5b3 100644 --- a/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect @@ -18,7 +18,7 @@ static method main() → void { else if(#C2 =={core::num::==}{(core::Object) → core::bool} #1#0) { { - (() → Never { + (() → Null { #L2: { core::int #t1 = -1; @@ -46,7 +46,7 @@ static method main() → void { } } } - })(){() → Never}; + })(){() → Null}; } } } diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.weak.expect b/pkg/front_end/testcases/regress/issue_39040.dart.weak.expect index 2f42a0753c2..ed3b4d40035 100644 --- a/pkg/front_end/testcases/regress/issue_39040.dart.weak.expect +++ b/pkg/front_end/testcases/regress/issue_39040.dart.weak.expect @@ -1,7 +1,6 @@ library /*isNonNullableByDefault*/; import self as self; import "dart:core" as core; -import "dart:_internal" as _in; static method main() → void { core::List whereWasI = []; @@ -19,17 +18,17 @@ static method main() → void { else if(#C2 =={core::num::==}{(core::Object) → core::bool} #1#0) { { - let final Never #t1 = (() → Never { + (() → Null { #L2: { - core::int #t2 = -1; + core::int #t1 = -1; final core::int #0#0 = inner; if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) - #t2 = 0; + #t1 = 0; else if(#C2 =={core::num::==}{(core::Object) → core::bool} #0#0) - #t2 = 1; - switch(#t2) { + #t1 = 1; + switch(#t1) { #L3: case #C1: { @@ -47,7 +46,7 @@ static method main() → void { } } } - })(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."); + })(){() → Null}; } } } diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect index 2f42a0753c2..ed3b4d40035 100644 --- a/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect +++ b/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect @@ -1,7 +1,6 @@ library /*isNonNullableByDefault*/; import self as self; import "dart:core" as core; -import "dart:_internal" as _in; static method main() → void { core::List whereWasI = []; @@ -19,17 +18,17 @@ static method main() → void { else if(#C2 =={core::num::==}{(core::Object) → core::bool} #1#0) { { - let final Never #t1 = (() → Never { + (() → Null { #L2: { - core::int #t2 = -1; + core::int #t1 = -1; final core::int #0#0 = inner; if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) - #t2 = 0; + #t1 = 0; else if(#C2 =={core::num::==}{(core::Object) → core::bool} #0#0) - #t2 = 1; - switch(#t2) { + #t1 = 1; + switch(#t1) { #L3: case #C1: { @@ -47,7 +46,7 @@ static method main() → void { } } } - })(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."); + })(){() → Null}; } } } diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_39040.dart.weak.transformed.expect index ae7eb0850ee..a96a929d5b3 100644 --- a/pkg/front_end/testcases/regress/issue_39040.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/regress/issue_39040.dart.weak.transformed.expect @@ -1,7 +1,6 @@ library /*isNonNullableByDefault*/; import self as self; import "dart:core" as core; -import "dart:_internal" as _in; static method main() → void { core::List whereWasI = core::_GrowableList::•(0); @@ -19,17 +18,17 @@ static method main() → void { else if(#C2 =={core::num::==}{(core::Object) → core::bool} #1#0) { { - let final Never #t1 = (() → Never { + (() → Null { #L2: { - core::int #t2 = -1; + core::int #t1 = -1; final core::int #0#0 = inner; if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) - #t2 = 0; + #t1 = 0; else if(#C2 =={core::num::==}{(core::Object) → core::bool} #0#0) - #t2 = 1; - switch(#t2) { + #t1 = 1; + switch(#t1) { #L3: case #C1: { @@ -47,7 +46,7 @@ static method main() → void { } } } - })(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."); + })(){() → Null}; } } } diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status index 1d3f59a7ce8..aeb2d664f78 100644 --- a/pkg/front_end/testcases/strong.status +++ b/pkg/front_end/testcases/strong.status @@ -172,6 +172,7 @@ rasta/issue_000041: RuntimeError rasta/issue_000042: RuntimeError rasta/issue_000044: RuntimeError rasta/malformed_const_constructor: RuntimeError +rasta/malformed_function: RuntimeError rasta/parser_error: RuntimeError rasta/static: RuntimeError rasta/super: RuntimeError diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status index 9cecd4468c8..1fbc0468531 100644 --- a/pkg/front_end/testcases/weak.status +++ b/pkg/front_end/testcases/weak.status @@ -254,6 +254,7 @@ rasta/issue_000041: RuntimeError rasta/issue_000042: RuntimeError rasta/issue_000044: RuntimeError rasta/malformed_const_constructor: RuntimeError +rasta/malformed_function: RuntimeError rasta/parser_error: RuntimeError rasta/static: RuntimeError rasta/super: RuntimeError @@ -276,7 +277,6 @@ regress/issue_35260: RuntimeError # Expected regress/issue_35266: RuntimeError # Expected regress/issue_37285: RuntimeError regress/issue_39091_2: RuntimeError -regress/issue_39040: RuntimeError # https://github.com/dart-lang/sdk/issues/51206 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError set_literals/disambiguation_rule2: RuntimeError