Files
sdk/pkg/front_end/testcases/patterns/shared_errors.dart.weak.transformed.expect
T
Johnni Winther c6347389d2 [cfe] Move irrefutable tails into the case body
This moves pattern variable assignments of fully matched expressions into the case body. This will help backends (dart2js in particular) to reason about the code flow.

Closes #54115

Change-Id: I598a384a829f16e91ab2d6a309499cf20b9cc121
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339122
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
2023-12-07 11:13:30 +00:00

288 lines
12 KiB
Plaintext

library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/shared_errors.dart:13:13: Error: The argument type 'int' can't be assigned to the parameter type 'Class'.
// - 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
// case >= 0: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:20:10: Error: A value of type 'Class' can't be assigned to a variable of type 'bool'.
// - 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
// case > 0: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:26:12: Error: The matched value of type 'List<String>' isn't assignable to the required type 'List<int>'.
// - 'List' is from 'dart:core'.
// Try changing the required type of the pattern, or the matched value type.
// var <int>[a] = list; // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:31:7: Error: The variable 'a' is already assigned in this pattern.
// Try renaming the variable.
// [a, a] = list; // Error
// ^
// pkg/front_end/testcases/patterns/shared_errors.dart:31:4: Context: The first assigned variable pattern.
// [a, a] = list; // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:36:28: Error: The field 'field' is already matched in this pattern.
// Try removing the duplicate field.
// case (field: 1, field: 2): // Error
// ^
// pkg/front_end/testcases/patterns/shared_errors.dart:36:18: Context: The first field.
// case (field: 1, field: 2): // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:37:33: Error: The field 'field' is already matched in this pattern.
// Try removing the duplicate field.
// case Class(field: 1, field: 2): // Error
// ^
// pkg/front_end/testcases/patterns/shared_errors.dart:37:23: Context: The first field.
// case Class(field: 1, field: 2): // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:44:16: Error: At most one rest element is allowed in a list or map pattern.
// Try removing the duplicate rest element.
// case [..., ...]: // Error
// ^
// pkg/front_end/testcases/patterns/shared_errors.dart:44:11: Context: The first rest element.
// case [..., ...]: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:45:11: Error: The '...' pattern can't appear in map patterns.
// case {..., ...}: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:45:16: Error: The '...' pattern can't appear in map patterns.
// case {..., ...}: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:51:10: Error: A map pattern must have at least one entry.
// Try replacing it with an object pattern 'Map()'.
// case {}: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:57:11: Error: The '...' pattern can't appear in map patterns.
// case {...}: // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:62:23: Warning: The null-assert pattern will have no effect because the matched type isn't nullable.
// Try replacing the null-assert pattern with its nested pattern.
// if (list case [var a!, var b?]) { // Warnings
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:62:31: Warning: The null-check pattern will have no effect because the matched type isn't nullable.
// Try replacing the null-check pattern with its nested pattern.
// if (list case [var a!, var b?]) { // Warnings
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:68:21: Error: Conditions must have a static type of 'bool'.
// Try changing the condition.
// if (i case 0 when i) { // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:74:9: Error: Refutable patterns can't be used in an irrefutable context.
// Try using an if-case, a 'switch' statement, or a 'switch' expression instead.
// var (a?) = x; // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:78:15: Error: The '...' pattern can't appear in map patterns.
// if (o case {..., 5: 3}) { // Error
// ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:84:21: Error: The '...' pattern can't appear in map patterns.
// if (o case {5: 3, ...var a}) { // Error
// ^
//
import self as self;
import "dart:core" as core;
class Class extends core::Object {
synthetic constructor •() → self::Class
: super core::Object::•()
;
get field() → core::int
return 42;
operator >=(self::Class cls) → core::bool
return true;
operator >(core::int i) → self::Class
return new self::Class::•();
}
static method argumentTypeNotAssignable(self::Class cls) → dynamic {
#L1:
{
final synthesized self::Class #0#0 = cls;
{
if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:13:13: Error: The argument type 'int' can't be assigned to the parameter type 'Class'.
- 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
case >= 0: // Error
^") {
{
core::print(0);
}
}
}
}
}
static method relationalPatternOperatorReturnTypeNotAssignableToBool(self::Class cls) → dynamic {
#L2:
{
final synthesized self::Class #0#0 = cls;
{
if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:20:10: Error: A value of type 'Class' can't be assigned to a variable of type 'bool'.
- 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
case > 0: // Error
^") {
{
core::print(0);
}
}
}
}
}
static method patternTypeMismatchInIrrefutableContext(core::List<core::String> list) → dynamic {
has-declared-initializer core::int a;
{
final synthesized core::List<core::String> #0#0 = list;
if(!invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:26:12: Error: The matched value of type 'List<String>' isn't assignable to the required type 'List<int>'.
- 'List' is from 'dart:core'.
Try changing the required type of the pattern, or the matched value type.
var <int>[a] = list; // Error
^")
throw new core::StateError::•("Pattern matching error");
}
}
static method duplicateAssignmentPatternVariable(core::List<core::String> list) → dynamic {
core::String a = "";
{
final synthesized core::List<core::String> #0#0 = list;
if(!(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final core::String #t1 = a = #0#0.{core::List::[]}(0){(core::int) → core::String} in true) && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:31:7: Error: The variable 'a' is already assigned in this pattern.
Try renaming the variable.
[a, a] = list; // Error
^"))
throw new core::StateError::•("Pattern matching error");
}
}
static method duplicateRecordPatternField(dynamic o) → dynamic {
#L3:
{
final synthesized dynamic #0#0 = o;
synthesized core::int #0#2;
synthesized core::bool #0#2#isSet = false;
{
if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:36:28: Error: The field 'field' is already matched in this pattern.
Try removing the duplicate field.
case (field: 1, field: 2): // Error
^" || #0#0 is self::Class && #C2 =={core::num::==}{(core::Object) → core::bool} (#0#2#isSet ?{core::int} #0#2{core::int} : let final core::bool* #t2 = #0#2#isSet = true in #0#2 = #0#0{self::Class}.{self::Class::field}{core::int}) && (let final core::int #t3 = #0#2#isSet ?{core::int} #0#2{core::int} : let final core::bool* #t4 = #0#2#isSet = true in #0#2 = #0#0{self::Class}.{self::Class::field}{core::int} in invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:37:33: Error: The field 'field' is already matched in this pattern.
Try removing the duplicate field.
case Class(field: 1, field: 2): // Error
^")) {
{
core::print(0);
}
}
}
}
}
static method duplicateRestPattern(dynamic o) → dynamic {
#L4:
{
final synthesized dynamic #0#0 = o;
{
if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:44:16: Error: At most one rest element is allowed in a list or map pattern.
Try removing the duplicate rest element.
case [..., ...]: // Error
^" || invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:45:11: Error: The '...' pattern can't appear in map patterns.
case {..., ...}: // Error
^") {
}
}
}
}
static method emptyMapPattern(dynamic o) → dynamic {
#L5:
{
final synthesized dynamic #0#0 = o;
{
if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:51:10: Error: A map pattern must have at least one entry.
Try replacing it with an object pattern 'Map()'.
case {}: // Error
^") {
}
}
}
}
static method singleRestPatternInMap(dynamic o) → dynamic {
#L6:
{
final synthesized dynamic #0#0 = o;
{
if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:57:11: Error: The '...' pattern can't appear in map patterns.
case {...}: // Error
^") {
}
}
}
}
static method matchedTypeIsStrictlyNonNullable(core::List<core::int> list) → dynamic {
{
hoisted core::int a;
hoisted core::int b;
final synthesized core::List<core::int> #0#0 = list;
synthesized core::int #0#4;
synthesized core::bool #0#4#isSet = false;
synthesized core::int #0#6;
synthesized core::bool #0#6#isSet = false;
if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final core::int #t5 = (#0#4#isSet ?{core::int} #0#4{core::int} : let final core::bool* #t6 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int})! in let final core::int #t7 = a = (#0#4#isSet ?{core::int} #0#4{core::int} : let final core::bool* #t8 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int})! in true) && !((#0#6#isSet ?{core::int} #0#6{core::int} : let final core::bool* #t9 = #0#6#isSet = true in #0#6 = #0#0.{core::List::[]}(1){(core::int) → core::int}) == null)) {
b = #0#6#isSet ?{core::int} #0#6{core::int} : let final core::bool* #t10 = #0#6#isSet = true in #0#6 = #0#0.{core::List::[]}(1){(core::int) → core::int};
{
core::print(0);
}
}
}
}
static method nonBooleanCondition(core::int i) → dynamic {
{
final synthesized core::int #0#0 = i;
if(#C3 =={core::num::==}{(core::Object) → core::bool} #0#0 && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:68:21: Error: Conditions must have a static type of 'bool'.
Try changing the condition.
if (i case 0 when i) { // Error
^") {
core::print(0);
}
}
}
static method refutablePatternInIrrefutableContext(core::int? x) → dynamic {
hoisted has-declared-initializer core::int a;
{
final synthesized core::int? #0#0 = x;
if(!(!(#0#0 == null) && (let final core::int #t11 = a = #0#0{core::int} in true)))
throw new core::StateError::•("Pattern matching error");
}
}
static method restPatternNotLastInMap(dynamic o) → dynamic {
{
final synthesized dynamic #0#0 = o;
if(#0#0 is core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && #C5 =={core::num::==}{(core::Object) → core::bool} #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic}) {
core::print(0);
}
}
}
static method restPatternWithSubPatternInMap(dynamic o) → dynamic {
{
final synthesized dynamic #0#0 = o;
if(#0#0 is core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && #C5 =={core::num::==}{(core::Object) → core::bool} #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic}) {
core::print(0);
}
}
}
constants {
#C1 = 2
#C2 = 1
#C3 = 0
#C4 = 5
#C5 = 3
}