Files
sdk/pkg/front_end/testcases/patterns/simple_rest_pattern.dart.strong.expect
T
Johnni Winther 70d3adade2 [cfe] Move hoisted variables after variable caches
This moves the hoisted declaration of pattern variables till after the
variable cache declarations, such that any use of variables in the
matched expression, shadowed by the pattern variables, occurs before the
declaration of the shadowing variables.

Closes #54559

Change-Id: Id8ca8e7a499b9d71a50cd9987808d159f26bbd24
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/345942
Reviewed-by: Erik Ernst <eernst@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2024-01-16 09:09:29 +00:00

87 lines
3.9 KiB
Plaintext

library;
import self as self;
import "dart:core" as core;
static method test1(dynamic x) → dynamic {
{
final synthesized dynamic #0#0 = x;
synthesized dynamic #0#6;
synthesized core::bool #0#6#isSet = false;
{
hoisted core::int y;
if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t1 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) is core::int) {
y = (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t2 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::int;
{
return y;
}
}
else {
return null;
}
}
}
}
static method test2(dynamic x) → dynamic {
{
final synthesized dynamic #0#0 = x;
synthesized dynamic #0#6;
synthesized core::bool #0#6#isSet = false;
{
hoisted core::int y;
if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t3 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) is core::int) {
y = (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t4 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::int;
{
return y;
}
}
else {
return null;
}
}
}
}
static method test3(dynamic x) → dynamic {
{
final synthesized dynamic #0#0 = x;
synthesized core::int #0#2;
synthesized core::bool #0#2#isSet = false;
synthesized dynamic #0#6;
synthesized core::bool #0#6#isSet = false;
{
hoisted core::int y;
if(#0#0 is core::List<dynamic> && (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t5 = #0#2#isSet = true in #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int}).{core::num::>=}(#C1){(core::num) → core::bool} && (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t6 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}((#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t7 = #0#2#isSet = true in #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int}).{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic}) is core::int) {
y = (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t8 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}((#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t9 = #0#2#isSet = true in #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int}).{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic}) as{Unchecked} core::int;
{
return y;
}
}
else {
return null;
}
}
}
}
static method main() → dynamic {
self::expectEquals(self::test1(<core::int>[1]), 1);
self::expectEquals(self::test1(<core::int>[1, 2, 3]), null);
self::expectEquals(self::test1(<dynamic>[]), null);
self::expectEquals(self::test1("foo"), null);
self::expectEquals(self::test2(<core::int>[1]), 1);
self::expectEquals(self::test2(<core::int>[1, 2, 3]), 1);
self::expectEquals(self::test2(<dynamic>[]), null);
self::expectEquals(self::test2("foo"), null);
self::expectEquals(self::test3(<core::int>[1]), 1);
self::expectEquals(self::test3(<core::int>[1, 2, 3]), 3);
self::expectEquals(self::test3(<dynamic>[]), null);
self::expectEquals(self::test3("foo"), null);
}
static method expectEquals(dynamic x, dynamic y) → dynamic {
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
throw "Expected ${x} to be equal to ${y}.";
}
}
constants {
#C1 = 1
}