[cfe] Change the order of hoisted initializers insertions
Change-Id: I61db6b57fffc11d62267b8648b4741a74d0a9f83
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/218440
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 5beadc5..93e1544 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -5038,8 +5038,7 @@
void applyResult(List<Initializer> initializers, TreeNode? parent) {
List<VariableDeclaration>? hoistedArguments = this.hoistedArguments;
if (hoistedArguments != null && hoistedArguments.isNotEmpty) {
- for (int i = hoistedArguments.length - 1; i >= 0; i--) {
- VariableDeclaration hoistedArgument = hoistedArguments[i];
+ for (VariableDeclaration hoistedArgument in hoistedArguments) {
initializers.add(new LocalInitializer(hoistedArgument)
..parent = parent
..fileOffset = hoistedArgument.fileOffset);
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart
index 34687b9..ebb9e92 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart
@@ -3,20 +3,21 @@
// BSD-style license that can be found in the LICENSE file.
class A {
- A(int x, {required String y});
+ A(int x, bool y, {required String z});
- A.foo() : this(y: "foo", 42);
+ A.foo() : this(42, z: "foo", false);
- factory A.bar(int x, {required String y}) = A;
+ factory A.bar(int x, bool y, {required String z}) = A;
}
class B extends A {
- B() : super(y: "foo", 42);
+ B() : super(42, z: "foo", false);
}
test() {
- new A.bar(42, y: "bar");
- new A.bar(y: "bar", 42);
+ new A.bar(42, false, z: "bar");
+ new A.bar(42, z: "bar", false);
+ new A.bar(z: "bar", 42, false);
}
main() {}
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.expect
index 11a5a0d..5b2dee8 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.expect
@@ -4,23 +4,24 @@
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
- constructor •(core::int x, {required core::String y = #C2}) → self::A
+ constructor •(core::int x, core::bool y, {required core::String z = #C2}) → self::A
: super core::Object::•()
;
constructor foo() → self::A
- : final core::String #t1 = "foo", this self::A::•(42, y: #t1)
+ : final core::int #t1 = 42, final core::String #t2 = "foo", this self::A::•(#t1, false, z: #t2)
;
- static factory bar(core::int x, {required core::String y = #C2}) → self::A
- return new self::A::•(x, y: y);
+ static factory bar(core::int x, core::bool y, {required core::String z = #C2}) → self::A
+ return new self::A::•(x, y, z: z);
}
class B extends self::A {
constructor •() → self::B
- : final core::String #t2 = "foo", super self::A::•(42, y: #t2)
+ : final core::int #t3 = 42, final core::String #t4 = "foo", super self::A::•(#t3, false, z: #t4)
;
}
static method test() → dynamic {
- new self::A::•(42, y: "bar");
- let final core::String #t3 = "bar" in new self::A::•(42, y: #t3);
+ new self::A::•(42, false, z: "bar");
+ let final core::int #t5 = 42 in let final core::String #t6 = "bar" in new self::A::•(#t5, false, z: #t6);
+ let final core::String #t7 = "bar" in new self::A::•(42, false, z: #t7);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.transformed.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.transformed.expect
index dc2f303..06dd91e 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.strong.transformed.expect
@@ -4,23 +4,24 @@
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
- constructor •(core::int x, {required core::String y = #C2}) → self::A
+ constructor •(core::int x, core::bool y, {required core::String z = #C2}) → self::A
: super core::Object::•()
;
constructor foo() → self::A
- : final core::String #t1 = "foo", this self::A::•(42, y: #t1)
+ : final core::int #t1 = 42, final core::String #t2 = "foo", this self::A::•(#t1, false, z: #t2)
;
- static factory bar(core::int x, {required core::String y = #C2}) → self::A
- return new self::A::•(x, y: y);
+ static factory bar(core::int x, core::bool y, {required core::String z = #C2}) → self::A
+ return new self::A::•(x, y, z: z);
}
class B extends self::A {
constructor •() → self::B
- : final core::String #t2 = "foo", super self::A::•(42, y: #t2)
+ : final core::int #t3 = 42, final core::String #t4 = "foo", super self::A::•(#t3, false, z: #t4)
;
}
static method test() → dynamic {
- new self::A::•(42, y: "bar");
- let final core::String #t3 = "bar" in new self::A::•(42, y: #t3);
+ new self::A::•(42, false, z: "bar");
+ let final core::int #t5 = 42 in let final core::String #t6 = "bar" in new self::A::•(#t5, false, z: #t6);
+ let final core::String #t7 = "bar" in new self::A::•(42, false, z: #t7);
}
static method main() → dynamic {}
@@ -30,5 +31,7 @@
}
Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:19:16 -> StringConstant("bar")
-Extra constant evaluation: evaluated: 10, effectively constant: 1
+Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:19:13 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:19:20 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:20:16 -> StringConstant("bar")
+Extra constant evaluation: evaluated: 18, effectively constant: 3
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.textual_outline.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.textual_outline.expect
index affc6ae..4ca0a85 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.textual_outline.expect
@@ -1,10 +1,10 @@
class A {
- A(int x, {required String y});
- A.foo() : this(y: "foo", 42);
- factory A.bar(int x, {required String y}) = A;
+ A(int x, bool y, {required String z});
+ A.foo() : this(42, z: "foo", false);
+ factory A.bar(int x, bool y, {required String z}) = A;
}
class B extends A {
- B() : super(y: "foo", 42);
+ B() : super(42, z: "foo", false);
}
test() {}
main() {}
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.expect
index 11a5a0d..5b2dee8 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.expect
@@ -4,23 +4,24 @@
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
- constructor •(core::int x, {required core::String y = #C2}) → self::A
+ constructor •(core::int x, core::bool y, {required core::String z = #C2}) → self::A
: super core::Object::•()
;
constructor foo() → self::A
- : final core::String #t1 = "foo", this self::A::•(42, y: #t1)
+ : final core::int #t1 = 42, final core::String #t2 = "foo", this self::A::•(#t1, false, z: #t2)
;
- static factory bar(core::int x, {required core::String y = #C2}) → self::A
- return new self::A::•(x, y: y);
+ static factory bar(core::int x, core::bool y, {required core::String z = #C2}) → self::A
+ return new self::A::•(x, y, z: z);
}
class B extends self::A {
constructor •() → self::B
- : final core::String #t2 = "foo", super self::A::•(42, y: #t2)
+ : final core::int #t3 = 42, final core::String #t4 = "foo", super self::A::•(#t3, false, z: #t4)
;
}
static method test() → dynamic {
- new self::A::•(42, y: "bar");
- let final core::String #t3 = "bar" in new self::A::•(42, y: #t3);
+ new self::A::•(42, false, z: "bar");
+ let final core::int #t5 = 42 in let final core::String #t6 = "bar" in new self::A::•(#t5, false, z: #t6);
+ let final core::String #t7 = "bar" in new self::A::•(42, false, z: #t7);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.outline.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.outline.expect
index 727bf5e..ccf5a7c 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.outline.expect
@@ -4,12 +4,12 @@
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::bar]/*isLegacy*/;
- constructor •(core::int x, {required core::String y}) → self::A
+ constructor •(core::int x, core::bool y, {required core::String z}) → self::A
;
constructor foo() → self::A
;
- static factory bar(core::int x, {required core::String y}) → self::A
- return new self::A::•(x, y: y);
+ static factory bar(core::int x, core::bool y, {required core::String z}) → self::A
+ return new self::A::•(x, y, z: z);
}
class B extends self::A {
constructor •() → self::B
@@ -23,4 +23,4 @@
Extra constant evaluation status:
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:5:7 -> ConstructorTearOffConstant(A.bar)
-Extra constant evaluation: evaluated: 5, effectively constant: 1
+Extra constant evaluation: evaluated: 6, effectively constant: 1
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.transformed.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.transformed.expect
index dc2f303..06dd91e 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.transformed.expect
@@ -4,23 +4,24 @@
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
- constructor •(core::int x, {required core::String y = #C2}) → self::A
+ constructor •(core::int x, core::bool y, {required core::String z = #C2}) → self::A
: super core::Object::•()
;
constructor foo() → self::A
- : final core::String #t1 = "foo", this self::A::•(42, y: #t1)
+ : final core::int #t1 = 42, final core::String #t2 = "foo", this self::A::•(#t1, false, z: #t2)
;
- static factory bar(core::int x, {required core::String y = #C2}) → self::A
- return new self::A::•(x, y: y);
+ static factory bar(core::int x, core::bool y, {required core::String z = #C2}) → self::A
+ return new self::A::•(x, y, z: z);
}
class B extends self::A {
constructor •() → self::B
- : final core::String #t2 = "foo", super self::A::•(42, y: #t2)
+ : final core::int #t3 = 42, final core::String #t4 = "foo", super self::A::•(#t3, false, z: #t4)
;
}
static method test() → dynamic {
- new self::A::•(42, y: "bar");
- let final core::String #t3 = "bar" in new self::A::•(42, y: #t3);
+ new self::A::•(42, false, z: "bar");
+ let final core::int #t5 = 42 in let final core::String #t6 = "bar" in new self::A::•(#t5, false, z: #t6);
+ let final core::String #t7 = "bar" in new self::A::•(42, false, z: #t7);
}
static method main() → dynamic {}
@@ -30,5 +31,7 @@
}
Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:19:16 -> StringConstant("bar")
-Extra constant evaluation: evaluated: 10, effectively constant: 1
+Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:19:13 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:19:20 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///redirecting_constructor_initializers.dart:20:16 -> StringConstant("bar")
+Extra constant evaluation: evaluated: 18, effectively constant: 3