85cb56dd20
This changes the pattern matching lowering to avoid using late final variables (or lowerings thereof) and instead inline the initializer where used. This avoids generating closures that are hard for backends to reason about and optimize. Closes #52805 Closes #53804 Change-Id: Ia887446dd4d4475d05cf852c812bfe4b851de261 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338860 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
76 lines
6.1 KiB
Plaintext
76 lines
6.1 KiB
Plaintext
library;
|
|
//
|
|
// Problems in library:
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment.
|
|
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
|
|
// (a, int b, final int c) = x;
|
|
// ^
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment.
|
|
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
|
|
// (a, int b, final int c) = x;
|
|
// ^
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment.
|
|
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
|
|
// [a, final d] = y;
|
|
// ^
|
|
//
|
|
// 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;
|
|
// ^
|
|
//
|
|
// 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;
|
|
// ^
|
|
//
|
|
// 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;
|
|
|
|
class Class extends core::Object {
|
|
field dynamic field1 = null;
|
|
field dynamic field2 = null;
|
|
synthetic constructor •() → self::Class
|
|
: super core::Object::•()
|
|
;
|
|
}
|
|
static method method(dynamic x, dynamic y, dynamic z) → dynamic {
|
|
dynamic a;
|
|
{
|
|
final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (dynamic, invalid-type, invalid-type);
|
|
if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "declared variable pattern in assignment" && invalid-expression "declared variable pattern in assignment"))
|
|
throw new core::StateError::•("Pattern matching error");
|
|
}
|
|
{
|
|
final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<invalid-type>;
|
|
if(!(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && invalid-expression "declared variable pattern in assignment"))
|
|
throw new core::StateError::•("Pattern matching error");
|
|
}
|
|
{
|
|
final synthesized dynamic #2#0 = z as{TypeError,ForDynamic} self::Class;
|
|
synthesized dynamic #2#3;
|
|
synthesized core::bool #2#3#isSet = false;
|
|
synthesized dynamic #2#9;
|
|
synthesized core::bool #2#9#isSet = false;
|
|
synthesized dynamic #2#16;
|
|
synthesized core::bool #2#16#isSet = false;
|
|
if(!(#2#0 is self::Class && (let final dynamic #t3 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t4 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) is core::List<dynamic> && ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t5 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#2#9#isSet ?{dynamic} #2#9{dynamic} : let final dynamic #t6 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t7 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) is core::List<dynamic> && ((#2#9#isSet ?{dynamic} #2#9{dynamic} : let final dynamic #t8 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t9 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && invalid-expression "declared variable pattern in assignment") && ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final dynamic #t10 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t11 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) is core::List<dynamic> && ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final dynamic #t12 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t13 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && 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;
|
|
^" && invalid-expression "declared variable pattern in assignment"))))
|
|
throw new core::StateError::•("Pattern matching error");
|
|
}
|
|
}
|
|
|
|
constants {
|
|
#C1 = 2
|
|
}
|