diff --git a/src/dstr-binding/default/for-await-of-const.template b/src/dstr-binding/default/for-await-of-async-func-const.template
similarity index 95%
rename from src/dstr-binding/default/for-await-of-const.template
rename to src/dstr-binding/default/for-await-of-async-func-const.template
index f0d90221acecc569f911e56741cdb1582d8919a5..36a27da7848a50bd2cdc51ebb50493460b2f4096 100644
--- a/src/dstr-binding/default/for-await-of-const.template
+++ b/src/dstr-binding/default/for-await-of-async-func-const.template
@@ -1,7 +1,7 @@
 // Copyright (C) 2017 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-path: language/statements/for-await-of/dstr-const-
+path: language/statements/for-await-of/async-func-dstr-const-
 name: for-await-of statement
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
 features: [destructuring-binding, async-iteration]
diff --git a/src/dstr-binding/default/for-await-of-let.template b/src/dstr-binding/default/for-await-of-async-func-let.template
similarity index 96%
rename from src/dstr-binding/default/for-await-of-let.template
rename to src/dstr-binding/default/for-await-of-async-func-let.template
index 3fe5f1600b073765d575151fb523b7152b1d7e13..69d3a3c5c08cf7cca839a5bd631c827e6f29654e 100644
--- a/src/dstr-binding/default/for-await-of-let.template
+++ b/src/dstr-binding/default/for-await-of-async-func-let.template
@@ -1,7 +1,7 @@
 // Copyright (C) 2017 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-path: language/statements/for-await-of/dstr-let-
+path: language/statements/for-await-of/async-func-dstr-let-
 name: for-await-of statement
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
 features: [destructuring-binding, async-iteration]
@@ -45,6 +45,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/src/dstr-binding/default/for-await-of-var.template b/src/dstr-binding/default/for-await-of-async-func-var.template
similarity index 95%
rename from src/dstr-binding/default/for-await-of-var.template
rename to src/dstr-binding/default/for-await-of-async-func-var.template
index 7c97d614c1c9504844435a2cf8a06676e3f7ed32..eea5e60af59922b638f4a388182093994ec7a861 100644
--- a/src/dstr-binding/default/for-await-of-var.template
+++ b/src/dstr-binding/default/for-await-of-async-func-var.template
@@ -1,7 +1,7 @@
 // Copyright (C) 2017 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-path: language/statements/for-await-of/dstr-var-
+path: language/statements/for-await-of/async-func-dstr-var-
 name: for-await-of statement
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
 features: [destructuring-binding, async-iteration]
diff --git a/src/dstr-binding/default/for-await-of-async-gen-const.template b/src/dstr-binding/default/for-await-of-async-gen-const.template
new file mode 100644
index 0000000000000000000000000000000000000000..c3891e7814483aa130e69eac5493126e4f9889e0
--- /dev/null
+++ b/src/dstr-binding/default/for-await-of-async-gen-const.template
@@ -0,0 +1,51 @@
+// Copyright (C) 2017 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-await-of/async-gen-dstr-const-
+name: for-await-of statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const /*{ elems }*/ of [/*{ vals }*/]) {
+    /*{ body }*/
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/src/dstr-binding/default/for-await-of-async-gen-let.template b/src/dstr-binding/default/for-await-of-async-gen-let.template
new file mode 100644
index 0000000000000000000000000000000000000000..8a78365b0bd9a157da65beaae28ba4a5153032fa
--- /dev/null
+++ b/src/dstr-binding/default/for-await-of-async-gen-let.template
@@ -0,0 +1,52 @@
+// Copyright (C) 2017 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-await-of/async-gen-dstr-let-
+name: for-await-of statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let /*{ elems }*/ of [/*{ vals }*/]) {
+    /*{ body }*/
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/src/dstr-binding/default/for-await-of-async-gen-var.template b/src/dstr-binding/default/for-await-of-async-gen-var.template
new file mode 100644
index 0000000000000000000000000000000000000000..06e3d52b68e76e52ecb5d25895b928496218943c
--- /dev/null
+++ b/src/dstr-binding/default/for-await-of-async-gen-var.template
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-await-of/async-gen-dstr-var-
+name: for-await-of statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var /*{ elems }*/ of [/*{ vals }*/]) {
+    /*{ body }*/
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/dstr-const-ary-init-iter-close.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-close.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-init-iter-close.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-close.js
index 0cdcd7e4fce63121c43d039af4f12465fb550639..1039a28bab51b48d6fa564d540cf39edcc0bfdb5 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-init-iter-close.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-close.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-init-iter-close.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Iterator is closed when not exhausted by pattern evaluation (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-init-iter-no-close.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-no-close.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-init-iter-no-close.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-no-close.js
index 0e022a7e6a8f5d5c8208ba5ca3e11c887d51653e..05934a53a7766453197e2dd95e90a518f21d7ffe 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-init-iter-no-close.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-no-close.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-init-iter-no-close.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Iterator is not closed when exhausted by pattern evaluation (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-name-iter-val.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-name-iter-val.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-name-iter-val.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-name-iter-val.js
index c3e9393b59cb8b5aeed5f866f68a07a99af674df..21e7e1b867fc512c0582d32687ed77e115fd7a25 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-name-iter-val.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-name-iter-val.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-name-iter-val.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding with normal value iteration (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elem-init.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elem-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elem-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elem-init.js
index 38ba6617e68d78a1f9b5c7166bb14f6eeac16090..16be9ff47e1134391f4ea9651b57d4417c39c188 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elem-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elem-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elem-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elem-iter.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elem-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elem-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elem-iter.js
index 502dc0ea112b99a44d28d5f78c43b5f238b9789b..1d0248f4540b3e90a03f8bb6684e640689c2098c 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elem-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elem-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elem-iter.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elision-init.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elision-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elision-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elision-init.js
index 95e972500d6e072fa6daa321b2cf696e90136286..27125e719cc7c6dc2656fa78971120e1657038e6 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elision-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elision-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elision-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elision-iter.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elision-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elision-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elision-iter.js
index 5917a8434b6239f87c15f0a06735d8b69afd1167..10bb68aef7c434af3f6fddfee149a95bc3e7698c 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-elision-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-elision-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elision-iter.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-empty-init.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-empty-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-empty-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-empty-init.js
index a4f88149da6750a27afdc5dc4f597eebaee32a04..9b47d7a90584ea43b36285380a852e9d623736e7 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-empty-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-empty-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-empty-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-empty-iter.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-empty-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-empty-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-empty-iter.js
index 7ac1759172e619aa69a5653753bb32e8c1b8391b..22596321c446e7052e58e99942abc201c70ad801 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-empty-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-empty-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-empty-iter.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-rest-init.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-rest-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-rest-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-rest-init.js
index 158dc4badc5f5ed9e061999b955aad871fbea16a..cca37884a62ed8be456f5de66c4fe2e573bf37ec 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-rest-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-rest-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-rest-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-rest-iter.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-rest-iter.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-rest-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-rest-iter.js
index eaa606d29088ba10a78e5d7c3777dd6d5609d1f9..50b802cbfa9e52ccf62dbb5d447bce2d300f5bbb 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-ary-rest-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-ary-rest-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-rest-iter.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-exhausted.js
index 13d7a9c059b6f92d96c2ee7c93f75eaaffd65fa1..6388341fa4d28f43065d182362f418076a9e0582 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-exhausted.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Destructuring initializer with an exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
index acdfe55ecfb27e1ec90260c65c47a3ed132dba78..2f9f653e5f0ef83f3606b41173326aad39b5d362 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-arrow.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding does assign name to arrow functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
index cf6a3e92bfa1f0fc603d7692a6509b294553b0d2..ae1c89b290c55d62fc8c4485ba84ade3c6f6286a 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-class.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
index 723dbda52641e1ce739887d827789eb19c225ea8..cc2e149ac92ffff771e3662f930944a79f38c3da 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-cover.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding does assign name to "anonymous" functions "through" cover grammar (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
index b5bc52d4720a6345993c4534a834c8b404ad7269..ec2b84d22a3ee1bc81e711a1b2c7c2c11386de4d 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-fn.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
index 0589c024bcc5e0c687928b2f22dec654f785f554..bf129029747f8b427fffaa0536753b03cd3c4208 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-gen.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-hole.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-hole.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-hole.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-hole.js
index ef022dc7ad3ae4e6fdbe75dcabbdfc9c3437d656..938816b7cd5126070d6ebb822809dd8d7d2db0b3 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-hole.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-hole.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-hole.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Destructuring initializer with a "hole" (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-skipped.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-skipped.js
index 1663684dfffb0dcd6c80bd52f255c162172ba74d..568cdf2f2285e2546124f259c8996c4728d298f0 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-undef.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-undef.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-undef.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-undef.js
index 94a40e8564c7ca10eda63ac6f7d4be78fa52a7bb..1e545ce1471d33486131a6527cd88ec6fbeded8b 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-init-undef.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-undef.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-undef.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Destructuring initializer with an undefined value (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-complete.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-complete.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-complete.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-complete.js
index 3f7bbbbfc03f88bad4dfe900781a1e9e45d8917e..0ff192d53ad7c866a44afedd8b7236813646367d 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-complete.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-complete.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-complete.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding when value iteration completes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-done.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-done.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-done.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-done.js
index 3ccfb5370cc42e99bf277b53cd54dee7af3936e6..049e63251a69e087f5b26c8e234178e2f68e979c 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-done.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-done.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-done.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-val.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-val.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-val.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-val.js
index 5ee3f98f2a829ea8547755329ba8aedeae86c54c..2ccdfe926195037f48a17010f15fcc5b8258f673 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-id-iter-val.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-val.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-val.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-id-init.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-id-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-id-init.js
index 1748831f8934323361b361bc59c3537c3aa496d8..37c94784d4b73773e3964eb5df4b110dbd0cb248 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-id-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-id.js
index ed6c4c51cded282fd692e426819194b4540ef51e..eba2c68c338dbea5efdcfa427976a2ebb07f2a08 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-prop-id-init.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-prop-id-init.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-prop-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-prop-id-init.js
index 33543c42e52fea5c626d66811d8540eadf82c39b..b1e0c0aff680970bb3c356e98cf1a2db78f42dac 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-prop-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-prop-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-prop-id-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-prop-id.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-prop-id.js
index f0b2612674c630aaead051930a912c7065255000..c582aeb95362bd7ea55185929d557923d4765638 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elem-obj-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-obj-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-prop-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elision-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elision-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision-exhausted.js
index 090dd4c908b30e030f0d2efd08d0f138271ebf1e..8ed43c30f69329e8741cf2c3e50afa8211d55b62 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elision-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elision-exhausted.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Elision accepts exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elision.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision.js
index b88a7fafa5551f2982370b2d1927ace8ded42b09..e7c4abd2f8f761060470441454430cd3aa8db68a 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elision.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Elision advances iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-empty.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-empty.js
index 1a28eed4ff39b128439f67ecd4a12b5cf829018b..51878e73de7250c0b0c7c3a15dd5612707fb440f 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-empty.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: No iteration occurs for an "empty" array binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-elem.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-elem.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-elem.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-elem.js
index c0d24ba05ecb4b4bb73ee53420a8a5c54edaddf2..cce4949f231a5f041aef826d15a94108778e8e10 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-elem.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-elem.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-elem.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element containing an array BindingElementList pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-elision.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-elision.js
index fc9f36130109f807f2883ef61dba3c4519c529ae..6c0808323c554f73bd109c2e1c3187f8ba773697 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-elision.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element containing an elision (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-empty.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-empty.js
index b266f8c1ac0a54cf682ec37db7209fa9d79dc199..8ea667514b44c5e7e403b05ce9eebc6881d840af 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-empty.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element containing an "empty" array pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-rest.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-rest.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-rest.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-rest.js
index a268c26d481f5515385c7dad7715dbcf1e1a4307..5f1b66864dcfa6b8075f0aaa68c85e413bccc532 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-ary-rest.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-ary-rest.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-rest.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element containing a rest element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id-elision.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-elision.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-elision.js
index 5c642a14a562ba8bcb7b18c83d8aac47b45dffc8..9bba9ceb1058ec71da41aec04ee824baa0de466b 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id-elision.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element following elision elements (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-exhausted.js
index c61d284ae2fe257b3171ea825e92bf0600f1ced6..4a498c65db5898d3d612fea8c224d37d9b87a9e5 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id-exhausted.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: RestElement applied to an exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id.js
index 2b7a8941906651d015a96dcedb3fd95e55287e2b..d24261dc1245664cb99b55645bbbec9f42f940de 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Lone rest element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-ary.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-ary.js
index e576efe55d07d6634709c0b4489a778d298c728c..85f5a8519df8f72358977742841515653f00acb3 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-ary.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Reset element (nested array pattern) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-id.js
index 1d9a0d2e47d567daca3cc58b8f5b1735a2dbfbdb..bf9fb8329800d572e93ab5cbfaecb668299defe5 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Reset element (identifier) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-obj.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-obj.js
index f22b3fd5613fd3b1c99797452ff101daff88d06c..dd7ba69805ed7067d994085f9b16abbceb5fd53e 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-init-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-obj.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Reset element (nested object pattern) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-ary.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-ary.js
index 67a80bb5cd065de7570644562ab311ffe0c449e6..f73c4d25fcec0fb50261f135b031db2cdb09625d 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-ary.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element (array binding pattern) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-id.js
index 23e2aad643d8c227a6549fe23a9a286e3310dce1..a8a0f59bf38312103fc47320f746cdb595f220c0 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element (identifier) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-obj.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-obj.js
index d8a224f8f7e9e28dbb26d72c814af213da1804c9..b31b55d38d798c5cd8d6f6dc202726e1478be9c1 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-not-final-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-not-final-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-obj.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element (object binding pattern) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-obj-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-obj-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-id.js
index 35d51748858346f80ee8dc5d37d61835b20d79a3..14e59f0e24aa791b7bbdecfca494a8cad782c4a2 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-obj-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-obj-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element containing an object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-obj-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-prop-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-obj-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-prop-id.js
index 9070c7875e15895099b1c3a9f28fd234420caf17..862dd2c06abf20f47d614d4175f3f3bc74ec2135 100644
--- a/test/language/statements/for-await-of/dstr-const-ary-ptrn-rest-obj-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-obj-prop-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest element containing an object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-empty.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-empty.js
index 159c097a55e1712f36615cdcdde0226eb3247f1e..62bc00e91b65185fd4c9e7d2c6a9539b473ac240 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-empty.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: No property access occurs for an "empty" object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-arrow.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-arrow.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-arrow.js
index 3ac3212bdb5b2a30f58da03f0dd4afd7f33234c2..99088f354543b5968149b2a0a80f16d4cc2b53ad 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-arrow.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-arrow.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-arrow.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns `name` to arrow functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-class.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-class.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-class.js
index 66b8e5998e956b7c39e8a6fab44f641cf8387b0f..f7c7c82c26dd5e6dcbb996a094a0a5b91eb50e2e 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-class.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-class.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-class.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-cover.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-cover.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-cover.js
index 364d03b3707ca373db02c0be3b0aa683532e890b..2c5fd7d73b6e9a451502b8632a65ca227f37f7ff 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-cover.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-cover.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-cover.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" functions "through" cover grammar (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-fn.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-fn.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-fn.js
index 375c2431ee6535fbba31526c76f0faa22fd00577..760dd3eacdd204f99575338c76618d30cc29001a 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-fn.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-fn.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-fn.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-gen.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-gen.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-gen.js
index d30692d01221d717093ca0d697c85522aaa0d1f7..a66ab304dc34e120f23f5954af316e89ed126ce2 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-fn-name-gen.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-fn-name-gen.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-gen.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-skipped.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-skipped.js
index 33bf5847e1c32f1264efdb844853081b457546ea..409293ed9632032ac0011c55b485766a0ec98d1c 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-id-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-trailing-comma.js
index 26b8147d904075fffa42677e798c9ceb96c9432a..54209dcf2c3ed4cae1eddf0204cc4980223c81ec 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-id-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary-init.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary-init.js
index 24325bf2c8c572d1e78560a46d43a0ee5185541c..5e779f8a83fd9fb374032904bef4ec4a1e07102d 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Object binding pattern with "nested" array binding pattern using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary-trailing-comma.js
index 5832e641fcb4bdef6936cd623fc9e662cfed3256..299000840ee820b320e74a73946c7705819c1689 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary.js
index 70d919d4b65bcec63a5a446220a54c228e91684a..30d6faa24fc086c491ee336581c850986819de2f 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Object binding pattern with "nested" array binding pattern not using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init-skipped.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init-skipped.js
index 9ff7cf81c8c662937833f451cdf3003c9fe7de82..804ce530cd92b6e701f5a944685b10fdd1411d5b 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-init.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init.js
index 4d0b61013e1ac5cd5d93c59b5433241b346ca3f0..fc4df8f6a40fcdedbde0334fa4e761ad487fd388 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Binding as specified via property name, identifier, and initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-trailing-comma.js
index 9f95bacda70c70e3f860c5cab4984745b7a5fc69..241e45219ea99cda8abe5a229d1bf19c1ab6c6cd 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id.js
index 3b0b5b860d03de8195be54f409579000b8868743..d22a15158af373f3bb51ecc541102df011c315f3 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Binding as specified via property name and identifier (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-obj-init.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-obj-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-obj-init.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-obj-init.js
index 64dd06a2bcd0a273a5f37a2bd9e481ec188ae6da..a10efc4222ca1f966366aca70acc5685eced2184 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-obj-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-obj-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-obj-init.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Object binding pattern with "nested" object binding pattern using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-obj.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-obj.js
index 7ac86724b75002259bf8aa67f08f74464b87d0aa..40e3e79b047de87f9c4376644ec9dfd220706c8d 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-prop-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-obj.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Object binding pattern with "nested" object binding pattern not using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-getter.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-getter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-getter.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-getter.js
index a288c610f532fcb2a24105b8e6b09d6421372da0..efc8128d1035f312f75b24f4ac414006b4dc14bc 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-getter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-getter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-getter.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-nested-obj.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-nested-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-nested-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-nested-obj.js
index 9db1fc10d58385549a67537183f06fafc8542587..a961f0a9846e956727f187d010d6220e959e1cf9 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-nested-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-nested-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-nested-obj.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-obj-nested-rest.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-obj-nested-rest.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-obj-nested-rest.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-obj-nested-rest.js
index 16184659ee81223aa339e49aa895fd932b7a5346..112e6cefb938efe64979908b65d5f9fdef70134f 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-obj-nested-rest.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-obj-nested-rest.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-obj-own-property.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-obj-own-property.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-obj-own-property.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-obj-own-property.js
index 31fd5f85954eaed7189f8066b8d3f7bb4dd8047b..f9b6490be41994c7b88926e99bed86c58b310352 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-obj-own-property.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-obj-own-property.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-obj-own-property.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest object contains just soruce object's own properties (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-skip-non-enumerable.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-skip-non-enumerable.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-skip-non-enumerable.js
index bee075b8d0a931599b8a723d3f2fc715de415c9f..09c0f294fe2e3f482950c778b50e3d36f6ed0cbe 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-skip-non-enumerable.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-skip-non-enumerable.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest object doesn't contain non-enumerable properties (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-val-obj.js b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-val-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-val-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-val-obj.js
index 1ddb8d01d9389d15e29a30ae8e7f9f19c01287ff..d12dda7cd00a570ecfca688b915f47a39d9a2598 100644
--- a/test/language/statements/for-await-of/dstr-const-obj-ptrn-rest-val-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-const-obj-ptrn-rest-val-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-val-obj.case
-// - src/dstr-binding/default/for-await-of-const.template
+// - src/dstr-binding/default/for-await-of-async-func-const.template
 /*---
 description: Rest object contains just unextracted data (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-let-ary-init-iter-close.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-init-iter-close.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-init-iter-close.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-init-iter-close.js
index d3bc7e676ef6a738f6f3561f6637731fdf8239c3..65a17c851ef747175c2205f9dce6703025a5494c 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-init-iter-close.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-init-iter-close.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-init-iter-close.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Iterator is closed when not exhausted by pattern evaluation (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -68,6 +68,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-init-iter-no-close.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-init-iter-no-close.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-init-iter-no-close.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-init-iter-no-close.js
index 780078328bcc980cb38e807fcd661f524a1fa19e..fe3e33c70b743f3d99a9b9e8efbf1027e78a9e19 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-init-iter-no-close.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-init-iter-no-close.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-init-iter-no-close.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Iterator is not closed when exhausted by pattern evaluation (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -68,6 +68,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-name-iter-val.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-name-iter-val.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-name-iter-val.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-name-iter-val.js
index 29f3d5d4c747dd24b876188cb7300aa31ff57229..686979fa0bc2b352b5fb261330767cd0dc402255 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-name-iter-val.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-name-iter-val.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-name-iter-val.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding with normal value iteration (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -67,6 +67,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elem-init.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elem-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elem-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elem-init.js
index a796fe5b33718742d92f10b04e46c2856353ea0d..1c3773d58d60652461a937683e705cc55c793edb 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elem-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elem-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elem-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elem-iter.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elem-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elem-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elem-iter.js
index d909bf2ea57567c325acabb2bfddd3354a074bfb..b5b2746ad90e28d557e767fa0bf5231014bfe5d2 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elem-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elem-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elem-iter.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -60,6 +60,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elision-init.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elision-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elision-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elision-init.js
index c59dadf52d242d4549f6ed370f443f8b2f459262..11732c800475b4347aa80b00a273d67e9f6ebf5f 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elision-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elision-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elision-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -66,6 +66,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elision-iter.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elision-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elision-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elision-iter.js
index 511ea928b8e37a437f34d681d1e91714a3ea115c..6be43c50f4d771d0e33d99c7810f035a3148dd0a 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-elision-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-elision-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elision-iter.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -63,6 +63,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-empty-init.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-empty-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-empty-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-empty-init.js
index a9529ac92ab45a3360f33047174d7a85b7f5e08d..7967b9e34d19ccfdfe31fdd0d64bf540fa33df8e 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-empty-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-empty-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-empty-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -61,6 +61,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-empty-iter.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-empty-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-empty-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-empty-iter.js
index ff238e9b25560392580215f4c3f0ae49245ae56d..c9a1e71a0c0894daf89f286b715a33c00952e602 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-empty-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-empty-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-empty-iter.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-rest-init.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-rest-init.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-rest-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-rest-init.js
index 7fb69918399b88270db49ce38f72675671b15128..dd9054dc967d1ca64e8df92405513d3b61942903 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-rest-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-rest-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-rest-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -63,6 +63,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-rest-iter.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-rest-iter.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-rest-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-rest-iter.js
index c759223d08055dee335e55bf52ddf1fbcb962cb4..4d97da552581a81b02944ce8e97b985337e23ee7 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-ary-rest-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-ary-rest-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-rest-iter.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -66,6 +66,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-exhausted.js
index 8c017d35533dd953569d6dc3e8b3b7d7920adacf..03609220d2e6aea15a1dc377c4bb80c63ca98f5e 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-exhausted.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Destructuring initializer with an exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -58,6 +58,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
index 18bbd62d9dd8008e1797f010155c8992e38bbbd0..ad8c744c16f59f985bca743cba73144d42416af3 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-arrow.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding does assign name to arrow functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
index 587debe48d49443ddcbe6256834eed8c7dd96dec..e67a7b1f383417b77e3c62a04e55ede28a60aaa7 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-class.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -61,6 +61,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
index 07fb4a8bff8a61ec94441909537cd86c879bf793..446d4ccbd18a1db65118d065b24e5adf4a999c53 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-cover.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding does assign name to "anonymous" functions "through" cover grammar (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -60,6 +60,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
index f367c0a3e79b587a3fa2d37e207c01e772dfe8ce..47d1d0761451e41d7afd880d29aa1f704f74b242 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-fn.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -60,6 +60,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
index e577679d93ee52271ccf578c9a5860c1b545f4d3..48e27656d62cfe9fac32c038f268c5ab5b01aacc 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-gen.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -60,6 +60,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-hole.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-hole.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-hole.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-hole.js
index e8dbc858bc2bb7793bd3205aaf383d49abc7d0d5..6dc9674a0ec8938269dd0cccf590805f3387257c 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-hole.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-hole.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-hole.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Destructuring initializer with a "hole" (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-skipped.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-skipped.js
index 2294e7e657fa9e508798cc690d88c6b49cf19a10..0e91fb032cdd1dc4a76d7b608ef814c9d3d47194 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -63,6 +63,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-undef.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-undef.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-undef.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-undef.js
index f4b17d0e2ac123fdeb6ade210172b8a220f5155a..3961d10cde294d240bb795b0d2030934be4411ab 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-init-undef.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-undef.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-undef.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Destructuring initializer with an undefined value (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -57,6 +57,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-complete.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-complete.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-complete.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-complete.js
index 7ad43e8ff81ea01e8232b2c5424af63e4bc4f5a0..7733415ac62e3b0a13f1fccf7e48fd8dcaee462d 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-complete.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-complete.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-complete.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding when value iteration completes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -61,6 +61,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-done.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-done.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-done.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-done.js
index 4ed38c0b6359e05bc227b4c80ab710e657f9f99b..ad1d3aeb9b349b134590fbcd1c5bc0ad2d7e46c8 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-done.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-done.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-done.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -56,6 +56,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-val.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-val.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-val.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-val.js
index be5214f6339a611715ca3833fb25b56347d7da13..f32886c008e72c728775b547137a3210af5f5122 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-id-iter-val.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-val.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-val.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -67,6 +67,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-id-init.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-id-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-id-init.js
index c6e3b192fe52ef5f1d50fa7c88c1c4929fba3c54..260ce8e0cb02b268d9b941b289d2520dddbe276c 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-id-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-id.js
index 2c9648b92ab34e2674592ad325fa575d3c98ec89..31893cc7e9f4421c21a5508c125c062f508d4567 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-prop-id-init.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-prop-id-init.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-prop-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-prop-id-init.js
index 1a7369dda30ca3551dd0d9d2a4f64b516a6bfeb2..d2d584edea1cb1115f589dca4efac0b794c37feb 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-prop-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-prop-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-prop-id-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -69,6 +69,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-prop-id.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-prop-id.js
index a02dcb859fc0ce47a0789069178981b4806f2611..570cd6cc1a74d6aea09f18923853844091e67389 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elem-obj-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-obj-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-prop-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -69,6 +69,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elision-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elision-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision-exhausted.js
index 3bb106af885de596f3051d3450802038db68c325..077aa7036c24754ae21c911029eb505923c24db8 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elision-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elision-exhausted.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Elision accepts exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -64,6 +64,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elision.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision.js
index 2c762c81ed3a9e56e7fdbf8df3bcda837a1df7fe..b54efb1c50ec12177a0515e0e7bec631fede069b 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elision.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Elision advances iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -73,6 +73,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-empty.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-empty.js
index db5621fae6f5368d54e780c277733dd84bb4c835..1ad42240dcc11eac291196b6d54c5560d4e011c3 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-empty.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: No iteration occurs for an "empty" array binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -56,6 +56,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-elem.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-elem.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-elem.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-elem.js
index 0b9fe75145b2523cd212f32771c0d5a2e2f26570..1b565c77c506ff9f08d01a609df07cbf2da0bbf2 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-elem.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-elem.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-elem.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element containing an array BindingElementList pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -80,6 +80,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-elision.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-elision.js
index d83f6ce3b126bace8e731ba78736df3e02fed28b..efadfd86850284ff0cbad83c20e2b5302256c6b4 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-elision.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element containing an elision (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -86,6 +86,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-empty.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-empty.js
index e6c16d797a05b6928a1955df1ced1f93a06919c2..57545f9c02fc14f0bde5e25fb5d38c24d7e3186e 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-empty.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element containing an "empty" array pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -69,6 +69,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-rest.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-rest.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-rest.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-rest.js
index 1f108ef5f5a7643b1ae1745ad66c67fffeea899a..90392ac3e7f64a1032c53d3bee34e4b61e30d3b4 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-ary-rest.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-ary-rest.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-rest.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element containing a rest element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -65,6 +65,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id-elision.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-elision.js
index a5dbcf4f22debeadb11e92ac40ee059a91d8c471..305439c8e111ab977b4021dbc10c32f90636c36c 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id-elision.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element following elision elements (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -61,6 +61,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-exhausted.js
index b079deb33ab97bf5d3e8dabf074feefa49cc55f4..04376d28d782038f611667f0ef221e928efd6602 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id-exhausted.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: RestElement applied to an exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -57,6 +57,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id.js
index a80b553869921ff4fee7edab59806b4733e88fe7..23237699d884c81794c18393a2af6361ad554222 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Lone rest element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -58,6 +58,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-ary.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-ary.js
index 4c55b2a0cc7b4dc7491a7e5f7281907c4f2a1430..b0bd6fad16ece761510d580c526483462196b678 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-ary.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Reset element (nested array pattern) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-id.js
index cadd61f28943d9fc84f3d67be7d3384205b5e0b8..513a53549d37fa4e2c8e45997e45ec82bebcddbe 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Reset element (identifier) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-obj.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-obj.js
index 59778af65ab880526ccad32e4ee738236ecb6184..aafad9ef7ef001119c94294ca1d18b65554e6ea2 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-init-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-init-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-obj.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Reset element (nested object pattern) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-ary.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-ary.js
index bc8943cb26b991d26fab892bf5d885fc1676e296..271dd8ebf9613e801c7425b5f3096ae7f7ae779d 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-ary.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element (array binding pattern) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-id.js
index 23e75d31d35b229818a5e7c1e8648d5a622c5206..f0693f856fbea7b38b79f702b2921e7907965b91 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element (identifier) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-obj.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-obj.js
index 2a3103c1cb01947d9b6cf674312d214710b8d3f5..61caced33217fe32e371ed60e7f2d00b58fe73b5 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-not-final-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-not-final-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-obj.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element (object binding pattern) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -54,6 +54,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-obj-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-obj-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-id.js
index d9c4170ca8f600fc2feb5e6aa2c1e07586de2e43..ec19f4c5e01a8621cd09a51a0acf8391e58defb4 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-obj-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-obj-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element containing an object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -58,6 +58,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-obj-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-prop-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-obj-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-prop-id.js
index 989ecd1c9367e63710f40faf30845fab24b6e155..b910e4c33278b671ff5ddcbbaa36a8c0280909f9 100644
--- a/test/language/statements/for-await-of/dstr-let-ary-ptrn-rest-obj-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-obj-prop-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest element containing an object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -66,6 +66,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-empty.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-empty.js
index 72ba298d84167e076646781b61ac54b64583fba2..0048005a4e3c096bf4acaf7683ea3eabb0a22d7c 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-empty.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: No property access occurs for an "empty" object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -57,6 +57,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-arrow.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-arrow.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-arrow.js
index fbd3d2a997c7f255dd4d725f59a0f718f177a1f5..be2ab64e07e5cdb926d7f1aab19df9d8da952189 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-arrow.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-arrow.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-arrow.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns `name` to arrow functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -58,6 +58,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-class.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-class.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-class.js
index f453a1e71d1d87b402b17990d077520a9b611240..ec3dcd5d0adb8fdbdbe364f1b8d38d08eed1bdc1 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-class.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-class.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-class.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -60,6 +60,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-cover.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-cover.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-cover.js
index 65153fcb20f802395acf0c33ea64e4cd4c018c87..a674642109a9a5bfbcd56c26e1bd652193220f3b 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-cover.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-cover.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-cover.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" functions "through" cover grammar (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-fn.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-fn.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-fn.js
index 4f1d903ff06c510c917b575c50f18db9604382d5..5ee8ee997972ba2aa992f681aa4c10087bd4a0b7 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-fn.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-fn.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-fn.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-gen.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-gen.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-gen.js
index 0a9a6a303cdd76902a2dfbbc7acf2771f5416c2a..eacf63dd0948c631552e61bf90008b4b1d672c20 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-fn-name-gen.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-fn-name-gen.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-gen.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-skipped.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-skipped.js
index 9666799cf0f849469b25289e37512f702de82c62..bebeb0d385915d5e9ab22e8bcc5b8843b5f035a0 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -62,6 +62,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-id-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-trailing-comma.js
index 4dc81382fdd6fbe13b8cb91746764ec069368cd2..b51e211dcf0fd343fded93010688a598bc83a46f 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-id-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -52,6 +52,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary-init.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary-init.js
index 1a157b4afe5d5741a2e3c83edf12ab53cbb6b884..5a4968e0841963e388735e780aad5f91503d2a7d 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Object binding pattern with "nested" array binding pattern using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -61,6 +61,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary-trailing-comma.js
index 82111fe780835ad12ada6d01fb45335457b1189c..58af61065a11db0ed629c96d650dbc5d6a1d5a61 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -52,6 +52,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary.js
index 978c19d6b2024da19a2cf90587a04905ee5b4223..0ce5ee27608e9b87d7764f13f19bc955fa275c57 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Object binding pattern with "nested" array binding pattern not using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init-skipped.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init-skipped.js
index 113cf7128011357ac0f078b4c3bc86d42b791bdc..d6919142860c957279b0ccecfa656ada03d59743 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -74,6 +74,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-init.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init.js
index b05bbc4ed50af28cef378c02b526058b85ceee8a..80645ce537e12ab4c9bf9f6bd1eba92f66d32f0f 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Binding as specified via property name, identifier, and initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -55,6 +55,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-trailing-comma.js
index 5be32da2b29468bf02dc18597925d8c7eb5f3c29..0999eee055317980ff4acb7b3aff00e9b408249b 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -56,6 +56,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id.js
index 50997f53520a625ecf0b11b511021cb68268648f..68e343c609e017511188770cb586693f775cf269 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Binding as specified via property name and identifier (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -55,6 +55,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-obj-init.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-obj-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-obj-init.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-obj-init.js
index 2f5397c3855a439d19a0072b08db1f089931312c..a5daebc83921a4369b215de976be37b9a4b5d431 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-obj-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-obj-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-obj-init.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Object binding pattern with "nested" object binding pattern using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -61,6 +61,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-obj.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-obj.js
index 46c3e0aa4c0452d39d99090e8a806149a2a1854a..dd0ec4ac4306907291abb0978859cd8912acf772 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-prop-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-obj.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Object binding pattern with "nested" object binding pattern not using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-getter.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-getter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-getter.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-getter.js
index 69fbb9e64f305c8cf9c7df4b70a842608d7fe8f0..5eeb1d4be985c5766c018d8b580fe17150773b55 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-getter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-getter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-getter.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -53,6 +53,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-nested-obj.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-nested-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-nested-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-nested-obj.js
index d4b0f33fdfb1fc2af5466cb5ac9117a046600c07..b16d6ca5f6be48089947414db8add6ea77bb7569 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-nested-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-nested-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-nested-obj.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -50,6 +50,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-obj-nested-rest.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-obj-nested-rest.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-obj-nested-rest.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-obj-nested-rest.js
index 8783dad6613175a468543e3963314f7fb43b56f0..4d884b02c458ce884c859404d31258a8102bd2c7 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-obj-nested-rest.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-obj-nested-rest.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -60,6 +60,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-obj-own-property.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-obj-own-property.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-obj-own-property.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-obj-own-property.js
index 0c417b5f9d5f792b1f7a07f8aa9fae871c737ee7..9c6bb2a8a25fb52fdfeebfa5a580eca2cbe2331f 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-obj-own-property.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-obj-own-property.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-obj-own-property.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest object contains just soruce object's own properties (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -51,6 +51,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-skip-non-enumerable.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-skip-non-enumerable.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-skip-non-enumerable.js
index 90835219ce1e44ab1df68c3e81c4212adbd197ef..5629ac05373d761f7ad91ced13108f62b99da17f 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-skip-non-enumerable.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-skip-non-enumerable.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest object doesn't contain non-enumerable properties (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -59,6 +59,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-val-obj.js b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-val-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-val-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-val-obj.js
index c418f18f52c05df4b362a7a160ff15929db39ee0..169ee01dc34b5beb14647d675923e80c0793bec2 100644
--- a/test/language/statements/for-await-of/dstr-let-obj-ptrn-rest-val-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-let-obj-ptrn-rest-val-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-val-obj.case
-// - src/dstr-binding/default/for-await-of-let.template
+// - src/dstr-binding/default/for-await-of-async-func-let.template
 /*---
 description: Rest object contains just unextracted data (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
@@ -58,6 +58,7 @@ async function fn() {
     iterCount += 1;
   }
 }
+
 fn()
   .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
   .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/dstr-var-ary-init-iter-close.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-init-iter-close.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-init-iter-close.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-init-iter-close.js
index 83f9d62556905d7d2247d5d65de5fc2643e70bc1..42e0ea537b03a2253a91d8d55186a879924b92a6 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-init-iter-close.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-init-iter-close.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-init-iter-close.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Iterator is closed when not exhausted by pattern evaluation (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-init-iter-no-close.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-init-iter-no-close.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-init-iter-no-close.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-init-iter-no-close.js
index 2db7ca1aa6f5e61cff1a8302b2c3da92dfcece64..35a8571acc71665ec7eefdf65ed7224409bc830c 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-init-iter-no-close.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-init-iter-no-close.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-init-iter-no-close.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Iterator is not closed when exhausted by pattern evaluation (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-name-iter-val.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-name-iter-val.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-name-iter-val.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-name-iter-val.js
index e85f8c7e86f4a4a2c6bc72ba972bff1318e0bbf3..014c9318d125f07aa11de866d0a5b994b4ddd925 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-name-iter-val.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-name-iter-val.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-name-iter-val.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding with normal value iteration (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elem-init.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elem-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elem-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elem-init.js
index 1e89a5dac421498c6bda1ec0053e16c9a737806c..d5d53136851d9e53cc8d4eab67af35d0df96f504 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elem-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elem-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elem-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elem-iter.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elem-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elem-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elem-iter.js
index 10f190ffa40526bd8dca332a25b0f89fff683db5..114baede8481d78d7d527646924b589c1b6a9aba 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elem-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elem-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elem-iter.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elision-init.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elision-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elision-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elision-init.js
index b9950e5cb2e8803e0ca50640a4cf620ae74a000e..461be8bb6ad6274a942a422826e7e4c0a0e16fa6 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elision-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elision-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elision-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elision-iter.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elision-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elision-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elision-iter.js
index 5469c56290399220410c1023141a62a97fb76346..002f7e19dae11f839e7ea93377229ea3654a78bc 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-elision-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-elision-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-elision-iter.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-empty-init.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-empty-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-empty-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-empty-init.js
index 6004ceba8722b18e0b0ccd7f9d7ec8718802be84..01619e2c83baf181102ffed04953dfaacfc3de32 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-empty-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-empty-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-empty-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-empty-iter.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-empty-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-empty-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-empty-iter.js
index f2e74a17bd1d0d32085e94ca41738e8a1e7b27ff..f22768d953afea254d8d9913ab569ef17b590f24 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-empty-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-empty-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-empty-iter.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-rest-init.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-rest-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-rest-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-rest-init.js
index 0287efdd56c524043c15b4d1326bd016f6049974..b324d69cd19041c2a2c3a271d8bffc6e2f7a17b2 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-rest-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-rest-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-rest-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-rest-iter.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-rest-iter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-rest-iter.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-rest-iter.js
index cfbde9bed6251fa6148518b5591bbeaa5e6ee945..3e1919229dfe52cfb88bbab0f43a36deb7b2c0fe 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-ary-rest-iter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-ary-rest-iter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-ary-rest-iter.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-exhausted.js
index 300332b09375a5b301d2554ffa58077aa1f457e2..06a19128ab393ba31a180f74891a7d715e629f18 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-exhausted.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Destructuring initializer with an exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
index 82bc9f2562c71b430bbb2a21eca4ff46a4697a6e..29de904b1939d5c232b5e7836ec5b85f7140f3c1 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-arrow.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding does assign name to arrow functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
index cc1ec30d4257dc40cbb8015cc24737c83e606c59..ceec52ac8b48089d915aada65ed43e05bcaec72d 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-class.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
index 15042810494820c91a50f3d5daee25bdc49f2941..33cac5c111a2b5ab3c8021198c1c32ebd1dfb6e3 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-cover.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding does assign name to "anonymous" functions "through" cover grammar (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
index 583140e4e401cbe3e9fc74ee269244e0db382ef9..c793a212bce027b67ac4328cde9fc20e318fd6e9 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-fn.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
index b04fe71b5df772197fc45cfdc66f206070c55333..147492b25db82563b225254198453e76b0e8ae24 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-gen.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-hole.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-hole.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-hole.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-hole.js
index b593841354491c45b935f6f33ddc2bbe20323e74..18ad11001ea4d9cac2ca0d16aaca6309769ef241 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-hole.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-hole.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-hole.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Destructuring initializer with a "hole" (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-skipped.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-skipped.js
index c6a6f37fc8c3b6996fd4b47c6ba3baa37f1e2520..4be9d9e1ff9c082675c112f7def10713a5b45f45 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-undef.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-undef.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-undef.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-undef.js
index 4a84ac0a91a6125a134c1ff9b8e4a77851c84f2a..d367cdb4012a1f37f80ba423685f4982aaab5492 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-init-undef.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-undef.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-init-undef.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Destructuring initializer with an undefined value (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-complete.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-complete.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-complete.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-complete.js
index 6d887beda478c383bca730ad4314183279284766..9efc5a99f173d292adae000d92e718049b6bb3de 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-complete.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-complete.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-complete.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding when value iteration completes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-done.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-done.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-done.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-done.js
index 8c97c0ec1a47f2686372f2bff27bcf6b23d0b4f9..213374f332753783beb01407715a8d9d59bbf8a5 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-done.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-done.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-done.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-val.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-val.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-val.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-val.js
index 7c67a0c4f48a1bbbba4d724d0cae67ec3d2d9a0b..853ad537205818ddfa83601fae2e63411554ce9c 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-id-iter-val.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-val.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-id-iter-val.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-id-init.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-id-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-id-init.js
index 6ce4e84c61e8f40a84c0b7416f1211d74fb17964..7f9ea083d505779fad17c2a6c68640d927722f02 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-id-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-id.js
index 0d5d04de7e2d4f0a0e10e44ffd5153cd42ceaa90..c55e46a4ee9ce621b281edc6da6e437c1413cc4a 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-prop-id-init.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-prop-id-init.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-prop-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-prop-id-init.js
index 27372cdf9dd50a3ae0d4ff7ff4f9d634ec404a1b..519fb8c2bd135c1d38b58f500760c750da85a789 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-prop-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-prop-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-prop-id-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-prop-id.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-prop-id.js
index 4d9c70d2f217eac25472b3a4a2b182b2b8fcdc5b..53dc964213d84fcd43b3452c0123e7a3ee15d757 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elem-obj-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-obj-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elem-obj-prop-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elision-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elision-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-exhausted.js
index cae0ba72df54def1f776ec4abbb285c4433cf752..1227067048b68f410d6ea8842662988bf7423288 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elision-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elision-exhausted.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Elision accepts exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elision.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision.js
index aa36cecdadde63d63dcd48ac901dece8ce82fe32..eb8dd07ae27745de2dfbaaf2db97c85ff1b745cb 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-elision.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Elision advances iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-empty.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-empty.js
index f06399c2806b9c5f35791010f5fb47318ca96f07..a8dd317c500d75c11a5d7764757352244a4f09f4 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-empty.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: No iteration occurs for an "empty" array binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-elem.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-elem.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-elem.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-elem.js
index 55a2061f7ea4928b15438a818067ad8317402b60..d25d1758b092bd5f4905789e5652e2600d37685a 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-elem.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-elem.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-elem.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element containing an array BindingElementList pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-elision.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-elision.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-elision.js
index 6709c68f0247782cd88776264a021c47230565ad..04b011f03b37b228ad280a43e5d7d982dc9b912c 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-elision.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element containing an elision (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-empty.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-empty.js
index ad91032d34c8883e996434fe5ae0b843b6d23558..b2d9df529cfa583348264f2a431121f9fbbd202b 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-empty.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element containing an "empty" array pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-rest.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-rest.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-rest.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-rest.js
index 278982149addb6a5757a9e794a3a1b541fc03e06..8abe632a90c8e2291ea9fa2e41957d032edf3bcf 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-ary-rest.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-ary-rest.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-ary-rest.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element containing a rest element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id-elision.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-elision.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id-elision.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-elision.js
index 90343972776708456a910bf97bd840172a1fb7b5..3341c8dedb506786b2c89b5bfaea5475dca70eee 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id-elision.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-elision.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id-elision.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element following elision elements (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id-exhausted.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-exhausted.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id-exhausted.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-exhausted.js
index 3f137a3b1da1898aebc190d372289b371ee794d4..a6e1c5066d9a1acba31e68d502625da36dbf62ce 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id-exhausted.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-exhausted.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id-exhausted.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: RestElement applied to an exhausted iterator (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id.js
index dc61d9c858e12c028af17ac0962222c0e6ae878a..a5c5f7263cbd05a885f3b684cd20177641374266 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Lone rest element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-ary.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-ary.js
index 373064f3e5cacc9669841a0a74cfddae3ef3f0b0..0a8ab48f569faeac9d2bf72b031b436924faa840 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-ary.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Reset element (nested array pattern) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-id.js
index 62ea35ad70cecd00abda333b43ee4c024712842b..229e5dc5f7d58c43ae8c15867f66340767a7a07c 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Reset element (identifier) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-obj.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-obj.js
index 329f588bcb5727648b98cbc53f7346809422ddc2..5f6c7c088655365ff4e57f99303bb144a083b604 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-init-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-init-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-init-obj.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Reset element (nested object pattern) does not support initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-ary.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-ary.js
index 6fe23938a0839203f700c7f6e255785ca1f57bdb..f62a7301ac2d81fbcf48fc115f26626e2d71a5cc 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-ary.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element (array binding pattern) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-id.js
index cd554a96e3c2eb3f7d590f47971e4953178553d5..d084388e14243c51fcf8434516de044e6a3f853b 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element (identifier) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-obj.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-obj.js
index 7694f4dfff9cb3ebccd8e1f7d0cfb3c56eac6769..7046450d1a1877d7093fc642fbd365c9a57c3744 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-not-final-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-not-final-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-not-final-obj.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element (object binding pattern) may not be followed by any element (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-obj-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-obj-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-id.js
index 74ef0ae970a5693285083baba510bc9d49aafb58..124af8cfbb852b2e1dc1b69abcaf1dd2111b1d95 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-obj-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-obj-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element containing an object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-obj-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-prop-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-obj-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-prop-id.js
index f90232560d7f2831137d19182c95741c8c0927d7..bc7ae32b47d624be4af1012054b66b216eb03c12 100644
--- a/test/language/statements/for-await-of/dstr-var-ary-ptrn-rest-obj-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/ary-ptrn-rest-obj-prop-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest element containing an object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-empty.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-empty.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-empty.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-empty.js
index 016cad85aa48b9c4e33872e75e7c9f0bec4cd1e2..1a9f8902988d96239a638999f314f2cb933181c4 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-empty.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-empty.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-empty.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: No property access occurs for an "empty" object binding pattern (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-arrow.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-arrow.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-arrow.js
index 12d10444cf33b4767f98cd44579df04939bf2c4c..44bbc40447b817094e45dbbcd2e78e227b54ea9b 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-arrow.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-arrow.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-arrow.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns `name` to arrow functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-class.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-class.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-class.js
index 32cfb32fa6e0c452fda2691d1142a485c3a44451..fd17f68212dffb3a95e05ee9210974c29d01e38b 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-class.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-class.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-class.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-cover.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-cover.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-cover.js
index cd939d78bbc310b7650f1ec5a49772426d02d1fd..69f54d6485ccdd7abd490c4ea904628a91a5cf5e 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-cover.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-cover.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-cover.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns `name` to "anonymous" functions "through" cover grammar (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-fn.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-fn.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-fn.js
index 4760fff9b46b1c9585dd86c1e203ef13a9e01349..2d5faa8ab5b309429229a75bdfaec1627acf12ae 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-fn.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-fn.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-fn.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-gen.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-gen.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-gen.js
index 2753014bc143eebfe412ee8cfc694b004dd2abfe..8cd86a1a4c630fd4c3cca368e5b98a54697846f7 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-fn-name-gen.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-fn-name-gen.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-fn-name-gen.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-skipped.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-skipped.js
index 7390d76c639322aee838fa4e9fac6526e0b3e7da..dfc8e256e34e2f327859bfc6b71d51e3dbcc1445 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-trailing-comma.js
similarity index 95%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-id-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-trailing-comma.js
index 78c420c14a037a9189b5db63c83e94f7e6361ae5..70de521cec933438daf325222fd064ba44ea3781 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-id-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-id-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary-init.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary-init.js
index be19e5790871536fb2f4e738674a5820aefdee55..11d0357b635e91a32f0dd4283b721a23588ea9be 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Object binding pattern with "nested" array binding pattern using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary-trailing-comma.js
similarity index 95%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary-trailing-comma.js
index 372cdf5f4a553a12c1fe44639aed97cbe34b6d6a..e39dab9586dbd048aa612e9152584535b6652735 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary.js
index 327f4e20d01eccc137fdf3a2618aea79b6fbad02..818e1ed546201c12ac3f84f6fbad1effd8c23206 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-ary.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-ary.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-ary.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Object binding pattern with "nested" array binding pattern not using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-init-skipped.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init-skipped.js
similarity index 97%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-init-skipped.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init-skipped.js
index ff715cb12e330d7b471c87a89ed6adba3e85af79..009a0f872f158810982ab28b91e070d675467639 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-init-skipped.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init-skipped.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-init-skipped.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-init.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init.js
index 506e774d54ec75b389ba3f738a0010ddf14ae3e0..eb784bac85682a72cf0b44c4b6e50a1b53e90400 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Binding as specified via property name, identifier, and initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-trailing-comma.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-trailing-comma.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-trailing-comma.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-trailing-comma.js
index 85de17cabc68934fa81b6e80d371014d249df1c8..ea4ac044e7d25eee0ac86b637be1d531eeb1ff79 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id-trailing-comma.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-trailing-comma.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id-trailing-comma.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id.js
index 3c6327c90f24cd7b65957dee38acd505797d9ac7..57014f7f74bf0189e47888e25b7cc0542c2809fa 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-id.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-id.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Binding as specified via property name and identifier (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-obj-init.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-obj-init.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-obj-init.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-obj-init.js
index 6646adb426ea21da27ce9bede2844517e6863ced..2f942a0547e6f667a9e5e58808977248284fd943 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-obj-init.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-obj-init.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-obj-init.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Object binding pattern with "nested" object binding pattern using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-obj.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-obj.js
index 2c3c0cea22fa71d3600b14092582c0b0d3ae41aa..0899221246c3de11c7fb65bc63e932cf0d34eb7f 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-prop-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-prop-obj.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Object binding pattern with "nested" object binding pattern not using initializer (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-getter.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-getter.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-getter.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-getter.js
index a052d41bd78689c99c5bcdb3719832f1fe02de3d..d87fd221df978996b114625426f38c733eef5324 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-getter.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-getter.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-getter.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-nested-obj.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-nested-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-nested-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-nested-obj.js
index 869599f64469a02400fc7d0b1f215d9c740752a6..5301d26f8b538b9b3b7e10c84dc9cba3390a840f 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-nested-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-nested-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-nested-obj.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-obj-nested-rest.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-obj-nested-rest.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-obj-nested-rest.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-obj-nested-rest.js
index bb13ba95a5bccf04b9dc6d139896882c5c8d641a..941a73902e20a8f0eee7daa0c6659afb4ce46753 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-obj-nested-rest.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-obj-nested-rest.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-obj-own-property.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-obj-own-property.js
similarity index 95%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-obj-own-property.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-obj-own-property.js
index 753d9283f283bba0d0033987a5afe7cd9400b7dc..ba95beb9934a3082ac4201bb72b70314be259adc 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-obj-own-property.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-obj-own-property.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-obj-own-property.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest object contains just soruce object's own properties (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-skip-non-enumerable.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-skip-non-enumerable.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-skip-non-enumerable.js
index 152d00280a6dd627b25dbc6d10c55d88fc3d5881..1726337dba06e96ab9daafa89b9d5eeb7f6b4752 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-skip-non-enumerable.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-skip-non-enumerable.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest object doesn't contain non-enumerable properties (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-val-obj.js b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-val-obj.js
similarity index 96%
rename from test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-val-obj.js
rename to test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-val-obj.js
index cc58bcca68e56cc831eff1070a649eeae73d4914..cf08fbf5766757e15def1e5a3ff10b3eb117d95e 100644
--- a/test/language/statements/for-await-of/dstr-var-obj-ptrn-rest-val-obj.js
+++ b/test/language/statements/for-await-of/async-func-dstr-var-obj-ptrn-rest-val-obj.js
@@ -1,6 +1,6 @@
 // This file was procedurally generated from the following sources:
 // - src/dstr-binding/obj-ptrn-rest-val-obj.case
-// - src/dstr-binding/default/for-await-of-var.template
+// - src/dstr-binding/default/for-await-of-async-func-var.template
 /*---
 description: Rest object contains just unextracted data (for-await-of statement)
 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-close.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-close.js
new file mode 100644
index 0000000000000000000000000000000000000000..1497edf04e75af2c40defb8a099cc3be1038390b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-close.js
@@ -0,0 +1,74 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-init-iter-close.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Iterator is closed when not exhausted by pattern evaluation (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.5 Runtime Semantics: BindingInitialization
+
+    BindingPattern : ArrayBindingPattern
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, return ? IteratorClose(iterator,
+       result).
+    [...]
+
+---*/
+var doneCallCount = 0;
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: false };
+    },
+    return: function() {
+      doneCallCount += 1;
+      return {};
+    }
+  };
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x] of [iter]) {
+    assert.sameValue(doneCallCount, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-no-close.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-no-close.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf4a39abcca8340c0701c465f5d3fbfb114d241e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-no-close.js
@@ -0,0 +1,74 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-init-iter-no-close.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Iterator is not closed when exhausted by pattern evaluation (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.5 Runtime Semantics: BindingInitialization
+
+    BindingPattern : ArrayBindingPattern
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, return ? IteratorClose(iterator,
+       result).
+    [...]
+
+---*/
+var doneCallCount = 0;
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: true };
+    },
+    return: function() {
+      doneCallCount += 1;
+      return {};
+    }
+  };
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x] of [iter]) {
+    assert.sameValue(doneCallCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-name-iter-val.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-name-iter-val.js
new file mode 100644
index 0000000000000000000000000000000000000000..3faf3cbfc690a0b46b5f8718312a5ec5ac0141e5
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-name-iter-val.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-name-iter-val.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding with normal value iteration (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x, y, z] of [[1, 2, 3]]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, 2);
+    assert.sameValue(z, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elem-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elem-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..67b68eeb601d58363c88483469c6cea5ac4b4ebb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elem-init.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elem-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[x, y, z] = [4, 5, 6]] of [[]]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elem-iter.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elem-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..4db8e598f9233c47217b99973891f3e5503dac83
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elem-iter.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elem-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[x, y, z] = [4, 5, 6]] of [[[7, 8, 9]]]) {
+    assert.sameValue(x, 7);
+    assert.sameValue(y, 8);
+    assert.sameValue(z, 9);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elision-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elision-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..dcf8ae8c5f281b85fcd7a4f876d6343cc81a15c6
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elision-init.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elision-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[,] = g()] of [[]]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elision-iter.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elision-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f9f4a13937d759174b2fd3ba54bc3647414bb26
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-elision-iter.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elision-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+
+---*/
+var callCount = 0;
+function* g() {
+  callCount += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[,] = g()] of [[[]]]) {
+    assert.sameValue(callCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-empty-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-empty-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..278ef3d3bd0f95344a7dad730aeaa517b0426377
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-empty-init.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-empty-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var initCount = 0;
+var iterCount = 0;
+var iter = function*() { iterCount += 1; }();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[] = function() { initCount += 1; return iter; }()] of [[]]) {
+    assert.sameValue(initCount, 1);
+    assert.sameValue(iterCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-empty-iter.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-empty-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..99f4bda258742cee44ad75e5e1d3887bfdb92742
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-empty-iter.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-empty-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var initCount = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[] = function() { initCount += 1; }()] of [[[23]]]) {
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-rest-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-rest-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7cb6ccf5d702061c66847f9328597e3bf4596e1
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-rest-init.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-rest-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var values = [2, 1, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[...x] = values] of [[]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x[0], 2);
+    assert.sameValue(x[1], 1);
+    assert.sameValue(x[2], 3);
+    assert.sameValue(x.length, 3);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-rest-iter.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-rest-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..f61536370da5707d9d25be033f44144e553cd6cc
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-ary-rest-iter.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-rest-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var values = [2, 1, 3];
+var initCount = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [[...x] = function() { initCount += 1; }()] of [[values]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x[0], 2);
+    assert.sameValue(x[1], 1);
+    assert.sameValue(x[2], 3);
+    assert.sameValue(x.length, 3);
+    assert.notSameValue(x, values);
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5b1f948f31db7b8dece07d28bf5edb96c247769
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-exhausted.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Destructuring initializer with an exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x = 23] of [[]]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ada3f3c0370cbba3501b552f69a587db5d0d2e9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-arrow.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-arrow.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding does assign name to arrow functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [arrow = () => {}] of [[]]) {
+    assert.sameValue(arrow.name, 'arrow');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..612aca5034023ebb7979ba7b07d4b8eb9e475e6a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-class.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-class.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [cls = class {}, xCls = class X {}, xCls2 = class { static name() {} }] of [[]]) {
+    assert.sameValue(cls.name, 'cls');
+    assert.notSameValue(xCls.name, 'xCls');
+    assert.notSameValue(xCls2.name, 'xCls2');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
new file mode 100644
index 0000000000000000000000000000000000000000..ecb228cce674d240be2c4195a6231c86bf77587e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-cover.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-cover.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding does assign name to "anonymous" functions "through" cover grammar (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [cover = (function () {}), xCover = (0, function() {})] of [[]]) {
+    assert.sameValue(cover.name, 'cover');
+    assert.notSameValue(xCover.name, 'xCover');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
new file mode 100644
index 0000000000000000000000000000000000000000..f98f04069112cceb8f364bc82354e01d7ef6cc4a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-fn.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-fn.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [fn = function () {}, xFn = function x() {}] of [[]]) {
+    assert.sameValue(fn.name, 'fn');
+    assert.notSameValue(xFn.name, 'xFn');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
new file mode 100644
index 0000000000000000000000000000000000000000..784b48021f85aab216df8dab9a4c1f6a4de1927d
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-fn-name-gen.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-gen.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [gen = function* () {}, xGen = function* x() {}] of [[]]) {
+    assert.sameValue(gen.name, 'gen');
+    assert.notSameValue(xGen.name, 'xGen');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-hole.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-hole.js
new file mode 100644
index 0000000000000000000000000000000000000000..1765e419b31d274fbf8897f0a6c27aa6ae5672d4
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-hole.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-hole.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Destructuring initializer with a "hole" (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    SingleNameBinding : BindingIdentifier Initializeropt
+    [...] 6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v). 8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x = 23] of [[,]]) {
+    assert.sameValue(x, 23);
+    // another statement
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a7f2df851a0b4913efb2a0f2e76874e482d7e98
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-skipped.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [w = counter(), x = counter(), y = counter(), z = counter()] of [[null, 0, false, '']]) {
+    assert.sameValue(w, null);
+    assert.sameValue(x, 0);
+    assert.sameValue(y, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-undef.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-undef.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc8c934b6aa0be6d6a385d2a0896272cc72746c9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-undef.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-undef.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Destructuring initializer with an undefined value (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x = 23] of [[undefined]]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-complete.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-complete.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4351a5c3e7a2b36260be948afe24dbf1b26732b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-complete.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-complete.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding when value iteration completes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x] of [[]]) {
+    assert.sameValue(x, undefined);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-done.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-done.js
new file mode 100644
index 0000000000000000000000000000000000000000..3fb492ffa53a177f85c0ad10b0c50fae5f03cf35
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-done.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-done.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [_, x] of [[]]) {
+    assert.sameValue(x, undefined);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-val.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-val.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0bcc276b51ff1aae6134f93f01d58cb14ef3444
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-val.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-val.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [x, y, z] of [[1, 2, 3]]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, 2);
+    assert.sameValue(z, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a242fcd52c084725430f624a40c29837e265f68
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-id-init.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [{ x, y, z } = { x: 44, y: 55, z: 66 }] of [[]]) {
+    assert.sameValue(x, 44);
+    assert.sameValue(y, 55);
+    assert.sameValue(z, 66);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..15fb156e16fbfd58a2371a859f4b4db491a43c7b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-id.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [{ x, y, z } = { x: 44, y: 55, z: 66 }] of [[{ x: 11, y: 22, z: 33 }]]) {
+    assert.sameValue(x, 11);
+    assert.sameValue(y, 22);
+    assert.sameValue(z, 33);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-prop-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-prop-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c7253f591c98be0a3b5f9f14a0b39c5f78acc38
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-prop-id-init.js
@@ -0,0 +1,75 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-prop-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [{ u: v, w: x, y: z } = { u: 444, w: 555, y: 666 }] of [[]]) {
+    assert.sameValue(v, 444);
+    assert.sameValue(x, 555);
+    assert.sameValue(z, 666);
+
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..49c5aa6fbb52c5f13984d93891254da4632dc1ea
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-obj-prop-id.js
@@ -0,0 +1,75 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [{ u: v, w: x, y: z } = { u: 444, w: 555, y: 666 }] of [[{ u: 777, w: 888, y: 999 }]]) {
+    assert.sameValue(v, 777);
+    assert.sameValue(x, 888);
+    assert.sameValue(z, 999);
+
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..da676c9a64e8cd83f1f9d03234a4929e48390f86
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-exhausted.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elision-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Elision accepts exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       [...]
+    2. Return NormalCompletion(empty).
+
+---*/
+var iter = function*() {}();
+iter.next();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [,] of [iter]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4d2d223a39d51a857d06557f2d960aa00723d4f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision.js
@@ -0,0 +1,79 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Elision advances iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+    2. Return NormalCompletion(empty).
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [,] of [g()]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-empty.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a07095783da828897f699a16653bd7266394bee
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-empty.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: No iteration occurs for an "empty" array binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ ]
+
+    1. Return NormalCompletion(empty).
+
+---*/
+var iterations = 0;
+var iter = function*() {
+  iterations += 1;
+}();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [] of [iter]) {
+    assert.sameValue(iterations, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-elem.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-elem.js
new file mode 100644
index 0000000000000000000000000000000000000000..c90f480c042b66146163d2455a44c5bceab97ef4
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-elem.js
@@ -0,0 +1,86 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-elem.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element containing an array BindingElementList pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...[x, y, z]] of [[3, 4, 5]]) {
+    assert.sameValue(x, 3);
+    assert.sameValue(y, 4);
+    assert.sameValue(z, 5);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-elision.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..66cdaf05e97d8b46b2b8c505cca3862b01035d1a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-elision.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element containing an elision (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+    2. Return NormalCompletion(empty).
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...[,]] of [g()]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-empty.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..02e25f9166f80b8e2ab9fb2a2ace80aab6bdcfbe
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-empty.js
@@ -0,0 +1,75 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element containing an "empty" array pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ ]
+
+    1. Return NormalCompletion(empty).
+
+---*/
+var iterations = 0;
+var iter = function*() {
+  iterations += 1;
+}();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...[]] of [iter]) {
+    assert.sameValue(iterations, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-rest.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-rest.js
new file mode 100644
index 0000000000000000000000000000000000000000..3fe466f7cc38938b8b2bcd58520998aef52b88d9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-ary-rest.js
@@ -0,0 +1,71 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-rest.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element containing a rest element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+var values = [1, 2, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...[...x]] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 1);
+    assert.sameValue(x[1], 2);
+    assert.sameValue(x[2], 3);
+    assert.notSameValue(x, values);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-elision.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..90c91dd096fa26a0cfee245c13074773dd996ef7
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-elision.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element following elision elements (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    ArrayBindingPattern : [ Elisionopt BindingRestElement ]
+    1. If Elision is present, then
+       a. Let status be the result of performing
+          IteratorDestructuringAssignmentEvaluation of Elision with
+          iteratorRecord as the argument.
+       b. ReturnIfAbrupt(status).
+    2. Return the result of performing IteratorBindingInitialization for
+       BindingRestElement with iteratorRecord and environment as arguments.
+---*/
+var values = [1, 2, 3, 4, 5];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [ , , ...x] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 3);
+    assert.sameValue(x[1], 4);
+    assert.sameValue(x[2], 5);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..05b18f3770b14ff2097fe58a85ffff08cdd210a2
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-exhausted.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: RestElement applied to an exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    BindingRestElement : ... BindingIdentifier
+    1. Let lhs be ResolveBinding(StringValue of BindingIdentifier,
+       environment).
+    2. ReturnIfAbrupt(lhs). 3. Let A be ArrayCreate(0). 4. Let n=0. 5. Repeat,
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. If environment is undefined, return PutValue(lhs, A).
+          ii. Return InitializeReferencedBinding(lhs, A).
+
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [, , ...x] of [[1, 2]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4adb39dd7b29f09bf39dddf618bfa0aef5887bb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Lone rest element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    BindingRestElement : ... BindingIdentifier
+    [...] 3. Let A be ArrayCreate(0). [...] 5. Repeat
+       [...]
+       f. Let status be CreateDataProperty(A, ToString (n), nextValue).
+       [...]
+---*/
+var values = [1, 2, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...x] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 1);
+    assert.sameValue(x[1], 2);
+    assert.sameValue(x[2], 3);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-ary.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4557978ca3f49051eca02107f1e1b16dc530ccf
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-ary.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Reset element (nested array pattern) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...[ x ] = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9851ce5a4193d54bd8c939073caa54035adf78b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-id.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Reset element (identifier) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...x = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-obj.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..476c61cb7cf4c7af5efe32c91c17a466938d6f4f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-obj.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Reset element (nested object pattern) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...{ x } = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-ary.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..008925ab24195ef35eae484da9a043c50eccfc73
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-ary.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element (array binding pattern) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...[x], y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..086d8bd8ed89caa7c23ac2c8868b9efab61955a3
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-id.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element (identifier) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...x, y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-obj.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d1b5c0f86f48ff9993093efa8d13a7843912f2c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-obj.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element (object binding pattern) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...{ x }, y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d3709b67542fe118d4eaba799d16288821e7afb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-id.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-obj-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element containing an object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...{ length }] of [[1, 2, 3]]) {
+    assert.sameValue(length, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6bf5763c8126b2235815cf1594542ad66ebb0fc
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-prop-id.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-obj-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest element containing an object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const [...{ 0: v, 1: w, 2: x, 3: y, length: z }] of [[7, 8, 9]]) {
+    assert.sameValue(v, 7);
+    assert.sameValue(w, 8);
+    assert.sameValue(x, 9);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 3);
+
+    assert.throws(ReferenceError, function() {
+      length;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-empty.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c35fe73c5672ad12f9b502847edc8855939c68b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-empty.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: No property access occurs for an "empty" object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    Runtime Semantics: BindingInitialization
+
+    ObjectBindingPattern : { }
+
+    1. Return NormalCompletion(empty).
+---*/
+var accessCount = 0;
+var obj = Object.defineProperty({}, 'attr', {
+  get: function() {
+    accessCount += 1;
+  }
+});
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const {} of [obj]) {
+    assert.sameValue(accessCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-arrow.js
new file mode 100644
index 0000000000000000000000000000000000000000..52c60b8090a9b34fa1b4d82fe9c460c2598c8f98
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-arrow.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-arrow.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns `name` to arrow functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { arrow = () => {} } of [{}]) {
+    assert.sameValue(arrow.name, 'arrow');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..224cb7309de5f5789e6cc1eae6a6401367023aec
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-class.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-class.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { cls = class {}, xCls = class X {}, xCls2 = class { static name() {} } } of [{}]) {
+    assert.sameValue(cls.name, 'cls');
+    assert.notSameValue(xCls.name, 'xCls');
+    assert.notSameValue(xCls2.name, 'xCls2');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-cover.js
new file mode 100644
index 0000000000000000000000000000000000000000..1736107630b8e31da1e7e26ab97b56471f7bbe48
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-cover.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-cover.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" functions "through" cover grammar (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { cover = (function () {}), xCover = (0, function() {})  } of [{}]) {
+    assert.sameValue(cover.name, 'cover');
+    assert.notSameValue(xCover.name, 'xCover');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-fn.js
new file mode 100644
index 0000000000000000000000000000000000000000..6eb7ec6c999c1ddc5628a904f7cba8f4be64b55f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-fn.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-fn.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { fn = function () {}, xFn = function x() {} } of [{}]) {
+    assert.sameValue(fn.name, 'fn');
+    assert.notSameValue(xFn.name, 'xFn');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-gen.js
new file mode 100644
index 0000000000000000000000000000000000000000..908b19dfdcd89cd1c8e135f15cfe99e6678e00f0
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-fn-name-gen.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-gen.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { gen = function* () {}, xGen = function* x() {} } of [{}]) {
+    assert.sameValue(gen.name, 'gen');
+    assert.notSameValue(xGen.name, 'xGen');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..e9e47ec615da56ca97a398ad4dfe8f28d8e954cb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-skipped.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+    [...]
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { w = counter(), x = counter(), y = counter(), z = counter() } of [{ w: null, x: 0, y: false, z: '' }]) {
+    assert.sameValue(w, null);
+    assert.sameValue(x, 0);
+    assert.sameValue(y, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..222bb4e17d53336d92f5ba3279241d86982dba1a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-trailing-comma.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { x, } of [{ x: 23 }]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..56992acf7335b22a7cb2158c59d3ff1ebb958fd4
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary-init.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Object binding pattern with "nested" array binding pattern using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { w: [x, y, z] = [4, 5, 6] } of [{}]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd33691e9a1713ac39afe0c54126208ce33abf71
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary-trailing-comma.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { x: [y], } of [{ x: [45] }]) {
+    assert.sameValue(y,45);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa0a1d2b5e916e776f25f5025a989eb794d4f6e5
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-ary.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Object binding pattern with "nested" array binding pattern not using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       [...]
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { w: [x, y, z] = [4, 5, 6] } of [{ w: [7, undefined, ] }]) {
+    assert.sameValue(x, 7);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, undefined);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e30b4addd51b357ba92145ae7219b8d3250699f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init-skipped.js
@@ -0,0 +1,80 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    BindingElement : BindingPattern Initializeropt
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+    [...]
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { s: t = counter(), u: v = counter(), w: x = counter(), y: z = counter() } of [{ s: null, u: 0, w: false, y: '' }]) {
+    assert.sameValue(t, null);
+    assert.sameValue(v, 0);
+    assert.sameValue(x, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    assert.throws(ReferenceError, function() {
+      s;
+    });
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..f115c1a00abb7fbcc900251bfa6b1a7680129281
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Binding as specified via property name, identifier, and initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { x: y = 33 } of [{ }]) {
+    assert.sameValue(y, 33);
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..941a489d5da50e7ffcc23bca11ddcb2f71c54e03
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-trailing-comma.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { x: y, } of [{ x: 23 }]) {
+    assert.sameValue(y, 23);
+
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..887b3ffa8db9b3f338bfa6b33e86034806259b28
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Binding as specified via property name and identifier (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { x: y } of [{ x: 23 }]) {
+    assert.sameValue(y, 23);
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-obj-init.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-obj-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8cc271ee5180b4943754e17a6430776fd052926
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-obj-init.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-obj-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Object binding pattern with "nested" object binding pattern using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { w: { x, y, z } = { x: 4, y: 5, z: 6 } } of [{ w: undefined }]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-obj.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..000b5ee650cc5879dee3830e2f4b644dd9a8020f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-obj.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Object binding pattern with "nested" object binding pattern not using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       [...]
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { w: { x, y, z } = { x: 4, y: 5, z: 6 } } of [{ w: { x: undefined, z: 7 } }]) {
+    assert.sameValue(x, undefined);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 7);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-getter.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-getter.js
new file mode 100644
index 0000000000000000000000000000000000000000..feb3ee672c54c269f1e625249055fd6e127cb1c3
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-getter.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-getter.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var count = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const {...x} of [{ get v() { count++; return 2; } }]) {
+    assert.sameValue(x.v, 2);
+    assert.sameValue(count, 1);
+
+    verifyEnumerable(x, "v");
+    verifyWritable(x, "v");
+    verifyConfigurable(x, "v");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-nested-obj.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-nested-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c9df0425d8d03f2fe1e21f9250d01b376206705
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-nested-obj.js
@@ -0,0 +1,56 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-nested-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var obj = {a: 3, b: 4};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const {a, b, ...{c, e}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) {
+    assert.sameValue(a, 1);
+    assert.sameValue(b, 2);
+    assert.sameValue(c, 3);
+    assert.sameValue(e, 5);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-obj-nested-rest.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-obj-nested-rest.js
new file mode 100644
index 0000000000000000000000000000000000000000..6cc56dd97224ecad36b51057a76aec5867aba371
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-obj-nested-rest.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const {a, b, ...{c, ...rest}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) {
+    assert.sameValue(a, 1);
+    assert.sameValue(b, 2);
+    assert.sameValue(c, 3);
+
+    assert.sameValue(rest.d, 4);
+    assert.sameValue(rest.e, 5);
+
+    verifyEnumerable(rest, "d");
+    verifyWritable(rest, "d");
+    verifyConfigurable(rest, "d");
+
+    verifyEnumerable(rest, "e");
+    verifyWritable(rest, "e");
+    verifyConfigurable(rest, "e");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-obj-own-property.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-obj-own-property.js
new file mode 100644
index 0000000000000000000000000000000000000000..5feda71cc002673b8b354843cefd3aa739062de9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-obj-own-property.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-obj-own-property.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest object contains just soruce object's own properties (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var o = Object.create({ x: 1, y: 2 });
+o.z = 3;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const { x, ...{y , z} } of [o]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 3);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-skip-non-enumerable.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f46ed6138bdf6fefe029b12af9a94e570635fbc
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-skip-non-enumerable.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest object doesn't contain non-enumerable properties (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var o = {a: 3, b: 4};
+Object.defineProperty(o, "x", { value: 4, enumerable: false });
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const {...rest} of [o]) {
+    assert.sameValue(rest.a, 3);
+    assert.sameValue(rest.b, 4);
+    assert.sameValue(rest.x, undefined);
+
+    verifyEnumerable(rest, "a");
+    verifyWritable(rest, "a");
+    verifyConfigurable(rest, "a");
+
+    verifyEnumerable(rest, "b");
+    verifyWritable(rest, "b");
+    verifyConfigurable(rest, "b");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-val-obj.js b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-val-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..be2cfeb37e6b15e6003264cd09a9aa405bb05cce
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-rest-val-obj.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-val-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-const.template
+/*---
+description: Rest object contains just unextracted data (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (const {a, b, ...rest} of [{x: 1, y: 2, a: 5, b: 3}]) {
+    assert.sameValue(rest.x, 1);
+    assert.sameValue(rest.y, 2);
+    assert.sameValue(rest.a, undefined);
+    assert.sameValue(rest.b, undefined);
+
+    verifyEnumerable(rest, "x");
+    verifyWritable(rest, "x");
+    verifyConfigurable(rest, "x");
+
+    verifyEnumerable(rest, "y");
+    verifyWritable(rest, "y");
+    verifyConfigurable(rest, "y");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-close.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-close.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8c52641fc7f2dcabdd8a4786f7a278dbb057bde
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-close.js
@@ -0,0 +1,75 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-init-iter-close.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Iterator is closed when not exhausted by pattern evaluation (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.5 Runtime Semantics: BindingInitialization
+
+    BindingPattern : ArrayBindingPattern
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, return ? IteratorClose(iterator,
+       result).
+    [...]
+
+---*/
+var doneCallCount = 0;
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: false };
+    },
+    return: function() {
+      doneCallCount += 1;
+      return {};
+    }
+  };
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x] of [iter]) {
+    assert.sameValue(doneCallCount, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-no-close.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-no-close.js
new file mode 100644
index 0000000000000000000000000000000000000000..f8a864f366e935d04d90b218db683d931329c63e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-no-close.js
@@ -0,0 +1,75 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-init-iter-no-close.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Iterator is not closed when exhausted by pattern evaluation (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.5 Runtime Semantics: BindingInitialization
+
+    BindingPattern : ArrayBindingPattern
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, return ? IteratorClose(iterator,
+       result).
+    [...]
+
+---*/
+var doneCallCount = 0;
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: true };
+    },
+    return: function() {
+      doneCallCount += 1;
+      return {};
+    }
+  };
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x] of [iter]) {
+    assert.sameValue(doneCallCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-name-iter-val.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-name-iter-val.js
new file mode 100644
index 0000000000000000000000000000000000000000..68216f09846d0e49cf9ec66fa76690f509aaf1d2
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-name-iter-val.js
@@ -0,0 +1,74 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-name-iter-val.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding with normal value iteration (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x, y, z] of [[1, 2, 3]]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, 2);
+    assert.sameValue(z, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elem-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elem-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..0fef22fad74f4a6f81d370676eb4a0bd5c9e23b8
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elem-init.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elem-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[x, y, z] = [4, 5, 6]] of [[]]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elem-iter.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elem-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ae7f9791be7cf282a60522f5f37c1f5cd3b9daa
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elem-iter.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elem-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[x, y, z] = [4, 5, 6]] of [[[7, 8, 9]]]) {
+    assert.sameValue(x, 7);
+    assert.sameValue(y, 8);
+    assert.sameValue(z, 9);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elision-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elision-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..f726b09b86c44ddabbf927cb94947f234cf3eb4c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elision-init.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elision-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[,] = g()] of [[]]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elision-iter.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elision-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..326cdd3a2503197c2fd2a6007f030c48dcc03738
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-elision-iter.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elision-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+
+---*/
+var callCount = 0;
+function* g() {
+  callCount += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[,] = g()] of [[[]]]) {
+    assert.sameValue(callCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-empty-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-empty-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..1209ad16b9008ae4505e3f899b7ff3914c55f851
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-empty-init.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-empty-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var initCount = 0;
+var iterCount = 0;
+var iter = function*() { iterCount += 1; }();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[] = function() { initCount += 1; return iter; }()] of [[]]) {
+    assert.sameValue(initCount, 1);
+    assert.sameValue(iterCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-empty-iter.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-empty-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fcb04bc1248da1bb98ae81a3c69f9c88835bd04
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-empty-iter.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-empty-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var initCount = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[] = function() { initCount += 1; }()] of [[[23]]]) {
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-rest-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-rest-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..affcf80773eb831940c8de0d1771f688cbe67c98
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-rest-init.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-rest-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var values = [2, 1, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[...x] = values] of [[]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x[0], 2);
+    assert.sameValue(x[1], 1);
+    assert.sameValue(x[2], 3);
+    assert.sameValue(x.length, 3);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-rest-iter.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-rest-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc92b995df329b4acff88d224b268104fa6bcd52
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-ary-rest-iter.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-rest-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var values = [2, 1, 3];
+var initCount = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [[...x] = function() { initCount += 1; }()] of [[values]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x[0], 2);
+    assert.sameValue(x[1], 1);
+    assert.sameValue(x[2], 3);
+    assert.sameValue(x.length, 3);
+    assert.notSameValue(x, values);
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..be40de46903464d3ebb6da9d267abc200da17cd7
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-exhausted.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Destructuring initializer with an exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x = 23] of [[]]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
new file mode 100644
index 0000000000000000000000000000000000000000..056216857c138014b1970c98e12b76541fe1f7ab
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-arrow.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding does assign name to arrow functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [arrow = () => {}] of [[]]) {
+    assert.sameValue(arrow.name, 'arrow');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b94b1621c4de50b92260a0bfb09de20c26512f4
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-class.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-class.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [cls = class {}, xCls = class X {}, xCls2 = class { static name() {} }] of [[]]) {
+    assert.sameValue(cls.name, 'cls');
+    assert.notSameValue(xCls.name, 'xCls');
+    assert.notSameValue(xCls2.name, 'xCls2');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
new file mode 100644
index 0000000000000000000000000000000000000000..2306c9a64cee6cebcd0087ee47badc0f6587a33f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-cover.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding does assign name to "anonymous" functions "through" cover grammar (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [cover = (function () {}), xCover = (0, function() {})] of [[]]) {
+    assert.sameValue(cover.name, 'cover');
+    assert.notSameValue(xCover.name, 'xCover');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
new file mode 100644
index 0000000000000000000000000000000000000000..41fcf4ce549996a7d3179f4bd5ca421d22dd308e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-fn.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [fn = function () {}, xFn = function x() {}] of [[]]) {
+    assert.sameValue(fn.name, 'fn');
+    assert.notSameValue(xFn.name, 'xFn');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
new file mode 100644
index 0000000000000000000000000000000000000000..2152268f9772b2a57d7833914aefd882e227babb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-gen.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [gen = function* () {}, xGen = function* x() {}] of [[]]) {
+    assert.sameValue(gen.name, 'gen');
+    assert.notSameValue(xGen.name, 'xGen');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-hole.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-hole.js
new file mode 100644
index 0000000000000000000000000000000000000000..a87cde7b6cd1fb025e4fd184250031270aa70a24
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-hole.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-hole.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Destructuring initializer with a "hole" (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    SingleNameBinding : BindingIdentifier Initializeropt
+    [...] 6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v). 8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x = 23] of [[,]]) {
+    assert.sameValue(x, 23);
+    // another statement
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..6db1ecc75436a6cb42e40c9ce738cfc90f5ba6e6
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-skipped.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [w = counter(), x = counter(), y = counter(), z = counter()] of [[null, 0, false, '']]) {
+    assert.sameValue(w, null);
+    assert.sameValue(x, 0);
+    assert.sameValue(y, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-undef.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-undef.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8ff55d7abf33e96892c76767ac7d257d2c1581d
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-undef.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-undef.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Destructuring initializer with an undefined value (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x = 23] of [[undefined]]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-complete.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-complete.js
new file mode 100644
index 0000000000000000000000000000000000000000..b024c3d0c1b8bdeb7da6b5f2734ab57fc0209e2f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-complete.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-complete.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding when value iteration completes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x] of [[]]) {
+    assert.sameValue(x, undefined);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-done.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-done.js
new file mode 100644
index 0000000000000000000000000000000000000000..d7412ff11f822bfc6dd393ee14f35c109e9d687c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-done.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-done.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [_, x] of [[]]) {
+    assert.sameValue(x, undefined);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-val.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-val.js
new file mode 100644
index 0000000000000000000000000000000000000000..10d416d125b48c3e7c7c2d922e024ce732cc10f0
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-val.js
@@ -0,0 +1,74 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-val.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [x, y, z] of [[1, 2, 3]]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, 2);
+    assert.sameValue(z, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..dacb5ef6b2ea9fd00518dad0c392b6c9beb56eb5
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-id-init.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [{ x, y, z } = { x: 44, y: 55, z: 66 }] of [[]]) {
+    assert.sameValue(x, 44);
+    assert.sameValue(y, 55);
+    assert.sameValue(z, 66);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..f07274a2eb45539dd3e2635558ba26dce5eb84cc
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-id.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [{ x, y, z } = { x: 44, y: 55, z: 66 }] of [[{ x: 11, y: 22, z: 33 }]]) {
+    assert.sameValue(x, 11);
+    assert.sameValue(y, 22);
+    assert.sameValue(z, 33);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-prop-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-prop-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6efe0b405f934f6f3b002be03a89921c0bad876
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-prop-id-init.js
@@ -0,0 +1,76 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-prop-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [{ u: v, w: x, y: z } = { u: 444, w: 555, y: 666 }] of [[]]) {
+    assert.sameValue(v, 444);
+    assert.sameValue(x, 555);
+    assert.sameValue(z, 666);
+
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff8ca7c378a4e6eb9da242f3eacecf7b6c076c13
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-obj-prop-id.js
@@ -0,0 +1,76 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [{ u: v, w: x, y: z } = { u: 444, w: 555, y: 666 }] of [[{ u: 777, w: 888, y: 999 }]]) {
+    assert.sameValue(v, 777);
+    assert.sameValue(x, 888);
+    assert.sameValue(z, 999);
+
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..d617ba98b8f02cec93b2e8d3b90d9ba0516a4f61
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-exhausted.js
@@ -0,0 +1,71 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elision-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Elision accepts exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       [...]
+    2. Return NormalCompletion(empty).
+
+---*/
+var iter = function*() {}();
+iter.next();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [,] of [iter]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..d44fce93f9b14a56e951e6ce081ce1a8b5e41c6e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision.js
@@ -0,0 +1,80 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Elision advances iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+    2. Return NormalCompletion(empty).
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [,] of [g()]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-empty.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..814b9f4eaf112d4d4feffe5caaf2cf93f971f0ea
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-empty.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: No iteration occurs for an "empty" array binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ ]
+
+    1. Return NormalCompletion(empty).
+
+---*/
+var iterations = 0;
+var iter = function*() {
+  iterations += 1;
+}();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [] of [iter]) {
+    assert.sameValue(iterations, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-elem.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-elem.js
new file mode 100644
index 0000000000000000000000000000000000000000..59e18c715d102c1268c268dac2f97fa01820d332
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-elem.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-elem.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element containing an array BindingElementList pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...[x, y, z]] of [[3, 4, 5]]) {
+    assert.sameValue(x, 3);
+    assert.sameValue(y, 4);
+    assert.sameValue(z, 5);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-elision.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0a93d55241271e4076d5d079da6d3ce2b30ecf8
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-elision.js
@@ -0,0 +1,93 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element containing an elision (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+    2. Return NormalCompletion(empty).
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...[,]] of [g()]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-empty.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..37c05ea3dd624b8a2e997db594bb26444e0f0570
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-empty.js
@@ -0,0 +1,76 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element containing an "empty" array pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ ]
+
+    1. Return NormalCompletion(empty).
+
+---*/
+var iterations = 0;
+var iter = function*() {
+  iterations += 1;
+}();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...[]] of [iter]) {
+    assert.sameValue(iterations, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-rest.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-rest.js
new file mode 100644
index 0000000000000000000000000000000000000000..db99932d55950635d90b440637ebac5f829f8571
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-ary-rest.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-rest.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element containing a rest element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+var values = [1, 2, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...[...x]] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 1);
+    assert.sameValue(x[1], 2);
+    assert.sameValue(x[2], 3);
+    assert.notSameValue(x, values);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-elision.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..dfa4c70b93fedf689b0f2b14fa427eba27510103
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-elision.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element following elision elements (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    ArrayBindingPattern : [ Elisionopt BindingRestElement ]
+    1. If Elision is present, then
+       a. Let status be the result of performing
+          IteratorDestructuringAssignmentEvaluation of Elision with
+          iteratorRecord as the argument.
+       b. ReturnIfAbrupt(status).
+    2. Return the result of performing IteratorBindingInitialization for
+       BindingRestElement with iteratorRecord and environment as arguments.
+---*/
+var values = [1, 2, 3, 4, 5];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [ , , ...x] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 3);
+    assert.sameValue(x[1], 4);
+    assert.sameValue(x[2], 5);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..027208c186aa45e31f102fb24b36be19d69ee986
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-exhausted.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: RestElement applied to an exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    BindingRestElement : ... BindingIdentifier
+    1. Let lhs be ResolveBinding(StringValue of BindingIdentifier,
+       environment).
+    2. ReturnIfAbrupt(lhs). 3. Let A be ArrayCreate(0). 4. Let n=0. 5. Repeat,
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. If environment is undefined, return PutValue(lhs, A).
+          ii. Return InitializeReferencedBinding(lhs, A).
+
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [, , ...x] of [[1, 2]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec4c32a7171a92eb585e6201ab2e923d7871d8a9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Lone rest element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    BindingRestElement : ... BindingIdentifier
+    [...] 3. Let A be ArrayCreate(0). [...] 5. Repeat
+       [...]
+       f. Let status be CreateDataProperty(A, ToString (n), nextValue).
+       [...]
+---*/
+var values = [1, 2, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...x] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 1);
+    assert.sameValue(x[1], 2);
+    assert.sameValue(x[2], 3);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-ary.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..b2f08f80a6659e70ac2fbdc960cf71e62ad29ab6
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-ary.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Reset element (nested array pattern) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...[ x ] = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..9da2bf376c4519aa4a1047e39c004e7ce9b28526
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-id.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Reset element (identifier) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...x = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-obj.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..235093cf31d976d45bfaea475613b4107d49fcba
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-obj.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Reset element (nested object pattern) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...{ x } = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-ary.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fba7a53b6f26606f46653acd05eda57aa91a503
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-ary.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element (array binding pattern) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...[x], y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..282bf725c9c27588e2aa58150f01c8745344dbb8
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-id.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element (identifier) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...x, y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-obj.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e4ad34e578383e8d61c81113ec1156e5c4275f7
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-obj.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element (object binding pattern) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...{ x }, y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f7bce420ba99aff6ae89a1b1ecc09860d246dc3
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-id.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-obj-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element containing an object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...{ length }] of [[1, 2, 3]]) {
+    assert.sameValue(length, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b0f1d53f6e3487443f5a20f582f89060b4bc0ed
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-prop-id.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-obj-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest element containing an object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let [...{ 0: v, 1: w, 2: x, 3: y, length: z }] of [[7, 8, 9]]) {
+    assert.sameValue(v, 7);
+    assert.sameValue(w, 8);
+    assert.sameValue(x, 9);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 3);
+
+    assert.throws(ReferenceError, function() {
+      length;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-empty.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..588eba33eed5f30c350ff7a0d23721a69d630b44
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-empty.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: No property access occurs for an "empty" object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    Runtime Semantics: BindingInitialization
+
+    ObjectBindingPattern : { }
+
+    1. Return NormalCompletion(empty).
+---*/
+var accessCount = 0;
+var obj = Object.defineProperty({}, 'attr', {
+  get: function() {
+    accessCount += 1;
+  }
+});
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let {} of [obj]) {
+    assert.sameValue(accessCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-arrow.js
new file mode 100644
index 0000000000000000000000000000000000000000..95e7c810294feed071ba83144a3b625e3cebd833
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-arrow.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-arrow.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns `name` to arrow functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { arrow = () => {} } of [{}]) {
+    assert.sameValue(arrow.name, 'arrow');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..164ea6bfe32bad85ef30fda51c8829a8b305ffc7
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-class.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-class.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { cls = class {}, xCls = class X {}, xCls2 = class { static name() {} } } of [{}]) {
+    assert.sameValue(cls.name, 'cls');
+    assert.notSameValue(xCls.name, 'xCls');
+    assert.notSameValue(xCls2.name, 'xCls2');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-cover.js
new file mode 100644
index 0000000000000000000000000000000000000000..2448a0823f0f92dad93c228e6ae1950cd0ba5489
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-cover.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-cover.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" functions "through" cover grammar (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { cover = (function () {}), xCover = (0, function() {})  } of [{}]) {
+    assert.sameValue(cover.name, 'cover');
+    assert.notSameValue(xCover.name, 'xCover');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-fn.js
new file mode 100644
index 0000000000000000000000000000000000000000..a27096a57ed5af55e9965ced506aea3c68f8148d
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-fn.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-fn.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { fn = function () {}, xFn = function x() {} } of [{}]) {
+    assert.sameValue(fn.name, 'fn');
+    assert.notSameValue(xFn.name, 'xFn');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-gen.js
new file mode 100644
index 0000000000000000000000000000000000000000..84d7cad58d396dd2cfe11c906cc36308358e9039
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-fn-name-gen.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-gen.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { gen = function* () {}, xGen = function* x() {} } of [{}]) {
+    assert.sameValue(gen.name, 'gen');
+    assert.notSameValue(xGen.name, 'xGen');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..6cd193f1f14430fa3d10d7f9f6d6790ee90fbd20
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-skipped.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+    [...]
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { w = counter(), x = counter(), y = counter(), z = counter() } of [{ w: null, x: 0, y: false, z: '' }]) {
+    assert.sameValue(w, null);
+    assert.sameValue(x, 0);
+    assert.sameValue(y, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba9f74a38dc97bac8147f7331ac3d7da0735bf39
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-trailing-comma.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { x, } of [{ x: 23 }]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..df9e45cb208c7e8e90c32bae8668bf4409f3a701
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary-init.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Object binding pattern with "nested" array binding pattern using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { w: [x, y, z] = [4, 5, 6] } of [{}]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..e3d53a7cbc04fbf8c30ee18e3c1207055f2cbd15
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary-trailing-comma.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { x: [y], } of [{ x: [45] }]) {
+    assert.sameValue(y,45);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..285a50c5c413a345ee90c45eecc65628d179342e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-ary.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Object binding pattern with "nested" array binding pattern not using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       [...]
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { w: [x, y, z] = [4, 5, 6] } of [{ w: [7, undefined, ] }]) {
+    assert.sameValue(x, 7);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, undefined);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..a60a4e2d7dbbbe4c54d367f04bdfdd114972f921
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init-skipped.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    BindingElement : BindingPattern Initializeropt
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+    [...]
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { s: t = counter(), u: v = counter(), w: x = counter(), y: z = counter() } of [{ s: null, u: 0, w: false, y: '' }]) {
+    assert.sameValue(t, null);
+    assert.sameValue(v, 0);
+    assert.sameValue(x, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    assert.throws(ReferenceError, function() {
+      s;
+    });
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f0e76113949a3c81cbd7f11f5bb035a0824d7d3
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Binding as specified via property name, identifier, and initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { x: y = 33 } of [{ }]) {
+    assert.sameValue(y, 33);
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..6132cfab0b9065e1aa41e19b50a2c87a94ad2b67
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-trailing-comma.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { x: y, } of [{ x: 23 }]) {
+    assert.sameValue(y, 23);
+
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..7bc51f011b54c853928f3f762117076c65631b9e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Binding as specified via property name and identifier (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { x: y } of [{ x: 23 }]) {
+    assert.sameValue(y, 23);
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-obj-init.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-obj-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..093aa51e506ef9ca5668e572b6562c65e8419ae9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-obj-init.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-obj-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Object binding pattern with "nested" object binding pattern using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { w: { x, y, z } = { x: 4, y: 5, z: 6 } } of [{ w: undefined }]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-obj.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb6dc47ebb4fd781985296e27f733ea79bd26b2c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-obj.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Object binding pattern with "nested" object binding pattern not using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       [...]
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { w: { x, y, z } = { x: 4, y: 5, z: 6 } } of [{ w: { x: undefined, z: 7 } }]) {
+    assert.sameValue(x, undefined);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 7);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-getter.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-getter.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9cb4658fb0b70265581375ed17c5ba934962b02
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-getter.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-getter.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var count = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let {...x} of [{ get v() { count++; return 2; } }]) {
+    assert.sameValue(x.v, 2);
+    assert.sameValue(count, 1);
+
+    verifyEnumerable(x, "v");
+    verifyWritable(x, "v");
+    verifyConfigurable(x, "v");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-nested-obj.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-nested-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..8bab27ff107b642c1a76096bd6c84da3bd025111
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-nested-obj.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-nested-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var obj = {a: 3, b: 4};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let {a, b, ...{c, e}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) {
+    assert.sameValue(a, 1);
+    assert.sameValue(b, 2);
+    assert.sameValue(c, 3);
+    assert.sameValue(e, 5);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-obj-nested-rest.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-obj-nested-rest.js
new file mode 100644
index 0000000000000000000000000000000000000000..ae59a81fb57dc0d182c90b5024137c013a876e3d
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-obj-nested-rest.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let {a, b, ...{c, ...rest}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) {
+    assert.sameValue(a, 1);
+    assert.sameValue(b, 2);
+    assert.sameValue(c, 3);
+
+    assert.sameValue(rest.d, 4);
+    assert.sameValue(rest.e, 5);
+
+    verifyEnumerable(rest, "d");
+    verifyWritable(rest, "d");
+    verifyConfigurable(rest, "d");
+
+    verifyEnumerable(rest, "e");
+    verifyWritable(rest, "e");
+    verifyConfigurable(rest, "e");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-obj-own-property.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-obj-own-property.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6744f3fc4daf12e20db1d68230f36213032ee83
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-obj-own-property.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-obj-own-property.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest object contains just soruce object's own properties (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var o = Object.create({ x: 1, y: 2 });
+o.z = 3;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let { x, ...{y , z} } of [o]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 3);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-skip-non-enumerable.js
new file mode 100644
index 0000000000000000000000000000000000000000..47b59b5996dc49c8623374b2b3b339e65b1fb038
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-skip-non-enumerable.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest object doesn't contain non-enumerable properties (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+var o = {a: 3, b: 4};
+Object.defineProperty(o, "x", { value: 4, enumerable: false });
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let {...rest} of [o]) {
+    assert.sameValue(rest.a, 3);
+    assert.sameValue(rest.b, 4);
+    assert.sameValue(rest.x, undefined);
+
+    verifyEnumerable(rest, "a");
+    verifyWritable(rest, "a");
+    verifyConfigurable(rest, "a");
+
+    verifyEnumerable(rest, "b");
+    verifyWritable(rest, "b");
+    verifyConfigurable(rest, "b");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-val-obj.js b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-val-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..82d726781d315e596a547a4a91aae00e0feaf832
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-rest-val-obj.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-val-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-let.template
+/*---
+description: Rest object contains just unextracted data (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( ForDeclaration of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult,
+        lexicalBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              [...]
+          iii. Else,
+               1. Assert: lhsKind is lexicalBinding.
+               2. Assert: lhs is a ForDeclaration.
+               3. Let status be the result of performing BindingInitialization
+                  for lhs passing nextValue and iterationEnv as arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (let {a, b, ...rest} of [{x: 1, y: 2, a: 5, b: 3}]) {
+    assert.sameValue(rest.x, 1);
+    assert.sameValue(rest.y, 2);
+    assert.sameValue(rest.a, undefined);
+    assert.sameValue(rest.b, undefined);
+
+    verifyEnumerable(rest, "x");
+    verifyWritable(rest, "x");
+    verifyConfigurable(rest, "x");
+
+    verifyEnumerable(rest, "y");
+    verifyWritable(rest, "y");
+    verifyConfigurable(rest, "y");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-close.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-close.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5874cc1a17954f400a9b5391342ee8369a26a7e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-close.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-init-iter-close.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Iterator is closed when not exhausted by pattern evaluation (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.5 Runtime Semantics: BindingInitialization
+
+    BindingPattern : ArrayBindingPattern
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, return ? IteratorClose(iterator,
+       result).
+    [...]
+
+---*/
+var doneCallCount = 0;
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: false };
+    },
+    return: function() {
+      doneCallCount += 1;
+      return {};
+    }
+  };
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x] of [iter]) {
+    assert.sameValue(doneCallCount, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-no-close.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-no-close.js
new file mode 100644
index 0000000000000000000000000000000000000000..48593cfb3b82679939cca819d1b5c965c8d255df
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-no-close.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-init-iter-no-close.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Iterator is not closed when exhausted by pattern evaluation (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.5 Runtime Semantics: BindingInitialization
+
+    BindingPattern : ArrayBindingPattern
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, return ? IteratorClose(iterator,
+       result).
+    [...]
+
+---*/
+var doneCallCount = 0;
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: true };
+    },
+    return: function() {
+      doneCallCount += 1;
+      return {};
+    }
+  };
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x] of [iter]) {
+    assert.sameValue(doneCallCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-name-iter-val.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-name-iter-val.js
new file mode 100644
index 0000000000000000000000000000000000000000..61e414c10ca57d69b43718a5f6006aa1c5da8c2b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-name-iter-val.js
@@ -0,0 +1,71 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-name-iter-val.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding with normal value iteration (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x, y, z] of [[1, 2, 3]]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, 2);
+    assert.sameValue(z, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elem-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elem-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b815f0e562ad95c5319b04977eb3c945f894523
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elem-init.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elem-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[x, y, z] = [4, 5, 6]] of [[]]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elem-iter.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elem-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e0ac0d6fc9df383b9f0ef694b505046657137ca
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elem-iter.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elem-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[x, y, z] = [4, 5, 6]] of [[[7, 8, 9]]]) {
+    assert.sameValue(x, 7);
+    assert.sameValue(y, 8);
+    assert.sameValue(z, 9);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elision-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elision-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f4715e0960996437279ebd9e17ee9de395c0adb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elision-init.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elision-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[,] = g()] of [[]]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elision-iter.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elision-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..26f0c311f7eaa5635ee7513290988c9f69f95aae
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-elision-iter.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-elision-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+
+---*/
+var callCount = 0;
+function* g() {
+  callCount += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[,] = g()] of [[[]]]) {
+    assert.sameValue(callCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-empty-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-empty-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..6bce3a800bc33f893adea28a88d4bc72672841cc
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-empty-init.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-empty-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var initCount = 0;
+var iterCount = 0;
+var iter = function*() { iterCount += 1; }();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[] = function() { initCount += 1; return iter; }()] of [[]]) {
+    assert.sameValue(initCount, 1);
+    assert.sameValue(iterCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-empty-iter.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-empty-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..d3741ae991e9f90cd6c830597d5e0b5d523e4ef8
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-empty-iter.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-empty-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var initCount = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[] = function() { initCount += 1; }()] of [[[23]]]) {
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-rest-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-rest-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9172e5bace5b60cd06467930a2247481016ee7d
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-rest-init.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-rest-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var values = [2, 1, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[...x] = values] of [[]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x[0], 2);
+    assert.sameValue(x[1], 1);
+    assert.sameValue(x[2], 3);
+    assert.sameValue(x.length, 3);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-rest-iter.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-rest-iter.js
new file mode 100644
index 0000000000000000000000000000000000000000..5bc056655c6454e0e919766b1ab25c02be6cc017
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-ary-rest-iter.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-ary-rest-iter.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with array binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       [...]
+       e. Else,
+          i. Let v be IteratorValue(next).
+          [...]
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+var values = [2, 1, 3];
+var initCount = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [[...x] = function() { initCount += 1; }()] of [[values]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x[0], 2);
+    assert.sameValue(x[1], 1);
+    assert.sameValue(x[2], 3);
+    assert.sameValue(x.length, 3);
+    assert.notSameValue(x, values);
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e75de8cc79fbbbc2d8091fea529a05d8e756e0a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-exhausted.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Destructuring initializer with an exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x = 23] of [[]]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
new file mode 100644
index 0000000000000000000000000000000000000000..7df8ba3d09d3693d8b37bb5be7512ddfe4f6da83
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-arrow.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding does assign name to arrow functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [arrow = () => {}] of [[]]) {
+    assert.sameValue(arrow.name, 'arrow');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb78e065fbf2ea85ee4478343dae825fa9729181
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-class.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-class.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [cls = class {}, xCls = class X {}, xCls2 = class { static name() {} }] of [[]]) {
+    assert.sameValue(cls.name, 'cls');
+    assert.notSameValue(xCls.name, 'xCls');
+    assert.notSameValue(xCls2.name, 'xCls2');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
new file mode 100644
index 0000000000000000000000000000000000000000..de1d8916e177983072c65e815c7ce7e0643972fa
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-cover.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding does assign name to "anonymous" functions "through" cover grammar (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [cover = (function () {}), xCover = (0, function() {})] of [[]]) {
+    assert.sameValue(cover.name, 'cover');
+    assert.notSameValue(xCover.name, 'xCover');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
new file mode 100644
index 0000000000000000000000000000000000000000..929fb7807eab5ce56422cca4de7bbfb561498234
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-fn.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [fn = function () {}, xFn = function x() {}] of [[]]) {
+    assert.sameValue(fn.name, 'fn');
+    assert.notSameValue(xFn.name, 'xFn');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
new file mode 100644
index 0000000000000000000000000000000000000000..f958fc26b719556550df42c86714884f8e3537d9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-fn-name-gen.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [gen = function* () {}, xGen = function* x() {}] of [[]]) {
+    assert.sameValue(gen.name, 'gen');
+    assert.notSameValue(xGen.name, 'xGen');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-hole.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-hole.js
new file mode 100644
index 0000000000000000000000000000000000000000..45ce16b59b7939872343ef293bc782226999707f
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-hole.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-hole.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Destructuring initializer with a "hole" (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    SingleNameBinding : BindingIdentifier Initializeropt
+    [...] 6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v). 8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x = 23] of [[,]]) {
+    assert.sameValue(x, 23);
+    // another statement
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..b30c5c865a06f7cf37366e6f5af43e349449434b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-skipped.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [w = counter(), x = counter(), y = counter(), z = counter()] of [[null, 0, false, '']]) {
+    assert.sameValue(w, null);
+    assert.sameValue(x, 0);
+    assert.sameValue(y, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-undef.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-undef.js
new file mode 100644
index 0000000000000000000000000000000000000000..7dda4302a24ba9909320a074861dc095f4ebd084
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-undef.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-init-undef.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Destructuring initializer with an undefined value (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       [...]
+    7. If environment is undefined, return PutValue(lhs, v).
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x = 23] of [[undefined]]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-complete.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-complete.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f32291e77a2f9928b1f4b910ef8461d03a158ee
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-complete.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-complete.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding when value iteration completes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x] of [[]]) {
+    assert.sameValue(x, undefined);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-done.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-done.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b254f8eb906a5a553fa40da54f3352092301da6
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-done.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-done.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       [...]
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [_, x] of [[]]) {
+    assert.sameValue(x, undefined);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-val.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-val.js
new file mode 100644
index 0000000000000000000000000000000000000000..ece50ed4bca54631a829e0e8ff927357be0f85aa
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-val.js
@@ -0,0 +1,71 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-id-iter-val.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding when value iteration was completed previously (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [x, y, z] of [[1, 2, 3]]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, 2);
+    assert.sameValue(z, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..8c004ca1a77363213110c9a9ac2e1d71037710f6
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-id-init.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [{ x, y, z } = { x: 44, y: 55, z: 66 }] of [[]]) {
+    assert.sameValue(x, 44);
+    assert.sameValue(y, 55);
+    assert.sameValue(z, 66);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..c0710ee115d57008e8b8973e9b6684f910e97cae
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-id.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [{ x, y, z } = { x: 44, y: 55, z: 66 }] of [[{ x: 11, y: 22, z: 33 }]]) {
+    assert.sameValue(x, 11);
+    assert.sameValue(y, 22);
+    assert.sameValue(z, 33);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-prop-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-prop-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..c30c39f6be021332f7023e3349a08b5b26d4f601
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-prop-id-init.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-prop-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with object binding pattern and initializer is used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [{ u: v, w: x, y: z } = { u: 444, w: 555, y: 666 }] of [[]]) {
+    assert.sameValue(v, 444);
+    assert.sameValue(x, 555);
+    assert.sameValue(z, 666);
+
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc1286d58c55924f80a60d21ae4680455b431510
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-obj-prop-id.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elem-obj-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: BindingElement with object binding pattern and initializer is not used (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingElement : BindingPatternInitializer opt
+
+    [...]
+    2. If iteratorRecord.[[done]] is true, let v be undefined.
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be ? GetValue(defaultValue).
+    4. Return the result of performing BindingInitialization of BindingPattern
+       with v and environment as the arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [{ u: v, w: x, y: z } = { u: 444, w: 555, y: 666 }] of [[{ u: 777, w: 888, y: 999 }]]) {
+    assert.sameValue(v, 777);
+    assert.sameValue(x, 888);
+    assert.sameValue(z, 999);
+
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..6628e08b071ca39e450c469aff5f1d053b9ff529
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-exhausted.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elision-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Elision accepts exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       [...]
+    2. Return NormalCompletion(empty).
+
+---*/
+var iter = function*() {}();
+iter.next();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [,] of [iter]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..f1f395f536ca5a8b60467db46dfd49b87fb6ed3c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Elision advances iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+    2. Return NormalCompletion(empty).
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [,] of [g()]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-empty.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..18138e3439f7b78ee208f729521d2fc714375791
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-empty.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: No iteration occurs for an "empty" array binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ ]
+
+    1. Return NormalCompletion(empty).
+
+---*/
+var iterations = 0;
+var iter = function*() {
+  iterations += 1;
+}();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [] of [iter]) {
+    assert.sameValue(iterations, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-elem.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-elem.js
new file mode 100644
index 0000000000000000000000000000000000000000..ea5f3a4861b6d6261dcc42bd97d1ee79539116a0
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-elem.js
@@ -0,0 +1,84 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-elem.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element containing an array BindingElementList pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    4. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+       e. Else,
+          [...]
+          i. Let v be IteratorValue(next).
+          ii. If v is an abrupt completion, set
+              iteratorRecord.[[done]] to true.
+          iii. ReturnIfAbrupt(v).
+    5. If iteratorRecord.[[done]] is true, let v be undefined.
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...[x, y, z]] of [[3, 4, 5]]) {
+    assert.sameValue(x, 3);
+    assert.sameValue(y, 4);
+    assert.sameValue(z, 5);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-elision.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec1cf79059e73bed8995e5e17c9c41f1481f753a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-elision.js
@@ -0,0 +1,90 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element containing an elision (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ Elision ]
+
+    1. Return the result of performing
+       IteratorDestructuringAssignmentEvaluation of Elision with iteratorRecord
+       as the argument.
+
+    12.14.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    Elision : ,
+
+    1. If iteratorRecord.[[done]] is false, then
+       a. Let next be IteratorStep(iteratorRecord.[[iterator]]).
+       b. If next is an abrupt completion, set iteratorRecord.[[done]] to true.
+       c. ReturnIfAbrupt(next).
+       d. If next is false, set iteratorRecord.[[done]] to true.
+    2. Return NormalCompletion(empty).
+
+---*/
+var first = 0;
+var second = 0;
+function* g() {
+  first += 1;
+  yield;
+  second += 1;
+};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...[,]] of [g()]) {
+    assert.sameValue(first, 1);
+    assert.sameValue(second, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-empty.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..01077a065a16f6f49c78b00c316dbb4c60816eaa
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-empty.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element containing an "empty" array pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [generators, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    ArrayBindingPattern : [ ]
+
+    1. Return NormalCompletion(empty).
+
+---*/
+var iterations = 0;
+var iter = function*() {
+  iterations += 1;
+}();
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...[]] of [iter]) {
+    assert.sameValue(iterations, 1);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-rest.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-rest.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5cd2794cfee823ee2fa12b055c084d0cb38f19c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-ary-rest.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-ary-rest.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element containing a rest element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+var values = [1, 2, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...[...x]] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 1);
+    assert.sameValue(x[1], 2);
+    assert.sameValue(x[2], 3);
+    assert.notSameValue(x, values);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-elision.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-elision.js
new file mode 100644
index 0000000000000000000000000000000000000000..86255849a52ed205728bd8ec4093c7ae6a846fdc
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-elision.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id-elision.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element following elision elements (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    ArrayBindingPattern : [ Elisionopt BindingRestElement ]
+    1. If Elision is present, then
+       a. Let status be the result of performing
+          IteratorDestructuringAssignmentEvaluation of Elision with
+          iteratorRecord as the argument.
+       b. ReturnIfAbrupt(status).
+    2. Return the result of performing IteratorBindingInitialization for
+       BindingRestElement with iteratorRecord and environment as arguments.
+---*/
+var values = [1, 2, 3, 4, 5];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [ , , ...x] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 3);
+    assert.sameValue(x[1], 4);
+    assert.sameValue(x[2], 5);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-exhausted.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-exhausted.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b67445a4c6d6614e3f566bd134d90ae0fe80f56
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-exhausted.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id-exhausted.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: RestElement applied to an exhausted iterator (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [Symbol.iterator, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    BindingRestElement : ... BindingIdentifier
+    1. Let lhs be ResolveBinding(StringValue of BindingIdentifier,
+       environment).
+    2. ReturnIfAbrupt(lhs). 3. Let A be ArrayCreate(0). 4. Let n=0. 5. Repeat,
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. If environment is undefined, return PutValue(lhs, A).
+          ii. Return InitializeReferencedBinding(lhs, A).
+
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [, , ...x] of [[1, 2]]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..94015c56906e989f1447f06c9a8a3b9b8d433317
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Lone rest element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+    BindingRestElement : ... BindingIdentifier
+    [...] 3. Let A be ArrayCreate(0). [...] 5. Repeat
+       [...]
+       f. Let status be CreateDataProperty(A, ToString (n), nextValue).
+       [...]
+---*/
+var values = [1, 2, 3];
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...x] of [values]) {
+    assert(Array.isArray(x));
+    assert.sameValue(x.length, 3);
+    assert.sameValue(x[0], 1);
+    assert.sameValue(x[1], 2);
+    assert.sameValue(x[2], 3);
+    assert.notSameValue(x, values);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-ary.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7f0525075015d1b28f8f9846b1114ebeb9c6739
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-ary.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Reset element (nested array pattern) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...[ x ] = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..a719fd7d672552113a60e111387ff589acd73350
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-id.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Reset element (identifier) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...x = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-obj.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0a57eca9cd86d7018e0f355eb9e00d301213933
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-obj.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-init-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Reset element (nested object pattern) does not support initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...{ x } = []] of [[]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-ary.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..19dd7805b4fe0f80cb3c8455386e2da557a5a592
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-ary.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element (array binding pattern) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...[x], y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..b321a3ec963555c8cd9a1505981255237f910724
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-id.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element (identifier) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...x, y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-obj.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..24825aa3951ccbd3a7db05bab593704bc3a122f3
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-obj.js
@@ -0,0 +1,58 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-not-final-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element (object binding pattern) may not be followed by any element (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+negative:
+  phase: early
+  type: SyntaxError
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+    ArrayBindingPattern[Yield] :
+        [ Elisionopt BindingRestElement[?Yield]opt ]
+        [ BindingElementList[?Yield] ]
+        [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...{ x }, y] of [[1, 2, 3]]) {
+    
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..e1c73b95a759cefde07db908700cf7e58a8cef74
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-id.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-obj-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element containing an object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...{ length }] of [[1, 2, 3]]) {
+    assert.sameValue(length, 3);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..c94993506e570b0c6aa5657c55e2b0f6d7722328
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-prop-id.js
@@ -0,0 +1,70 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/ary-ptrn-rest-obj-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest element containing an object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.6 Runtime Semantics: IteratorBindingInitialization
+
+    BindingRestElement : ... BindingPattern
+
+    1. Let A be ArrayCreate(0).
+    [...]
+    3. Repeat
+       [...]
+       b. If iteratorRecord.[[done]] is true, then
+          i. Return the result of performing BindingInitialization of
+             BindingPattern with A and environment as the arguments.
+       [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var [...{ 0: v, 1: w, 2: x, 3: y, length: z }] of [[7, 8, 9]]) {
+    assert.sameValue(v, 7);
+    assert.sameValue(w, 8);
+    assert.sameValue(x, 9);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 3);
+
+    assert.throws(ReferenceError, function() {
+      length;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-empty.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..9315800effae00bef61964ea1da432245af07ffb
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-empty.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-empty.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: No property access occurs for an "empty" object binding pattern (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    Runtime Semantics: BindingInitialization
+
+    ObjectBindingPattern : { }
+
+    1. Return NormalCompletion(empty).
+---*/
+var accessCount = 0;
+var obj = Object.defineProperty({}, 'attr', {
+  get: function() {
+    accessCount += 1;
+  }
+});
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var {} of [obj]) {
+    assert.sameValue(accessCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-arrow.js
new file mode 100644
index 0000000000000000000000000000000000000000..294b35f833446e20eb87cd3fd25daf64b86d8ae1
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-arrow.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-arrow.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns `name` to arrow functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { arrow = () => {} } of [{}]) {
+    assert.sameValue(arrow.name, 'arrow');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..3fd837f8c6a0b92e75101694a3db753caaa1f2ff
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-class.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-class.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" classes (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { cls = class {}, xCls = class X {}, xCls2 = class { static name() {} } } of [{}]) {
+    assert.sameValue(cls.name, 'cls');
+    assert.notSameValue(xCls.name, 'xCls');
+    assert.notSameValue(xCls2.name, 'xCls2');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-cover.js
new file mode 100644
index 0000000000000000000000000000000000000000..2ccbd94270561ac6fc7e2f5350b22ab77995affe
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-cover.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-cover.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns `name` to "anonymous" functions "through" cover grammar (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { cover = (function () {}), xCover = (0, function() {})  } of [{}]) {
+    assert.sameValue(cover.name, 'cover');
+    assert.notSameValue(xCover.name, 'xCover');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-fn.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d1e1c0a9af8b7de873d0ae6f39eeb77b31f092a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-fn.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-fn.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { fn = function () {}, xFn = function x() {} } of [{}]) {
+    assert.sameValue(fn.name, 'fn');
+    assert.notSameValue(xFn.name, 'xFn');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-gen.js
new file mode 100644
index 0000000000000000000000000000000000000000..af224a5f4eaa9d9369b67867ad758b52248c577b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-fn-name-gen.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-fn-name-gen.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: SingleNameBinding assigns name to "anonymous" generator functions (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+       d. If IsAnonymousFunctionDefinition(Initializer) is true, then
+          i. Let hasNameProperty be HasOwnProperty(v, "name").
+          ii. ReturnIfAbrupt(hasNameProperty).
+          iii. If hasNameProperty is false, perform SetFunctionName(v,
+               bindingId).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { gen = function* () {}, xGen = function* x() {} } of [{}]) {
+    assert.sameValue(gen.name, 'gen');
+    assert.notSameValue(xGen.name, 'xGen');
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff50196c9f0564d7f2c71c25fbf4c1615cd94c7d
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-skipped.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    6. If Initializer is present and v is undefined, then
+       [...]
+    [...]
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { w = counter(), x = counter(), y = counter(), z = counter() } of [{ w: null, x: 0, y: false, z: '' }]) {
+    assert.sameValue(w, null);
+    assert.sameValue(x, 0);
+    assert.sameValue(y, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c7a5e6afa884ac684e90363245d2ad4c35977e9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-trailing-comma.js
@@ -0,0 +1,56 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-id-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { x, } of [{ x: 23 }]) {
+    assert.sameValue(x, 23);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..af5ab32a443fb2e3cc844c757ae5df126fe521b3
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary-init.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Object binding pattern with "nested" array binding pattern using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { w: [x, y, z] = [4, 5, 6] } of [{}]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..803325fef4262b50ee08b170281345ea1667e791
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary-trailing-comma.js
@@ -0,0 +1,56 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { x: [y], } of [{ x: [45] }]) {
+    assert.sameValue(y,45);
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary.js
new file mode 100644
index 0000000000000000000000000000000000000000..abe91d61a29be0852ae60e6ad076a8ee29bcdce5
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-ary.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-ary.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Object binding pattern with "nested" array binding pattern not using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       [...]
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { w: [x, y, z] = [4, 5, 6] } of [{ w: [7, undefined, ] }]) {
+    assert.sameValue(x, 7);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, undefined);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init-skipped.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init-skipped.js
new file mode 100644
index 0000000000000000000000000000000000000000..0ac07e7b57fa20ddcf8b89382fe3e001add89da5
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init-skipped.js
@@ -0,0 +1,78 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-init-skipped.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Destructuring initializer is not evaluated when value is not `undefined` (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    BindingElement : BindingPattern Initializeropt
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+    [...]
+---*/
+var initCount = 0;
+function counter() {
+  initCount += 1;
+}
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { s: t = counter(), u: v = counter(), w: x = counter(), y: z = counter() } of [{ s: null, u: 0, w: false, y: '' }]) {
+    assert.sameValue(t, null);
+    assert.sameValue(v, 0);
+    assert.sameValue(x, false);
+    assert.sameValue(z, '');
+    assert.sameValue(initCount, 0);
+
+    assert.throws(ReferenceError, function() {
+      s;
+    });
+    assert.throws(ReferenceError, function() {
+      u;
+    });
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+    assert.throws(ReferenceError, function() {
+      y;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..6f8c5bf0f026bd7038945d69615b1caf9fd76dab
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Binding as specified via property name, identifier, and initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { x: y = 33 } of [{ }]) {
+    assert.sameValue(y, 33);
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-trailing-comma.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-trailing-comma.js
new file mode 100644
index 0000000000000000000000000000000000000000..46f862dddfa4c9f13cdc3716622a97283262bd3b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-trailing-comma.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id-trailing-comma.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Trailing comma is allowed following BindingPropertyList (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3 Destructuring Binding Patterns
+
+    ObjectBindingPattern[Yield] :
+        { }
+        { BindingPropertyList[?Yield] }
+        { BindingPropertyList[?Yield] , }
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { x: y, } of [{ x: 23 }]) {
+    assert.sameValue(y, 23);
+
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..2afeaa7bfa760f0d4c4e4253f4cb5c10cf2c4c8c
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-id.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Binding as specified via property name and identifier (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    SingleNameBinding : BindingIdentifier Initializeropt
+
+    [...]
+    8. Return InitializeReferencedBinding(lhs, v).
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { x: y } of [{ x: 23 }]) {
+    assert.sameValue(y, 23);
+    assert.throws(ReferenceError, function() {
+      x;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-obj-init.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-obj-init.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9bac0b5d92feb7516ab5095740b11b2ec78c8f5
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-obj-init.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-obj-init.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Object binding pattern with "nested" object binding pattern using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       a. Let defaultValue be the result of evaluating Initializer.
+       b. Let v be GetValue(defaultValue).
+       c. ReturnIfAbrupt(v).
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { w: { x, y, z } = { x: 4, y: 5, z: 6 } } of [{ w: undefined }]) {
+    assert.sameValue(x, 4);
+    assert.sameValue(y, 5);
+    assert.sameValue(z, 6);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-obj.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9e4922af5f12520cee05a9f90e83d90f578a434
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-obj.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-prop-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Object binding pattern with "nested" object binding pattern not using initializer (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+
+    13.3.3.7 Runtime Semantics: KeyedBindingInitialization
+
+    [...]
+    3. If Initializer is present and v is undefined, then
+       [...]
+    4. Return the result of performing BindingInitialization for BindingPattern
+       passing v and environment as arguments.
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { w: { x, y, z } = { x: 4, y: 5, z: 6 } } of [{ w: { x: undefined, z: 7 } }]) {
+    assert.sameValue(x, undefined);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 7);
+
+    assert.throws(ReferenceError, function() {
+      w;
+    });
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-getter.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-getter.js
new file mode 100644
index 0000000000000000000000000000000000000000..3fa8e997d53c0b864b312b28443bb50b5de61fd9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-getter.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-getter.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+var count = 0;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var {...x} of [{ get v() { count++; return 2; } }]) {
+    assert.sameValue(x.v, 2);
+    assert.sameValue(count, 1);
+
+    verifyEnumerable(x, "v");
+    verifyWritable(x, "v");
+    verifyConfigurable(x, "v");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-nested-obj.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-nested-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..c254232662acc40cc80104a6209d3ee0123c0af9
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-nested-obj.js
@@ -0,0 +1,54 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-nested-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+var obj = {a: 3, b: 4};
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var {a, b, ...{c, e}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) {
+    assert.sameValue(a, 1);
+    assert.sameValue(b, 2);
+    assert.sameValue(c, 3);
+    assert.sameValue(e, 5);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-obj-nested-rest.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-obj-nested-rest.js
new file mode 100644
index 0000000000000000000000000000000000000000..fcca42d70cc5e740b8aea5d2bf8cbd1b9972423e
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-obj-nested-rest.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var {a, b, ...{c, ...rest}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) {
+    assert.sameValue(a, 1);
+    assert.sameValue(b, 2);
+    assert.sameValue(c, 3);
+
+    assert.sameValue(rest.d, 4);
+    assert.sameValue(rest.e, 5);
+
+    verifyEnumerable(rest, "d");
+    verifyWritable(rest, "d");
+    verifyConfigurable(rest, "d");
+
+    verifyEnumerable(rest, "e");
+    verifyWritable(rest, "e");
+    verifyConfigurable(rest, "e");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-obj-own-property.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-obj-own-property.js
new file mode 100644
index 0000000000000000000000000000000000000000..94c115d95ebe1b53ba77d4e9476fcfb092168c5b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-obj-own-property.js
@@ -0,0 +1,55 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-obj-own-property.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest object contains just soruce object's own properties (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+var o = Object.create({ x: 1, y: 2 });
+o.z = 3;
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var { x, ...{y , z} } of [o]) {
+    assert.sameValue(x, 1);
+    assert.sameValue(y, undefined);
+    assert.sameValue(z, 3);
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-skip-non-enumerable.js
new file mode 100644
index 0000000000000000000000000000000000000000..fbed5903f58c19be6f0e00c5a885b83137a8a94a
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-skip-non-enumerable.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest object doesn't contain non-enumerable properties (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+var o = {a: 3, b: 4};
+Object.defineProperty(o, "x", { value: 4, enumerable: false });
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var {...rest} of [o]) {
+    assert.sameValue(rest.a, 3);
+    assert.sameValue(rest.b, 4);
+    assert.sameValue(rest.x, undefined);
+
+    verifyEnumerable(rest, "a");
+    verifyWritable(rest, "a");
+    verifyConfigurable(rest, "a");
+
+    verifyEnumerable(rest, "b");
+    verifyWritable(rest, "b");
+    verifyConfigurable(rest, "b");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+
diff --git a/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-val-obj.js b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-val-obj.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fc93c481eeb73bc87b243d902d2a20fa3d43b3b
--- /dev/null
+++ b/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-rest-val-obj.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/dstr-binding/obj-ptrn-rest-val-obj.case
+// - src/dstr-binding/default/for-await-of-async-gen-var.template
+/*---
+description: Rest object contains just unextracted data (for-await-of statement)
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+features: [object-rest, destructuring-binding, async-iteration]
+flags: [generated, async]
+includes: [propertyHelper.js]
+info: |
+    IterationStatement :
+        for await ( var ForBinding of AssignmentExpression ) Statement
+
+    [...]
+    2. Return ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult,
+        varBinding, labelSet, async).
+
+    13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+    [...]
+    3. Let destructuring be IsDestructuring of lhs.
+    [...]
+    5. Repeat
+       [...]
+       h. If destructuring is false, then
+          [...]
+       i. Else
+          i. If lhsKind is assignment, then
+             [...]
+          ii. Else if lhsKind is varBinding, then
+              1. Assert: lhs is a ForBinding.
+              2. Let status be the result of performing BindingInitialization
+                 for lhs passing nextValue and undefined as the arguments.
+          [...]
+---*/
+
+var iterCount = 0;
+
+async function *fn() {
+  for await (var {a, b, ...rest} of [{x: 1, y: 2, a: 5, b: 3}]) {
+    assert.sameValue(rest.x, 1);
+    assert.sameValue(rest.y, 2);
+    assert.sameValue(rest.a, undefined);
+    assert.sameValue(rest.b, undefined);
+
+    verifyEnumerable(rest, "x");
+    verifyWritable(rest, "x");
+    verifyConfigurable(rest, "x");
+
+    verifyEnumerable(rest, "y");
+    verifyWritable(rest, "y");
+    verifyConfigurable(rest, "y");
+
+
+    iterCount += 1;
+  }
+}
+
+fn().next()
+  .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE)
+  .then($DONE, $DONE);
+