Files
sdk/pkg/front_end/testcases/patterns/pattern_assignment_final.dart.weak.modular.expect
T
Johnni Winther 85cb56dd20 [cfe] Don't use late final for pattern caching
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>
2023-12-06 12:01:38 +00:00

86 lines
7.0 KiB
Plaintext

library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
// (initializedFinal, // Error
// ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:32:7: Error: Late final variable 'initializedLateFinal' definitely assigned.
// initializedLateFinal, // Error
// ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
// definitelyAssignedFinal] = y; // Error
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:36:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
// Class(field1: definitelyAssignedLateFinal, // Error
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// 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
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//
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 {
final core::int initializedFinal = 5;
late final core::int initializedLateFinal = 5;
final dynamic definitelyUnassignedFinal;
late final core::int definitelyUnassignedLateFinal;
final dynamic definitelyAssignedFinal;
late final dynamic definitelyAssignedLateFinal;
final core::int notDefinitelyAssignedFinal;
late final core::int notDefinitelyAssignedLateFinal;
if(x =={core::Object::==}{(core::Object) → core::bool} 5) {
notDefinitelyAssignedFinal = 5;
notDefinitelyAssignedLateFinal = 15;
}
definitelyAssignedFinal = 10;
definitelyAssignedLateFinal = 20;
{
final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (core::int, core::int, dynamic);
if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
(initializedFinal, // Error
^^^^^^^^^^^^^^^^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:32:7: Error: Late final variable 'initializedLateFinal' definitely assigned.
initializedLateFinal, // Error
^^^^^^^^^^^^^^^^^^^^" && (let final dynamic #t1 = definitelyUnassignedFinal = #0#0{(core::Object?, core::Object?, core::Object?)}.$3{core::Object?} in true)))
throw new core::StateError::•("Pattern matching error");
}
{
final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<core::int>;
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 = definitelyUnassignedLateFinal = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} as core::int in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
definitelyAssignedFinal] = y; // Error
^^^^^^^^^^^^^^^^^^^^^^^"))
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 = #2#0{self::Class}.{self::Class::field1}{dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:36:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
Class(field1: definitelyAssignedLateFinal, // Error
^^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#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 "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
^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#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 && (let final dynamic #t14 = notDefinitelyAssignedLateFinal = ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final dynamic #t15 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t16 = #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::[]}(1){(core::int) → dynamic} as core::int in true)))))
throw new core::StateError::•("Pattern matching error");
}
}
constants {
#C1 = 2
}