[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