diff --git a/src/async-functions/syntax/async-class-decl-static-private-method.template b/src/async-functions/syntax/async-class-decl-static-private-method.template
index 0bede5a459..5d9e912804 100644
--- a/src/async-functions/syntax/async-class-decl-static-private-method.template
+++ b/src/async-functions/syntax/async-class-decl-static-private-method.template
@@ -16,7 +16,7 @@ info: |
 
   AsyncMethod :
     async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
-features: [async-functions, class-methods-private]
+features: [async-functions, class-static-methods-private]
 ---*/
 
 class C { static async #method() {
diff --git a/src/async-functions/syntax/async-class-expr-static-private-method.template b/src/async-functions/syntax/async-class-expr-static-private-method.template
index ab154f12f5..136b6782eb 100644
--- a/src/async-functions/syntax/async-class-expr-static-private-method.template
+++ b/src/async-functions/syntax/async-class-expr-static-private-method.template
@@ -16,7 +16,7 @@ info: |
 
   AsyncMethod :
     async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
-features: [async-functions, class-methods-private]
+features: [async-functions, class-static-methods-private]
 ---*/
 
 var C = class { static async #method() {
diff --git a/src/async-generators/syntax/async-class-decl-static-private-method.template b/src/async-generators/syntax/async-class-decl-static-private-method.template
index afa110b27c..ad427cca7b 100644
--- a/src/async-generators/syntax/async-class-decl-static-private-method.template
+++ b/src/async-generators/syntax/async-class-decl-static-private-method.template
@@ -16,7 +16,7 @@ info: |
 
   AsyncGeneratorMethod :
     async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
-features: [async-iteration, class-methods-private]
+features: [async-iteration, class-static-methods-private]
 ---*/
 
 class C { static async *#gen() {
diff --git a/src/async-generators/syntax/async-class-expr-static-private-method.template b/src/async-generators/syntax/async-class-expr-static-private-method.template
index c69608ebf4..52324446ea 100644
--- a/src/async-generators/syntax/async-class-expr-static-private-method.template
+++ b/src/async-generators/syntax/async-class-expr-static-private-method.template
@@ -16,7 +16,7 @@ info: |
 
   AsyncGeneratorMethod :
     async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
-features: [async-iteration, class-methods-private]
+features: [async-iteration, class-static-methods-private]
 ---*/
 
 var C = class { static async *#gen() {
diff --git a/src/generators/default/class-decl-private-method.template b/src/generators/default/class-decl-private-method.template
index 3d5c4f6916..933dcfcbb6 100644
--- a/src/generators/default/class-decl-private-method.template
+++ b/src/generators/default/class-decl-private-method.template
@@ -20,7 +20,7 @@ features: [generators, class-methods-private]
 
 var callCount = 0;
 
-class C { 
+class C {
     *#gen() {
         callCount += 1;
         /*{ body }*/
diff --git a/src/generators/syntax/class-decl-static-private-method.template b/src/generators/syntax/class-decl-static-private-method.template
index cf55b4d5ac..c240dbee80 100644
--- a/src/generators/syntax/class-decl-static-private-method.template
+++ b/src/generators/syntax/class-decl-static-private-method.template
@@ -15,7 +15,7 @@ info: |
 
   GeneratorMethod :
     * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
-features: [generators, class-methods-private]
+features: [generators, class-static-methods-private]
 ---*/
 
 class C {static *#gen() {
diff --git a/src/generators/syntax/class-expr-static-private-method.template b/src/generators/syntax/class-expr-static-private-method.template
index b66123d79d..e436df940f 100644
--- a/src/generators/syntax/class-expr-static-private-method.template
+++ b/src/generators/syntax/class-expr-static-private-method.template
@@ -15,7 +15,7 @@ info: |
 
   GeneratorMethod :
     * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
-features: [generators, class-methods-private]
+features: [generators, class-static-methods-private]
 ---*/
 
 var C = class { static *#gen() {
diff --git a/test/language/expressions/class/async-gen-private-method-await-as-binding-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..8fa3749e70
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    var \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-await-as-binding-identifier.js b/test/language/expressions/class/async-gen-private-method-await-as-binding-identifier.js
new file mode 100644
index 0000000000..6fa1902112
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    var await;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-await-as-identifier-reference-escaped.js b/test/language/expressions/class/async-gen-private-method-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..72c1b1fbba
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    void \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-await-as-identifier-reference.js b/test/language/expressions/class/async-gen-private-method-await-as-identifier-reference.js
new file mode 100644
index 0000000000..544dfb3454
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    void await;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-await-as-label-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..3eb1e6f078
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    \u0061wait: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-await-as-label-identifier.js b/test/language/expressions/class/async-gen-private-method-await-as-label-identifier.js
new file mode 100644
index 0000000000..08ea5255b0
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    await: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-await-as-binding-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-static-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..794a2bf255
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    var \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-await-as-binding-identifier.js b/test/language/expressions/class/async-gen-private-method-static-await-as-binding-identifier.js
new file mode 100644
index 0000000000..88fc1e49bf
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    var await;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-await-as-identifier-reference-escaped.js b/test/language/expressions/class/async-gen-private-method-static-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..3c49bc3488
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    void \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-await-as-identifier-reference.js b/test/language/expressions/class/async-gen-private-method-static-await-as-identifier-reference.js
new file mode 100644
index 0000000000..dc3f104101
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    void await;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-await-as-label-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-static-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..7960a94dab
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    \u0061wait: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-await-as-label-identifier.js b/test/language/expressions/class/async-gen-private-method-static-await-as-label-identifier.js
new file mode 100644
index 0000000000..60cf1ade22
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    await: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-as-binding-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-static-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..820f61eda5
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    var yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-as-binding-identifier.js b/test/language/expressions/class/async-gen-private-method-static-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..b29bb2f8bf
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    var yield;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-as-identifier-reference-escaped.js b/test/language/expressions/class/async-gen-private-method-static-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..1d74a5ca18
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    void yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-as-identifier-reference.js b/test/language/expressions/class/async-gen-private-method-static-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..7dbfcfdd7a
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    void yield;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-as-label-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-static-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..f217faf8d9
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    yi\u0065ld: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-as-label-identifier.js b/test/language/expressions/class/async-gen-private-method-static-yield-as-label-identifier.js
new file mode 100644
index 0000000000..de1d36a471
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier.case
+// - src/async-generators/syntax/async-class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async *#gen() {
+    yield: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-identifier-spread-strict.js b/test/language/expressions/class/async-gen-private-method-static-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..97e390c5f2
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-identifier-spread-strict.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-spread-strict.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-identifier-strict.js b/test/language/expressions/class/async-gen-private-method-static-yield-identifier-strict.js
new file mode 100644
index 0000000000..6399fd4627
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-identifier-strict.js
@@ -0,0 +1,53 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-strict.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-catch.js b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-catch.js
new file mode 100644
index 0000000000..7cf9caa824
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-catch.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-catch.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}).catch(rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+});
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-async-iterator.js b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-async-iterator.js
new file mode 100644
index 0000000000..3a5078c0f9
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-async-iterator.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-async-iterator.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: yield * [Promise.reject(value)] is treated as throw value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        for await (let line of readFile()) {
+          yield line;
+        }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-sync-iterator.js b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-sync-iterator.js
new file mode 100644
index 0000000000..d14246a5ca
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-sync-iterator.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-sync-iterator.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: yield Promise.reject(value) in for-await-of is treated as throw value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        for await (let value of iterable) {
+          yield value;
+        }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-async-iterator.js b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-async-iterator.js
new file mode 100644
index 0000000000..e3caca2ca2
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-async-iterator.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-async-iterator.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield * readFile();
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}, $DONE).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-sync-iterator.js b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-sync-iterator.js
new file mode 100644
index 0000000000..8dd4ae7d77
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-sync-iterator.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-sync-iterator.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield * iterable;
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next.js b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next.js
new file mode 100644
index 0000000000..03be053f31
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-promise-reject-next.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-spread-arr-multiple.js b/test/language/expressions/class/async-gen-private-method-static-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..ca2490c4c7
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-spread-arr-multiple.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-multiple.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+
+item.then(({ done, value }) => {
+  item = iter.next(value);
+
+  item.then(({ done, value }) => {
+    assert(compareArray(value, arr));
+    assert.sameValue(done, false);
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-spread-arr-single.js b/test/language/expressions/class/async-gen-private-method-static-yield-spread-arr-single.js
new file mode 100644
index 0000000000..051a73404c
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-spread-arr-single.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-single.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+
+item.then(({ done, value }) => {
+  assert.notSameValue(value, arr, 'value is a new array');
+  assert(Array.isArray(value), 'value is an Array exotic object');
+  assert.sameValue(value.length, 3)
+  assert.sameValue(value[0], 'a');
+  assert.sameValue(value[1], 'b');
+  assert.sameValue(value[2], 'c');
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-spread-obj.js b/test/language/expressions/class/async-gen-private-method-static-yield-spread-obj.js
new file mode 100644
index 0000000000..b288a28028
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-spread-obj.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-obj.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Use yield value in a object spread position (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-static-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+item.then(({ done, value }) => {
+  assert.sameValue(value.x, 42);
+  assert.sameValue(value.y, 39);
+  assert.sameValue(Object.keys(value).length, 2);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-async-next.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-async-next.js
new file mode 100644
index 0000000000..9ae13afa52
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-async-next.js
@@ -0,0 +1,234 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-next.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Execution order for yield* with async iterator and next() (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({ name: "get [Symbol.iterator]" });
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({
+      name: "get [Symbol.asyncIterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.asyncIterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "asyncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-promise-1",
+                get then() {
+                  log.push({
+                    name: "get next then (1)",
+                    thisValue: this
+                  });
+                  return function(resolve) {
+                    log.push({
+                      name: "call next then (1)",
+                      thisValue: this,
+                      args: [...arguments]
+                    });
+
+                    resolve({
+                      name: "next-result-1",
+                      get value() {
+                        log.push({
+                          name: "get next value (1)",
+                          thisValue: this
+                        });
+                        return "next-value-1";
+                      },
+                      get done() {
+                        log.push({
+                          name: "get next done (1)",
+                          thisValue: this
+                        });
+                        return false;
+                      }
+                    });
+                  };
+                }
+              };
+            }
+
+            return {
+              name: "next-promise-2",
+              get then() {
+                log.push({
+                  name: "get next then (2)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call next then (2)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "next-result-2",
+                    get value() {
+                      log.push({
+                        name: "get next value (2)",
+                        thisValue: this
+                      });
+                      return "next-value-2";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get next done (2)",
+                        thisValue: this
+                      });
+                      return true;
+                    }
+                  });
+                };
+              }
+            };
+          };
+        }
+      };
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+  assert.sameValue(log[1].thisValue, obj, "get [Symbol.asyncIterator] thisValue");
+
+  assert.sameValue(log[2].name, "call [Symbol.asyncIterator]");
+  assert.sameValue(log[2].thisValue, obj, "[Symbol.asyncIterator] thisValue");
+  assert.sameValue(log[2].args.length, 0, "[Symbol.asyncIterator] args.length");
+
+  assert.sameValue(log[3].name, "get next");
+  assert.sameValue(log[3].thisValue.name, "asyncIterator", "get next thisValue");
+
+  assert.sameValue(log[4].name, "call next");
+  assert.sameValue(log[4].thisValue.name, "asyncIterator", "next thisValue");
+  assert.sameValue(log[4].args.length, 1, "next args.length");
+  assert.sameValue(log[4].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[5].name, "get next then (1)");
+  assert.sameValue(log[5].thisValue.name, "next-promise-1", "get next then thisValue");
+
+  assert.sameValue(log[6].name, "call next then (1)");
+  assert.sameValue(log[6].thisValue.name, "next-promise-1", "next then thisValue");
+  assert.sameValue(log[6].args.length, 2, "next then args.length");
+  assert.sameValue(typeof log[6].args[0], "function", "next then args[0]");
+  assert.sameValue(typeof log[6].args[1], "function", "next then args[1]");
+
+  assert.sameValue(log[7].name, "get next done (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[8].name, "get next value (1)");
+  assert.sameValue(log[8].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 9, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[9].name, "call next");
+    assert.sameValue(log[9].thisValue.name, "asyncIterator", "next thisValue");
+    assert.sameValue(log[9].args.length, 1, "next args.length");
+    assert.sameValue(log[9].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[10].name, "get next then (2)");
+    assert.sameValue(log[10].thisValue.name, "next-promise-2", "get next then thisValue");
+
+    assert.sameValue(log[11].name, "call next then (2)");
+    assert.sameValue(log[11].thisValue.name, "next-promise-2", "next then thisValue");
+    assert.sameValue(log[11].args.length, 2, "next then args.length");
+    assert.sameValue(typeof log[11].args[0], "function", "next then args[0]");
+    assert.sameValue(typeof log[11].args[1], "function", "next then args[1]");
+
+    assert.sameValue(log[12].name, "get next done (2)");
+    assert.sameValue(log[12].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[13].name, "get next value (2)");
+    assert.sameValue(log[13].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[14].name, "after yield*");
+    assert.sameValue(log[14].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 15, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-async-return.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-async-return.js
new file mode 100644
index 0000000000..ffe62ff333
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-async-return.js
@@ -0,0 +1,250 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-return.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: execution order for yield* with async iterator and return() (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator, « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. If generatorKind is async, then set value to ? Await(value).
+             3. Return Completion{[[Type]]: return, [[Value]]: value, [[Target]]: empty}.
+        ix. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+        ...
+
+    AsyncGeneratorYield ( value )
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var returnCount = 0;
+    return {
+      name: 'asyncIterator',
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-promise-1",
+              get then() {
+                log.push({
+                  name: "get return then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call return then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "return-result-1",
+                    get value() {
+                      log.push({
+                        name: "get return value (1)",
+                        thisValue: this
+                      });
+                      return "return-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get return done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "return-promise-2",
+            get then() {
+              log.push({
+                name: "get return then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call return then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "return-result-2",
+                  get value() {
+                    log.push({
+                      name: "get return value (2)",
+                      thisValue: this
+                    });
+                    return "return-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get return done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return then (1)");
+    assert.sameValue(log[4].thisValue.name, "return-promise-1", "get return then thisValue");
+
+    assert.sameValue(log[5].name, "call return then (1)");
+    assert.sameValue(log[5].thisValue.name, "return-promise-1", "return then thisValue");
+    assert.sameValue(log[5].args.length, 2, "return then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "return then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "return then args[1]");
+
+    assert.sameValue(log[6].name, "get return done (1)");
+    assert.sameValue(log[6].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[7].name, "get return value (1)");
+    assert.sameValue(log[7].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get return");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get return thisValue");
+
+      assert.sameValue(log[9].name, "call return");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "return thisValue");
+      assert.sameValue(log[9].args.length, 1, "return args.length");
+      assert.sameValue(log[9].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[10].name, "get return then (2)");
+      assert.sameValue(log[10].thisValue.name, "return-promise-2", "get return then thisValue");
+
+      assert.sameValue(log[11].name, "call return then (2)");
+      assert.sameValue(log[11].thisValue.name, "return-promise-2", "return then thisValue");
+      assert.sameValue(log[11].args.length, 2, "return then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "return then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "return then args[1]");
+
+      assert.sameValue(log[12].name, "get return done (2)");
+      assert.sameValue(log[12].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[13].name, "get return value (2)");
+      assert.sameValue(log[13].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 14, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-async-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-async-throw.js
new file mode 100644
index 0000000000..87d0eda7cf
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-async-throw.js
@@ -0,0 +1,258 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: execution order for yield* with async iterator and throw() (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Let resultValue be Return ? IteratorValue(innerResult).
+            b. If generatorKind is async, then set resultValue to ? Await(resultValue).
+            c. Return resultValue.
+          7. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+      ...
+
+    AsyncGeneratorYield ( value )
+
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var throwCount = 0;
+    return {
+      name: "asyncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-promise-1",
+              get then() {
+                log.push({
+                  name: "get throw then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call throw then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "throw-result-1",
+                    get value() {
+                      log.push({
+                        name: "get throw value (1)",
+                        thisValue: this
+                      });
+                      return "throw-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get throw done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "throw-promise-2",
+            get then() {
+              log.push({
+                name: "get throw then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call throw then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "throw-result-2",
+                  get value() {
+                    log.push({
+                      name: "get throw value (2)",
+                      thisValue: this
+                    });
+                    return "throw-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get throw done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw then (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-promise-1", "get throw thisValue");
+
+    assert.sameValue(log[5].name, "call throw then (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-promise-1", "throw thisValue");
+    assert.sameValue(log[5].args.length, 2, "throw then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "throw then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "throw then args[1]");
+
+    assert.sameValue(log[6].name, "get throw done (1)");
+    assert.sameValue(log[6].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[7].name, "get throw value (1)");
+    assert.sameValue(log[7].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get throw");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get throw thisValue");
+
+      assert.sameValue(log[9].name, "call throw");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "throw thisValue");
+      assert.sameValue(log[9].args.length, 1, "throw args.length");
+      assert.sameValue(log[9].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[10].name, "get throw then (2)");
+      assert.sameValue(log[10].thisValue.name, "throw-promise-2", "get throw thisValue");
+
+      assert.sameValue(log[11].name, "call throw then (2)");
+      assert.sameValue(log[11].thisValue.name, "throw-promise-2", "throw thisValue");
+      assert.sameValue(log[11].args.length, 2, "throw then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "throw then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "throw then args[1]");
+
+      assert.sameValue(log[12].name, "get throw done (2)");
+      assert.sameValue(log[12].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[13].name, "get throw value (2)");
+      assert.sameValue(log[13].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[14].name, "after yield*");
+      assert.sameValue(log[14].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 15, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-expr-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-expr-abrupt.js
new file mode 100644
index 0000000000..eac46893df
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-expr-abrupt.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-expr-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting yield* operand (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    ...
+
+---*/
+var obj = {};
+var abrupt = function() {
+  throw obj;
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* abrupt();
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, obj, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-get-abrupt.js
new file mode 100644
index 0000000000..7029c56050
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-get-abrupt.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.asyncIterator] (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  get [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..89ec007d61
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-boolean-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (boolean) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: false
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-number-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-number-throw.js
new file mode 100644
index 0000000000..4a99bac22d
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-number-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-number-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (number) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: 0
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-object-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-object-throw.js
new file mode 100644
index 0000000000..70e7baeed5
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-object-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-object-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (object) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: {}
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-string-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-string-throw.js
new file mode 100644
index 0000000000..c3464ff404
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-string-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-string-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (string) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: ''
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..4ae2d74a15
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-symbol-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (symbol) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: Symbol.asyncIterator
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-null-sync-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-null-sync-get-abrupt.js
new file mode 100644
index 0000000000..2ecd88a808
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-null-sync-get-abrupt.js
@@ -0,0 +1,94 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after null @@asyncIterator (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-abrupt.js
new file mode 100644
index 0000000000..4feb8ca988
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-abrupt.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.asyncIterator] (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-boolean-throw.js
new file mode 100644
index 0000000000..6bbced4d77
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-boolean-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-boolean-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - boolean (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-null-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-null-throw.js
new file mode 100644
index 0000000000..124044db6e
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-null-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-null-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - null (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-number-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-number-throw.js
new file mode 100644
index 0000000000..32c32490bf
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-number-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-number-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - number (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return 42;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-string-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-string-throw.js
new file mode 100644
index 0000000000..82d2e5f043
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-string-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-string-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - string (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return '42';
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-symbol-throw.js
new file mode 100644
index 0000000000..0bfd04a600
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-symbol-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-symbol-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - symbol (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return Symbol.asyncIterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-undefined-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-undefined-throw.js
new file mode 100644
index 0000000000..e781f0bf90
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-returns-undefined-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-undefined-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - undefined (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-undefined-sync-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-undefined-sync-get-abrupt.js
new file mode 100644
index 0000000000..638baadc17
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-async-undefined-sync-get-abrupt.js
@@ -0,0 +1,94 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after undefined @@asyncIterator (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-get-abrupt.js
new file mode 100644
index 0000000000..291ec8a6ff
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-get-abrupt.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.iterator] (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..7865731e76
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-boolean-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (boolean) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: false
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-number-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-number-throw.js
new file mode 100644
index 0000000000..0bd1c16d38
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-number-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (number) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: 0
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-object-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-object-throw.js
new file mode 100644
index 0000000000..e776365d41
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-object-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (object) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: {}
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-string-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-string-throw.js
new file mode 100644
index 0000000000..dca9889476
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-string-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (string) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: ''
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..512a1ebd14
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-symbol-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (symbol) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: Symbol.iterator
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-abrupt.js
new file mode 100644
index 0000000000..0eceee73ff
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-abrupt.js
@@ -0,0 +1,82 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.iterator] (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-boolean-throw.js
new file mode 100644
index 0000000000..f4469eb59b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-boolean-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - boolean (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-null-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-null-throw.js
new file mode 100644
index 0000000000..e42fe2ae32
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-null-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-null-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - null (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-number-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-number-throw.js
new file mode 100644
index 0000000000..3732426b8a
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-number-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-number-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - number (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return 0;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-string-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-string-throw.js
new file mode 100644
index 0000000000..b0960e20e9
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-string-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-string-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - string (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return '';
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-symbol-throw.js
new file mode 100644
index 0000000000..e8d3189c2b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-symbol-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - symbol (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return Symbol.iterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-undefined-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-undefined-throw.js
new file mode 100644
index 0000000000..1fae26f520
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-getiter-sync-returns-undefined-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - undefined (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-done-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-done-get-abrupt.js
new file mode 100644
index 0000000000..ce4b4966bd
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-done-get-abrupt.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-done-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting done (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get done() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-returns-abrupt.js
new file mode 100644
index 0000000000..2f8f02e28e
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-returns-abrupt.js
@@ -0,0 +1,80 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while calling next (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-value-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-value-get-abrupt.js
new file mode 100644
index 0000000000..1cce9f4b5c
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-call-value-get-abrupt.js
@@ -0,0 +1,90 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-value-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting value (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          done: true,
+          get value() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-get-abrupt.js
new file mode 100644
index 0000000000..d3082648e4
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-get-abrupt.js
@@ -0,0 +1,80 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Abrupt completion while getting next (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      get next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-non-object-ignores-then.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-non-object-ignores-then.js
new file mode 100644
index 0000000000..0dd5915ff7
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-non-object-ignores-then.js
@@ -0,0 +1,100 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-non-object-ignores-then.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: If next() value is not-object, do not access respective then property (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+
+---*/
+Number.prototype.then = function() {
+  throw new Test262Error('Number#then should not be used');
+};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return 42;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, 'TypeError');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..bb85ca50e7
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-boolean-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - boolean (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: true
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-null-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-null-throw.js
new file mode 100644
index 0000000000..fbe9e4d974
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-null-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-null-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - null (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: null
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-number-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-number-throw.js
new file mode 100644
index 0000000000..6a7b05c8a0
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-number-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-number-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - number (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: 42
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-object-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-object-throw.js
new file mode 100644
index 0000000000..b88dd570a4
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-object-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-object-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - object (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: {}
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-string-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-string-throw.js
new file mode 100644
index 0000000000..c5597af4a4
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-string-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-string-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - string (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: ''
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..72c31f73f8
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-symbol-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - symbol (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: Symbol('oi')
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-undefined-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-undefined-throw.js
new file mode 100644
index 0000000000..8f2e964501
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-not-callable-undefined-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-undefined-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - undefined (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: undefined
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-get-abrupt.js
new file mode 100644
index 0000000000..480d8c64a8
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-get-abrupt.js
@@ -0,0 +1,104 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-get-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Return abrupt after getting next().then (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-boolean-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-boolean-fulfillpromise.js
new file mode 100644
index 0000000000..5d68064b91
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-boolean-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-boolean-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (boolean) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: true,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-null-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-null-fulfillpromise.js
new file mode 100644
index 0000000000..6082230b17
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-null-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-null-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (null) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: null,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-number-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-number-fulfillpromise.js
new file mode 100644
index 0000000000..e336c7a19b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-number-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-number-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (number) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: 39,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-object-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-object-fulfillpromise.js
new file mode 100644
index 0000000000..6bbc9001a5
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-object-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-object-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (object) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: {},
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-string-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-string-fulfillpromise.js
new file mode 100644
index 0000000000..110db43d7f
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-string-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-string-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (string) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: '',
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-symbol-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-symbol-fulfillpromise.js
new file mode 100644
index 0000000000..3be5426208
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-symbol-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-symbol-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (symbol) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: Symbol('oi'),
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-undefined-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-undefined-fulfillpromise.js
new file mode 100644
index 0000000000..6f329bf7aa
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-non-callable-undefined-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-undefined-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (undefined) (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: undefined,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-returns-abrupt.js
new file mode 100644
index 0000000000..4be44dfb0a
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-next-then-returns-abrupt.js
@@ -0,0 +1,104 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: Return abrupt after calling next().then (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-next.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-next.js
new file mode 100644
index 0000000000..ec12b1168e
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-next.js
@@ -0,0 +1,237 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-next.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: execution order for yield* with sync iterator and next() (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    5. Let received be NormalCompletion(undefined).
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        i. Let innerResult be ? IteratorNext(iterator, received.[[Value]]).
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+        vii. Let received be GeneratorYield(innerResult).
+      ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    %AsyncFromSyncIteratorPrototype%.next ( value )
+
+    ...
+    5. Let nextResult be IteratorNext(syncIterator, value).
+    ...
+    7. Let nextValue be IteratorValue(nextResult).
+    ...
+    9. Let nextDone be IteratorComplete(nextResult).
+    ...
+    12. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « nextValue »).
+    ...
+    14. Set onFulfilled.[[Done]] to nextDone.
+    15. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+    Async Iterator Value Unwrap Functions
+
+    1. Return ! CreateIterResultObject(value, F.[[Done]]).
+
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({
+      name: "get [Symbol.iterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.iterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "syncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-result-1",
+                get value() {
+                  log.push({
+                    name: "get next value (1)",
+                    thisValue: this
+                  });
+                  return "next-value-1";
+                },
+                get done() {
+                  log.push({
+                    name: "get next done (1)",
+                    thisValue: this
+                  });
+                  return false;
+                }
+              };
+            }
+
+            return {
+              name: "next-result-2",
+              get value() {
+                log.push({
+                  name: "get next value (2)",
+                  thisValue: this
+                });
+                return "next-value-2";
+              },
+              get done() {
+                log.push({
+                  name: "get next done (2)",
+                  thisValue: this
+                });
+                return true;
+              }
+            };
+          };
+        }
+      };
+    };
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({ name: "get [Symbol.asyncIterator]" });
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+
+  assert.sameValue(log[2].name, "get [Symbol.iterator]");
+  assert.sameValue(log[2].thisValue, obj, "get [Symbol.iterator] thisValue");
+
+  assert.sameValue(log[3].name, "call [Symbol.iterator]");
+  assert.sameValue(log[3].thisValue, obj, "[Symbol.iterator] thisValue");
+  assert.sameValue(log[3].args.length, 0, "[Symbol.iterator] args.length");
+
+  assert.sameValue(log[4].name, "get next");
+  assert.sameValue(log[4].thisValue.name, "syncIterator", "get next thisValue");
+
+  assert.sameValue(log[5].name, "call next");
+  assert.sameValue(log[5].thisValue.name, "syncIterator", "next thisValue");
+  assert.sameValue(log[5].args.length, 1, "next args.length");
+  assert.sameValue(log[5].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[6].name, "get next done (1)");
+  assert.sameValue(log[6].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[7].name, "get next value (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 8, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[8].name, "call next");
+    assert.sameValue(log[8].thisValue.name, "syncIterator", "next thisValue");
+    assert.sameValue(log[8].args.length, 1, "next args.length");
+    assert.sameValue(log[8].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[9].name, "get next done (2)");
+    assert.sameValue(log[9].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[10].name, "get next value (2)");
+    assert.sameValue(log[10].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[11].name, "after yield*");
+    assert.sameValue(log[11].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 12, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-return.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-return.js
new file mode 100644
index 0000000000..e552ab24d7
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-return.js
@@ -0,0 +1,212 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-return.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: execution order for yield* with sync iterator and return() (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator,
+            « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to
+           ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. Return Completion{[[Type]]: return, [[Value]]: value,
+                [[Target]]: empty}.
+        ix. Let received be GeneratorYield(innerResult).
+
+    %AsyncFromSyncIteratorPrototype%.return ( value )
+
+    5. Let return be GetMethod(syncIterator, "return").
+    ...
+    ...
+    8. Let returnResult be Call(return, syncIterator, « value »).
+    ...
+    11. Let returnValue be IteratorValue(returnResult).
+    ..
+    13. Let returnDone be IteratorComplete(returnResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined, « returnValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to returnDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var returnCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-result-1",
+              get value() {
+                log.push({
+                  name: "get return value (1)",
+                  thisValue: this
+                });
+                return "return-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get return done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "return-result-2",
+            get value() {
+              log.push({
+                name: "get return value (2)",
+                thisValue: this
+              });
+              return "return-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get return done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return done (1)");
+    assert.sameValue(log[4].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[5].name, "get return value (1)");
+    assert.sameValue(log[5].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get return");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
+
+      assert.sameValue(log[7].name, "call return");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
+      assert.sameValue(log[7].args.length, 1, "return args.length");
+      assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[8].name, "get return done (2)");
+      assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[9].name, "get return value (2)");
+      assert.sameValue(log[9].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 10, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-throw.js b/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-throw.js
new file mode 100644
index 0000000000..7d75d915ef
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-static-yield-star-sync-throw.js
@@ -0,0 +1,218 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-throw.case
+// - src/async-generators/default/async-class-expr-static-private-method.template
+/*---
+description: execution order for yield* with sync iterator and throw() (Static async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Return ? IteratorValue(innerResult).
+          7. Let received be GeneratorYield(innerResult).
+      ...
+
+    %AsyncFromSyncIteratorPrototype%.throw ( value )
+
+    ...
+    5. Let throw be GetMethod(syncIterator, "throw").
+    ...
+    8. Let throwResult be Call(throw, syncIterator, « value »).
+    ...
+    11. Let throwValue be IteratorValue(throwResult).
+    ...
+    13. Let throwDone be IteratorComplete(throwResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « throwValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to throwDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var throwCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-result-1",
+              get value() {
+                log.push({
+                  name: "get throw value (1)",
+                  thisValue: this
+                });
+                return "throw-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get throw done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "throw-result-2",
+            get value() {
+              log.push({
+                name: "get throw value (2)",
+                thisValue: this
+              });
+              return "throw-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get throw done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw done (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[5].name, "get throw value (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get throw");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
+
+      assert.sameValue(log[7].name, "call throw");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
+      assert.sameValue(log[7].args.length, 1, "throw args.length");
+      assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[8].name, "get throw done (2)");
+      assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[9].name, "get throw value (2)");
+      assert.sameValue(log[9].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[10].name, "after yield*");
+      assert.sameValue(log[10].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 11, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-as-binding-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..e73503e929
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    var yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-yield-as-binding-identifier.js b/test/language/expressions/class/async-gen-private-method-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..47c13d57a9
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    var yield;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-yield-as-identifier-reference-escaped.js b/test/language/expressions/class/async-gen-private-method-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..93442dd7ae
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    void yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-yield-as-identifier-reference.js b/test/language/expressions/class/async-gen-private-method-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..cedb862550
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    void yield;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-yield-as-label-identifier-escaped.js b/test/language/expressions/class/async-gen-private-method-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..1d5580f0f6
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    yi\u0065ld: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-yield-as-label-identifier.js b/test/language/expressions/class/async-gen-private-method-yield-as-label-identifier.js
new file mode 100644
index 0000000000..0426cab934
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier.case
+// - src/async-generators/syntax/async-class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async generator private method as a ClassExpression element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async *#gen() {
+    yield: ;
+}};
diff --git a/test/language/expressions/class/async-gen-private-method-yield-identifier-spread-strict.js b/test/language/expressions/class/async-gen-private-method-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..8047dc9643
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-identifier-spread-strict.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-spread-strict.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-identifier-strict.js b/test/language/expressions/class/async-gen-private-method-yield-identifier-strict.js
new file mode 100644
index 0000000000..f0a34bf93f
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-identifier-strict.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-strict.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-catch.js b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-catch.js
new file mode 100644
index 0000000000..25a9f68c2b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-catch.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-catch.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}).catch(rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+});
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-for-await-of-async-iterator.js b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-for-await-of-async-iterator.js
new file mode 100644
index 0000000000..a2fd7c9a80
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-for-await-of-async-iterator.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-async-iterator.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: yield * [Promise.reject(value)] is treated as throw value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        for await (let line of readFile()) {
+          yield line;
+        }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-for-await-of-sync-iterator.js b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-for-await-of-sync-iterator.js
new file mode 100644
index 0000000000..c878da09a2
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-for-await-of-sync-iterator.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-sync-iterator.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: yield Promise.reject(value) in for-await-of is treated as throw value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        for await (let value of iterable) {
+          yield value;
+        }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-yield-star-async-iterator.js b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-yield-star-async-iterator.js
new file mode 100644
index 0000000000..44a57ad619
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-yield-star-async-iterator.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-async-iterator.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield * readFile();
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}, $DONE).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-yield-star-sync-iterator.js b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-yield-star-sync-iterator.js
new file mode 100644
index 0000000000..64a4355042
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next-yield-star-sync-iterator.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-sync-iterator.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield * iterable;
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next.js b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next.js
new file mode 100644
index 0000000000..7ee5e440a8
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-promise-reject-next.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-spread-arr-multiple.js b/test/language/expressions/class/async-gen-private-method-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..3ddff189c4
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-spread-arr-multiple.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-multiple.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Use yield value in a array spread position (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+
+item.then(({ done, value }) => {
+  item = iter.next(value);
+
+  item.then(({ done, value }) => {
+    assert(compareArray(value, arr));
+    assert.sameValue(done, false);
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-spread-arr-single.js b/test/language/expressions/class/async-gen-private-method-yield-spread-arr-single.js
new file mode 100644
index 0000000000..736e51d097
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-spread-arr-single.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-single.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Use yield value in a array spread position (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+
+item.then(({ done, value }) => {
+  assert.notSameValue(value, arr, 'value is a new array');
+  assert(Array.isArray(value), 'value is an Array exotic object');
+  assert.sameValue(value.length, 3)
+  assert.sameValue(value[0], 'a');
+  assert.sameValue(value[1], 'b');
+  assert.sameValue(value[2], 'c');
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-spread-obj.js b/test/language/expressions/class/async-gen-private-method-yield-spread-obj.js
new file mode 100644
index 0000000000..0a66df31dc
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-spread-obj.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-obj.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Use yield value in a object spread position (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+item.then(({ done, value }) => {
+  assert.sameValue(value.x, 42);
+  assert.sameValue(value.y, 39);
+  assert.sameValue(Object.keys(value).length, 2);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-async-next.js b/test/language/expressions/class/async-gen-private-method-yield-star-async-next.js
new file mode 100644
index 0000000000..f90d553efc
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-async-next.js
@@ -0,0 +1,238 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-next.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Execution order for yield* with async iterator and next() (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({ name: "get [Symbol.iterator]" });
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({
+      name: "get [Symbol.asyncIterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.asyncIterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "asyncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-promise-1",
+                get then() {
+                  log.push({
+                    name: "get next then (1)",
+                    thisValue: this
+                  });
+                  return function(resolve) {
+                    log.push({
+                      name: "call next then (1)",
+                      thisValue: this,
+                      args: [...arguments]
+                    });
+
+                    resolve({
+                      name: "next-result-1",
+                      get value() {
+                        log.push({
+                          name: "get next value (1)",
+                          thisValue: this
+                        });
+                        return "next-value-1";
+                      },
+                      get done() {
+                        log.push({
+                          name: "get next done (1)",
+                          thisValue: this
+                        });
+                        return false;
+                      }
+                    });
+                  };
+                }
+              };
+            }
+
+            return {
+              name: "next-promise-2",
+              get then() {
+                log.push({
+                  name: "get next then (2)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call next then (2)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "next-result-2",
+                    get value() {
+                      log.push({
+                        name: "get next value (2)",
+                        thisValue: this
+                      });
+                      return "next-value-2";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get next done (2)",
+                        thisValue: this
+                      });
+                      return true;
+                    }
+                  });
+                };
+              }
+            };
+          };
+        }
+      };
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+  assert.sameValue(log[1].thisValue, obj, "get [Symbol.asyncIterator] thisValue");
+
+  assert.sameValue(log[2].name, "call [Symbol.asyncIterator]");
+  assert.sameValue(log[2].thisValue, obj, "[Symbol.asyncIterator] thisValue");
+  assert.sameValue(log[2].args.length, 0, "[Symbol.asyncIterator] args.length");
+
+  assert.sameValue(log[3].name, "get next");
+  assert.sameValue(log[3].thisValue.name, "asyncIterator", "get next thisValue");
+
+  assert.sameValue(log[4].name, "call next");
+  assert.sameValue(log[4].thisValue.name, "asyncIterator", "next thisValue");
+  assert.sameValue(log[4].args.length, 1, "next args.length");
+  assert.sameValue(log[4].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[5].name, "get next then (1)");
+  assert.sameValue(log[5].thisValue.name, "next-promise-1", "get next then thisValue");
+
+  assert.sameValue(log[6].name, "call next then (1)");
+  assert.sameValue(log[6].thisValue.name, "next-promise-1", "next then thisValue");
+  assert.sameValue(log[6].args.length, 2, "next then args.length");
+  assert.sameValue(typeof log[6].args[0], "function", "next then args[0]");
+  assert.sameValue(typeof log[6].args[1], "function", "next then args[1]");
+
+  assert.sameValue(log[7].name, "get next done (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[8].name, "get next value (1)");
+  assert.sameValue(log[8].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 9, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[9].name, "call next");
+    assert.sameValue(log[9].thisValue.name, "asyncIterator", "next thisValue");
+    assert.sameValue(log[9].args.length, 1, "next args.length");
+    assert.sameValue(log[9].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[10].name, "get next then (2)");
+    assert.sameValue(log[10].thisValue.name, "next-promise-2", "get next then thisValue");
+
+    assert.sameValue(log[11].name, "call next then (2)");
+    assert.sameValue(log[11].thisValue.name, "next-promise-2", "next then thisValue");
+    assert.sameValue(log[11].args.length, 2, "next then args.length");
+    assert.sameValue(typeof log[11].args[0], "function", "next then args[0]");
+    assert.sameValue(typeof log[11].args[1], "function", "next then args[1]");
+
+    assert.sameValue(log[12].name, "get next done (2)");
+    assert.sameValue(log[12].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[13].name, "get next value (2)");
+    assert.sameValue(log[13].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[14].name, "after yield*");
+    assert.sameValue(log[14].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 15, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-async-return.js b/test/language/expressions/class/async-gen-private-method-yield-star-async-return.js
new file mode 100644
index 0000000000..a63eaff087
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-async-return.js
@@ -0,0 +1,254 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-return.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: execution order for yield* with async iterator and return() (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator, « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. If generatorKind is async, then set value to ? Await(value).
+             3. Return Completion{[[Type]]: return, [[Value]]: value, [[Target]]: empty}.
+        ix. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+        ...
+
+    AsyncGeneratorYield ( value )
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var returnCount = 0;
+    return {
+      name: 'asyncIterator',
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-promise-1",
+              get then() {
+                log.push({
+                  name: "get return then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call return then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "return-result-1",
+                    get value() {
+                      log.push({
+                        name: "get return value (1)",
+                        thisValue: this
+                      });
+                      return "return-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get return done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "return-promise-2",
+            get then() {
+              log.push({
+                name: "get return then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call return then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "return-result-2",
+                  get value() {
+                    log.push({
+                      name: "get return value (2)",
+                      thisValue: this
+                    });
+                    return "return-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get return done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return then (1)");
+    assert.sameValue(log[4].thisValue.name, "return-promise-1", "get return then thisValue");
+
+    assert.sameValue(log[5].name, "call return then (1)");
+    assert.sameValue(log[5].thisValue.name, "return-promise-1", "return then thisValue");
+    assert.sameValue(log[5].args.length, 2, "return then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "return then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "return then args[1]");
+
+    assert.sameValue(log[6].name, "get return done (1)");
+    assert.sameValue(log[6].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[7].name, "get return value (1)");
+    assert.sameValue(log[7].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get return");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get return thisValue");
+
+      assert.sameValue(log[9].name, "call return");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "return thisValue");
+      assert.sameValue(log[9].args.length, 1, "return args.length");
+      assert.sameValue(log[9].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[10].name, "get return then (2)");
+      assert.sameValue(log[10].thisValue.name, "return-promise-2", "get return then thisValue");
+
+      assert.sameValue(log[11].name, "call return then (2)");
+      assert.sameValue(log[11].thisValue.name, "return-promise-2", "return then thisValue");
+      assert.sameValue(log[11].args.length, 2, "return then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "return then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "return then args[1]");
+
+      assert.sameValue(log[12].name, "get return done (2)");
+      assert.sameValue(log[12].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[13].name, "get return value (2)");
+      assert.sameValue(log[13].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 14, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-async-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-async-throw.js
new file mode 100644
index 0000000000..cd249d34bc
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-async-throw.js
@@ -0,0 +1,262 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: execution order for yield* with async iterator and throw() (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Let resultValue be Return ? IteratorValue(innerResult).
+            b. If generatorKind is async, then set resultValue to ? Await(resultValue).
+            c. Return resultValue.
+          7. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+      ...
+
+    AsyncGeneratorYield ( value )
+
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var throwCount = 0;
+    return {
+      name: "asyncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-promise-1",
+              get then() {
+                log.push({
+                  name: "get throw then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call throw then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "throw-result-1",
+                    get value() {
+                      log.push({
+                        name: "get throw value (1)",
+                        thisValue: this
+                      });
+                      return "throw-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get throw done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "throw-promise-2",
+            get then() {
+              log.push({
+                name: "get throw then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call throw then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "throw-result-2",
+                  get value() {
+                    log.push({
+                      name: "get throw value (2)",
+                      thisValue: this
+                    });
+                    return "throw-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get throw done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw then (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-promise-1", "get throw thisValue");
+
+    assert.sameValue(log[5].name, "call throw then (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-promise-1", "throw thisValue");
+    assert.sameValue(log[5].args.length, 2, "throw then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "throw then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "throw then args[1]");
+
+    assert.sameValue(log[6].name, "get throw done (1)");
+    assert.sameValue(log[6].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[7].name, "get throw value (1)");
+    assert.sameValue(log[7].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get throw");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get throw thisValue");
+
+      assert.sameValue(log[9].name, "call throw");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "throw thisValue");
+      assert.sameValue(log[9].args.length, 1, "throw args.length");
+      assert.sameValue(log[9].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[10].name, "get throw then (2)");
+      assert.sameValue(log[10].thisValue.name, "throw-promise-2", "get throw thisValue");
+
+      assert.sameValue(log[11].name, "call throw then (2)");
+      assert.sameValue(log[11].thisValue.name, "throw-promise-2", "throw thisValue");
+      assert.sameValue(log[11].args.length, 2, "throw then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "throw then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "throw then args[1]");
+
+      assert.sameValue(log[12].name, "get throw done (2)");
+      assert.sameValue(log[12].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[13].name, "get throw value (2)");
+      assert.sameValue(log[13].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[14].name, "after yield*");
+      assert.sameValue(log[14].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 15, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-expr-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-expr-abrupt.js
new file mode 100644
index 0000000000..2e09d5b8e2
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-expr-abrupt.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-expr-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting yield* operand (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    ...
+
+---*/
+var obj = {};
+var abrupt = function() {
+  throw obj;
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* abrupt();
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, obj, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-get-abrupt.js
new file mode 100644
index 0000000000..2041684a0b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-get-abrupt.js
@@ -0,0 +1,93 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.asyncIterator] (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  get [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..c475f24927
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-boolean-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (boolean) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: false
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-number-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-number-throw.js
new file mode 100644
index 0000000000..33386e1962
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-number-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-number-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (number) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: 0
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-object-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-object-throw.js
new file mode 100644
index 0000000000..37a6cf24cb
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-object-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-object-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (object) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: {}
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-string-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-string-throw.js
new file mode 100644
index 0000000000..9574d3604d
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-string-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-string-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (string) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: ''
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..e5494abf82
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-not-callable-symbol-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (symbol) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: Symbol.asyncIterator
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-null-sync-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-null-sync-get-abrupt.js
new file mode 100644
index 0000000000..8532430046
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-null-sync-get-abrupt.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after null @@asyncIterator (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-abrupt.js
new file mode 100644
index 0000000000..d67e5df3d6
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-abrupt.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.asyncIterator] (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-boolean-throw.js
new file mode 100644
index 0000000000..650a937861
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-boolean-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-boolean-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - boolean (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-null-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-null-throw.js
new file mode 100644
index 0000000000..a39991d608
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-null-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-null-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - null (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-number-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-number-throw.js
new file mode 100644
index 0000000000..ec3fb996b2
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-number-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-number-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - number (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return 42;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-string-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-string-throw.js
new file mode 100644
index 0000000000..2e37d8ca2b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-string-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-string-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - string (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return '42';
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-symbol-throw.js
new file mode 100644
index 0000000000..503c9c214f
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-symbol-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-symbol-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - symbol (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return Symbol.asyncIterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-undefined-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-undefined-throw.js
new file mode 100644
index 0000000000..4ffe9bc26c
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-returns-undefined-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-undefined-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - undefined (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-undefined-sync-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-undefined-sync-get-abrupt.js
new file mode 100644
index 0000000000..d4763eed73
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-async-undefined-sync-get-abrupt.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after undefined @@asyncIterator (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-get-abrupt.js
new file mode 100644
index 0000000000..ee8c597a2a
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-get-abrupt.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.iterator] (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..82d8f8c9e0
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-boolean-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (boolean) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: false
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-number-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-number-throw.js
new file mode 100644
index 0000000000..b51a6ef89c
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-number-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (number) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: 0
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-object-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-object-throw.js
new file mode 100644
index 0000000000..78984ad3a0
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-object-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (object) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: {}
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-string-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-string-throw.js
new file mode 100644
index 0000000000..3f1f866d78
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-string-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (string) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: ''
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..c93ca91a3a
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-not-callable-symbol-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (symbol) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: Symbol.iterator
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-abrupt.js
new file mode 100644
index 0000000000..cf1f69c6c3
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-abrupt.js
@@ -0,0 +1,86 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.iterator] (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-boolean-throw.js
new file mode 100644
index 0000000000..3c70d1f3d7
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-boolean-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - boolean (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-null-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-null-throw.js
new file mode 100644
index 0000000000..097f04f7f7
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-null-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-null-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - null (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-number-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-number-throw.js
new file mode 100644
index 0000000000..ee8525224e
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-number-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-number-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - number (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return 0;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-string-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-string-throw.js
new file mode 100644
index 0000000000..81ad0a7ce5
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-string-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-string-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - string (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return '';
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-symbol-throw.js
new file mode 100644
index 0000000000..d43176aa68
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-symbol-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - symbol (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return Symbol.iterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-undefined-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-undefined-throw.js
new file mode 100644
index 0000000000..24bc2f4826
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-getiter-sync-returns-undefined-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - undefined (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-call-done-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-call-done-get-abrupt.js
new file mode 100644
index 0000000000..3a66417594
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-call-done-get-abrupt.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-done-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting done (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get done() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-call-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-call-returns-abrupt.js
new file mode 100644
index 0000000000..798b468c98
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-call-returns-abrupt.js
@@ -0,0 +1,84 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while calling next (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-call-value-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-call-value-get-abrupt.js
new file mode 100644
index 0000000000..2d2e276e28
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-call-value-get-abrupt.js
@@ -0,0 +1,94 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-value-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting value (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          done: true,
+          get value() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-get-abrupt.js
new file mode 100644
index 0000000000..12a529f874
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-get-abrupt.js
@@ -0,0 +1,84 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Abrupt completion while getting next (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      get next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-non-object-ignores-then.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-non-object-ignores-then.js
new file mode 100644
index 0000000000..cbfb1f6c66
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-non-object-ignores-then.js
@@ -0,0 +1,104 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-non-object-ignores-then.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: If next() value is not-object, do not access respective then property (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+
+---*/
+Number.prototype.then = function() {
+  throw new Test262Error('Number#then should not be used');
+};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return 42;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, 'TypeError');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-boolean-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..b49225aad3
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-boolean-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - boolean (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: true
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-null-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-null-throw.js
new file mode 100644
index 0000000000..f57460836f
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-null-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-null-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - null (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: null
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-number-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-number-throw.js
new file mode 100644
index 0000000000..72f7cd34cd
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-number-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-number-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - number (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: 42
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-object-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-object-throw.js
new file mode 100644
index 0000000000..978b3ffd13
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-object-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-object-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - object (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: {}
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-string-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-string-throw.js
new file mode 100644
index 0000000000..3cdf91862b
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-string-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-string-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - string (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: ''
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-symbol-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..5952a8e879
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-symbol-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - symbol (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: Symbol('oi')
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-undefined-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-undefined-throw.js
new file mode 100644
index 0000000000..a5eca3bc83
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-not-callable-undefined-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-undefined-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Not-callable next value in a yield star position - undefined (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: undefined
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-get-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-get-abrupt.js
new file mode 100644
index 0000000000..428784d0ae
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-get-abrupt.js
@@ -0,0 +1,108 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-get-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Return abrupt after getting next().then (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-boolean-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-boolean-fulfillpromise.js
new file mode 100644
index 0000000000..dc98b06a5c
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-boolean-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-boolean-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (boolean) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: true,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-null-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-null-fulfillpromise.js
new file mode 100644
index 0000000000..2bb6b3bbc9
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-null-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-null-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (null) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: null,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-number-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-number-fulfillpromise.js
new file mode 100644
index 0000000000..35a48cafd0
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-number-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-number-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (number) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: 39,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-object-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-object-fulfillpromise.js
new file mode 100644
index 0000000000..1c00e4adba
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-object-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-object-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (object) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: {},
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-string-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-string-fulfillpromise.js
new file mode 100644
index 0000000000..bc7a17cecf
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-string-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-string-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (string) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: '',
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-symbol-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-symbol-fulfillpromise.js
new file mode 100644
index 0000000000..83b602362d
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-symbol-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-symbol-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (symbol) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: Symbol('oi'),
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-undefined-fulfillpromise.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-undefined-fulfillpromise.js
new file mode 100644
index 0000000000..a9610c7896
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-non-callable-undefined-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-undefined-fulfillpromise.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (undefined) (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: undefined,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-next-then-returns-abrupt.js b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-returns-abrupt.js
new file mode 100644
index 0000000000..cead3eba41
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-next-then-returns-abrupt.js
@@ -0,0 +1,108 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-returns-abrupt.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: Return abrupt after calling next().then (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-sync-next.js b/test/language/expressions/class/async-gen-private-method-yield-star-sync-next.js
new file mode 100644
index 0000000000..ddb8522715
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-sync-next.js
@@ -0,0 +1,241 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-next.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: execution order for yield* with sync iterator and next() (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    5. Let received be NormalCompletion(undefined).
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        i. Let innerResult be ? IteratorNext(iterator, received.[[Value]]).
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+        vii. Let received be GeneratorYield(innerResult).
+      ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    %AsyncFromSyncIteratorPrototype%.next ( value )
+
+    ...
+    5. Let nextResult be IteratorNext(syncIterator, value).
+    ...
+    7. Let nextValue be IteratorValue(nextResult).
+    ...
+    9. Let nextDone be IteratorComplete(nextResult).
+    ...
+    12. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « nextValue »).
+    ...
+    14. Set onFulfilled.[[Done]] to nextDone.
+    15. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+    Async Iterator Value Unwrap Functions
+
+    1. Return ! CreateIterResultObject(value, F.[[Done]]).
+
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({
+      name: "get [Symbol.iterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.iterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "syncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-result-1",
+                get value() {
+                  log.push({
+                    name: "get next value (1)",
+                    thisValue: this
+                  });
+                  return "next-value-1";
+                },
+                get done() {
+                  log.push({
+                    name: "get next done (1)",
+                    thisValue: this
+                  });
+                  return false;
+                }
+              };
+            }
+
+            return {
+              name: "next-result-2",
+              get value() {
+                log.push({
+                  name: "get next value (2)",
+                  thisValue: this
+                });
+                return "next-value-2";
+              },
+              get done() {
+                log.push({
+                  name: "get next done (2)",
+                  thisValue: this
+                });
+                return true;
+              }
+            };
+          };
+        }
+      };
+    };
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({ name: "get [Symbol.asyncIterator]" });
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+
+  assert.sameValue(log[2].name, "get [Symbol.iterator]");
+  assert.sameValue(log[2].thisValue, obj, "get [Symbol.iterator] thisValue");
+
+  assert.sameValue(log[3].name, "call [Symbol.iterator]");
+  assert.sameValue(log[3].thisValue, obj, "[Symbol.iterator] thisValue");
+  assert.sameValue(log[3].args.length, 0, "[Symbol.iterator] args.length");
+
+  assert.sameValue(log[4].name, "get next");
+  assert.sameValue(log[4].thisValue.name, "syncIterator", "get next thisValue");
+
+  assert.sameValue(log[5].name, "call next");
+  assert.sameValue(log[5].thisValue.name, "syncIterator", "next thisValue");
+  assert.sameValue(log[5].args.length, 1, "next args.length");
+  assert.sameValue(log[5].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[6].name, "get next done (1)");
+  assert.sameValue(log[6].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[7].name, "get next value (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 8, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[8].name, "call next");
+    assert.sameValue(log[8].thisValue.name, "syncIterator", "next thisValue");
+    assert.sameValue(log[8].args.length, 1, "next args.length");
+    assert.sameValue(log[8].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[9].name, "get next done (2)");
+    assert.sameValue(log[9].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[10].name, "get next value (2)");
+    assert.sameValue(log[10].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[11].name, "after yield*");
+    assert.sameValue(log[11].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 12, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-sync-return.js b/test/language/expressions/class/async-gen-private-method-yield-star-sync-return.js
new file mode 100644
index 0000000000..d9dcc8b2cc
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-sync-return.js
@@ -0,0 +1,216 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-return.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: execution order for yield* with sync iterator and return() (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator,
+            « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to
+           ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. Return Completion{[[Type]]: return, [[Value]]: value,
+                [[Target]]: empty}.
+        ix. Let received be GeneratorYield(innerResult).
+
+    %AsyncFromSyncIteratorPrototype%.return ( value )
+
+    5. Let return be GetMethod(syncIterator, "return").
+    ...
+    ...
+    8. Let returnResult be Call(return, syncIterator, « value »).
+    ...
+    11. Let returnValue be IteratorValue(returnResult).
+    ..
+    13. Let returnDone be IteratorComplete(returnResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined, « returnValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to returnDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var returnCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-result-1",
+              get value() {
+                log.push({
+                  name: "get return value (1)",
+                  thisValue: this
+                });
+                return "return-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get return done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "return-result-2",
+            get value() {
+              log.push({
+                name: "get return value (2)",
+                thisValue: this
+              });
+              return "return-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get return done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return done (1)");
+    assert.sameValue(log[4].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[5].name, "get return value (1)");
+    assert.sameValue(log[5].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get return");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
+
+      assert.sameValue(log[7].name, "call return");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
+      assert.sameValue(log[7].args.length, 1, "return args.length");
+      assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[8].name, "get return done (2)");
+      assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[9].name, "get return value (2)");
+      assert.sameValue(log[9].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 10, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-gen-private-method-yield-star-sync-throw.js b/test/language/expressions/class/async-gen-private-method-yield-star-sync-throw.js
new file mode 100644
index 0000000000..7e9dd181f5
--- /dev/null
+++ b/test/language/expressions/class/async-gen-private-method-yield-star-sync-throw.js
@@ -0,0 +1,222 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-throw.case
+// - src/async-generators/default/async-class-expr-private-method.template
+/*---
+description: execution order for yield* with sync iterator and throw() (Async generator method as a ClassExpression element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Return ? IteratorValue(innerResult).
+          7. Let received be GeneratorYield(innerResult).
+      ...
+
+    %AsyncFromSyncIteratorPrototype%.throw ( value )
+
+    ...
+    5. Let throw be GetMethod(syncIterator, "throw").
+    ...
+    8. Let throwResult be Call(throw, syncIterator, « value »).
+    ...
+    11. Let throwValue be IteratorValue(throwResult).
+    ...
+    13. Let throwDone be IteratorComplete(throwResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « throwValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to throwDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var throwCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-result-1",
+              get value() {
+                log.push({
+                  name: "get throw value (1)",
+                  thisValue: this
+                });
+                return "throw-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get throw done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "throw-result-2",
+            get value() {
+              log.push({
+                name: "get throw value (2)",
+                thisValue: this
+              });
+              return "throw-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get throw done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+var C = class {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw done (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[5].name, "get throw value (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get throw");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
+
+      assert.sameValue(log[7].name, "call throw");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
+      assert.sameValue(log[7].args.length, 1, "throw args.length");
+      assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[8].name, "get throw done (2)");
+      assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[9].name, "get throw value (2)");
+      assert.sameValue(log[9].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[10].name, "after yield*");
+      assert.sameValue(log[10].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 11, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/async-private-method-await-as-binding-identifier-escaped.js b/test/language/expressions/class/async-private-method-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..3dcd9f86f4
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier-escaped.case
+// - src/async-functions/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async private method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async #method() {
+    var \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-private-method-await-as-binding-identifier.js b/test/language/expressions/class/async-private-method-await-as-binding-identifier.js
new file mode 100644
index 0000000000..2ad9a3fbd9
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier.case
+// - src/async-functions/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async private method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async #method() {
+    var await;
+}};
diff --git a/test/language/expressions/class/async-private-method-await-as-identifier-reference-escaped.js b/test/language/expressions/class/async-private-method-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..51b0452cc1
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference-escaped.case
+// - src/async-functions/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async private method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async #method() {
+    void \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-private-method-await-as-identifier-reference.js b/test/language/expressions/class/async-private-method-await-as-identifier-reference.js
new file mode 100644
index 0000000000..06fefecd36
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference.case
+// - src/async-functions/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async private method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async #method() {
+    void await;
+}};
diff --git a/test/language/expressions/class/async-private-method-await-as-label-identifier-escaped.js b/test/language/expressions/class/async-private-method-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..bd62bbab30
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier-escaped.case
+// - src/async-functions/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async private method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async #method() {
+    \u0061wait: ;
+}};
diff --git a/test/language/expressions/class/async-private-method-await-as-label-identifier.js b/test/language/expressions/class/async-private-method-await-as-label-identifier.js
new file mode 100644
index 0000000000..6009bd2949
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier.case
+// - src/async-functions/syntax/async-class-expr-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async private method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { async #method() {
+    await: ;
+}};
diff --git a/test/language/expressions/class/async-private-method-static-await-as-binding-identifier-escaped.js b/test/language/expressions/class/async-private-method-static-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..9d70f6895b
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-static-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier-escaped.case
+// - src/async-functions/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static private async method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async #method() {
+    var \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-private-method-static-await-as-binding-identifier.js b/test/language/expressions/class/async-private-method-static-await-as-binding-identifier.js
new file mode 100644
index 0000000000..547b83958b
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-static-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier.case
+// - src/async-functions/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static private async method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async #method() {
+    var await;
+}};
diff --git a/test/language/expressions/class/async-private-method-static-await-as-identifier-reference-escaped.js b/test/language/expressions/class/async-private-method-static-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..6ced990241
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-static-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference-escaped.case
+// - src/async-functions/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static private async method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async #method() {
+    void \u0061wait;
+}};
diff --git a/test/language/expressions/class/async-private-method-static-await-as-identifier-reference.js b/test/language/expressions/class/async-private-method-static-await-as-identifier-reference.js
new file mode 100644
index 0000000000..3701d29201
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-static-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference.case
+// - src/async-functions/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static private async method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async #method() {
+    void await;
+}};
diff --git a/test/language/expressions/class/async-private-method-static-await-as-label-identifier-escaped.js b/test/language/expressions/class/async-private-method-static-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..f1016e84bb
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-static-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier-escaped.case
+// - src/async-functions/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static private async method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async #method() {
+    \u0061wait: ;
+}};
diff --git a/test/language/expressions/class/async-private-method-static-await-as-label-identifier.js b/test/language/expressions/class/async-private-method-static-await-as-label-identifier.js
new file mode 100644
index 0000000000..183b6c0e06
--- /dev/null
+++ b/test/language/expressions/class/async-private-method-static-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier.case
+// - src/async-functions/syntax/async-class-expr-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static private async method as a ClassExpression element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var C = class { static async #method() {
+    await: ;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-as-binding-identifier-escaped.js b/test/language/expressions/class/gen-private-method-static-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..ee7d55fae4
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier-escaped.case
+// - src/generators/syntax/class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class { static *#gen() {
+    var yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-as-binding-identifier.js b/test/language/expressions/class/gen-private-method-static-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..0c8c6ba0e4
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-as-binding-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier.case
+// - src/generators/syntax/class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class { static *#gen() {
+    var yield;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-as-identifier-reference-escaped.js b/test/language/expressions/class/gen-private-method-static-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..4c3a128f44
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference-escaped.case
+// - src/generators/syntax/class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class { static *#gen() {
+    void yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-as-identifier-reference.js b/test/language/expressions/class/gen-private-method-static-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..661c0b9d38
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-as-identifier-reference.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference.case
+// - src/generators/syntax/class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class { static *#gen() {
+    void yield;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-as-label-identifier-escaped.js b/test/language/expressions/class/gen-private-method-static-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..7af70b2288
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-as-label-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier-escaped.case
+// - src/generators/syntax/class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class { static *#gen() {
+    yi\u0065ld: ;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-as-label-identifier.js b/test/language/expressions/class/gen-private-method-static-yield-as-label-identifier.js
new file mode 100644
index 0000000000..589d1fba5b
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-as-label-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier.case
+// - src/generators/syntax/class-expr-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class { static *#gen() {
+    yield: ;
+}};
diff --git a/test/language/expressions/class/gen-private-method-static-yield-identifier-spread-strict.js b/test/language/expressions/class/gen-private-method-static-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..e7071edc10
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-identifier-spread-strict.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-identifier-spread-strict.case
+// - src/generators/default/class-expr-static-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var callCount = 0;
+
+var C = class {
+    static *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-static-yield-identifier-strict.js b/test/language/expressions/class/gen-private-method-static-yield-identifier-strict.js
new file mode 100644
index 0000000000..125d37ad3b
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-identifier-strict.js
@@ -0,0 +1,52 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-identifier-strict.case
+// - src/generators/default/class-expr-static-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var callCount = 0;
+
+var C = class {
+    static *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-static-yield-spread-arr-multiple.js b/test/language/expressions/class/gen-private-method-static-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..22d1d6ce7a
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-spread-arr-multiple.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-arr-multiple.case
+// - src/generators/default/class-expr-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+var callCount = 0;
+
+var C = class {
+    static *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+item = iter.next(item.value);
+
+assert(compareArray(item.value, arr));
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-static-yield-spread-arr-single.js b/test/language/expressions/class/gen-private-method-static-yield-spread-arr-single.js
new file mode 100644
index 0000000000..53a7de8572
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-spread-arr-single.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-arr-single.case
+// - src/generators/default/class-expr-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+---*/
+var arr = ['a', 'b', 'c'];
+
+var callCount = 0;
+
+var C = class {
+    static *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+var value = item.value;
+
+assert.notSameValue(value, arr, 'value is a new array');
+assert(Array.isArray(value), 'value is an Array exotic object');
+assert.sameValue(value.length, 3)
+assert.sameValue(value[0], 'a');
+assert.sameValue(value[1], 'b');
+assert.sameValue(value[2], 'c');
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-static-yield-spread-obj.js b/test/language/expressions/class/gen-private-method-static-yield-spread-obj.js
new file mode 100644
index 0000000000..b42b7f64c8
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-static-yield-spread-obj.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-obj.case
+// - src/generators/default/class-expr-static-private-method.template
+/*---
+description: Use yield value in a object spread position (Static generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-static-methods-private]
+flags: [generated]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+var callCount = 0;
+
+var C = class {
+    static *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+assert.sameValue(item.value.x, 42);
+assert.sameValue(item.value.y, 39);
+assert.sameValue(Object.keys(item.value).length, 2);
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-yield-as-binding-identifier-escaped.js b/test/language/expressions/class/gen-private-method-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..e08ff26c06
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier-escaped.case
+// - src/generators/syntax/class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class {*#gen() {
+    var yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/gen-private-method-yield-as-binding-identifier.js b/test/language/expressions/class/gen-private-method-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..6c805cd458
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-as-binding-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier.case
+// - src/generators/syntax/class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class {*#gen() {
+    var yield;
+}};
diff --git a/test/language/expressions/class/gen-private-method-yield-as-identifier-reference-escaped.js b/test/language/expressions/class/gen-private-method-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..6ea9bbe26b
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference-escaped.case
+// - src/generators/syntax/class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class {*#gen() {
+    void yi\u0065ld;
+}};
diff --git a/test/language/expressions/class/gen-private-method-yield-as-identifier-reference.js b/test/language/expressions/class/gen-private-method-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..6011e52649
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-as-identifier-reference.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference.case
+// - src/generators/syntax/class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class {*#gen() {
+    void yield;
+}};
diff --git a/test/language/expressions/class/gen-private-method-yield-as-label-identifier-escaped.js b/test/language/expressions/class/gen-private-method-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..9df4259202
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-as-label-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier-escaped.case
+// - src/generators/syntax/class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class {*#gen() {
+    yi\u0065ld: ;
+}};
diff --git a/test/language/expressions/class/gen-private-method-yield-as-label-identifier.js b/test/language/expressions/class/gen-private-method-yield-as-label-identifier.js
new file mode 100644
index 0000000000..a1b47ef2f7
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-as-label-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier.case
+// - src/generators/syntax/class-expr-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var C = class {*#gen() {
+    yield: ;
+}};
diff --git a/test/language/expressions/class/gen-private-method-yield-identifier-spread-strict.js b/test/language/expressions/class/gen-private-method-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..4c758b7483
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-identifier-spread-strict.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-identifier-spread-strict.case
+// - src/generators/default/class-expr-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var callCount = 0;
+
+var C = class {
+    *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-yield-identifier-strict.js b/test/language/expressions/class/gen-private-method-yield-identifier-strict.js
new file mode 100644
index 0000000000..d06c0d9670
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-identifier-strict.js
@@ -0,0 +1,56 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-identifier-strict.case
+// - src/generators/default/class-expr-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var callCount = 0;
+
+var C = class {
+    *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-yield-spread-arr-multiple.js b/test/language/expressions/class/gen-private-method-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..51dbe6425c
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-spread-arr-multiple.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-arr-multiple.case
+// - src/generators/default/class-expr-private-method.template
+/*---
+description: Use yield value in a array spread position (Generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-methods-private]
+flags: [generated]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+var callCount = 0;
+
+var C = class {
+    *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+item = iter.next(item.value);
+
+assert(compareArray(item.value, arr));
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-yield-spread-arr-single.js b/test/language/expressions/class/gen-private-method-yield-spread-arr-single.js
new file mode 100644
index 0000000000..8319516135
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-spread-arr-single.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-arr-single.case
+// - src/generators/default/class-expr-private-method.template
+/*---
+description: Use yield value in a array spread position (Generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-methods-private]
+flags: [generated]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+---*/
+var arr = ['a', 'b', 'c'];
+
+var callCount = 0;
+
+var C = class {
+    *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+var value = item.value;
+
+assert.notSameValue(value, arr, 'value is a new array');
+assert(Array.isArray(value), 'value is an Array exotic object');
+assert.sameValue(value.length, 3)
+assert.sameValue(value[0], 'a');
+assert.sameValue(value[1], 'b');
+assert.sameValue(value[2], 'c');
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/expressions/class/gen-private-method-yield-spread-obj.js b/test/language/expressions/class/gen-private-method-yield-spread-obj.js
new file mode 100644
index 0000000000..c0bd525a32
--- /dev/null
+++ b/test/language/expressions/class/gen-private-method-yield-spread-obj.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-obj.case
+// - src/generators/default/class-expr-private-method.template
+/*---
+description: Use yield value in a object spread position (Generator private method as a ClassExpression element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-methods-private]
+flags: [generated]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+var callCount = 0;
+
+var C = class {
+    *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+assert.sameValue(item.value.x, 42);
+assert.sameValue(item.value.y, 39);
+assert.sameValue(Object.keys(item.value).length, 2);
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-await-as-binding-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..a8d3265daa
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    var \u0061wait;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-await-as-binding-identifier.js b/test/language/statements/class/async-gen-private-method-await-as-binding-identifier.js
new file mode 100644
index 0000000000..62a36bed7f
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    var await;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-await-as-identifier-reference-escaped.js b/test/language/statements/class/async-gen-private-method-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..5c6ed7c7aa
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    void \u0061wait;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-await-as-identifier-reference.js b/test/language/statements/class/async-gen-private-method-await-as-identifier-reference.js
new file mode 100644
index 0000000000..a128bd8052
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    void await;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-await-as-label-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..4b388a514a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    \u0061wait: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-await-as-label-identifier.js b/test/language/statements/class/async-gen-private-method-await-as-label-identifier.js
new file mode 100644
index 0000000000..e00273f3e1
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    await: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-await-as-binding-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-static-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..7b97e191c2
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    var \u0061wait;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-await-as-binding-identifier.js b/test/language/statements/class/async-gen-private-method-static-await-as-binding-identifier.js
new file mode 100644
index 0000000000..ea1768a13a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    var await;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-await-as-identifier-reference-escaped.js b/test/language/statements/class/async-gen-private-method-static-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..00a2ff7ef9
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    void \u0061wait;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-await-as-identifier-reference.js b/test/language/statements/class/async-gen-private-method-static-await-as-identifier-reference.js
new file mode 100644
index 0000000000..c2b10fff8d
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    void await;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-await-as-label-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-static-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..e28610afad
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    \u0061wait: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-await-as-label-identifier.js b/test/language/statements/class/async-gen-private-method-static-await-as-label-identifier.js
new file mode 100644
index 0000000000..5c933328a5
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/await-as-label-identifier.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    await: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-as-binding-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-static-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..545228f4d0
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    var yi\u0065ld;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-as-binding-identifier.js b/test/language/statements/class/async-gen-private-method-static-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..6f05b86df5
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    var yield;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-as-identifier-reference-escaped.js b/test/language/statements/class/async-gen-private-method-static-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..a87d5c1858
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    void yi\u0065ld;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-as-identifier-reference.js b/test/language/statements/class/async-gen-private-method-static-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..9bf632c6ca
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    void yield;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-as-label-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-static-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..675a0f37df
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    yi\u0065ld: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-as-label-identifier.js b/test/language/statements/class/async-gen-private-method-static-yield-as-label-identifier.js
new file mode 100644
index 0000000000..8a6a818ca7
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier.case
+// - src/async-generators/syntax/async-class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async *#gen() {
+    yield: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-identifier-spread-strict.js b/test/language/statements/class/async-gen-private-method-static-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..f7bc16e8c3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-identifier-spread-strict.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-spread-strict.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-identifier-strict.js b/test/language/statements/class/async-gen-private-method-static-yield-identifier-strict.js
new file mode 100644
index 0000000000..b0aa9aba2f
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-identifier-strict.js
@@ -0,0 +1,53 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-strict.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-catch.js b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-catch.js
new file mode 100644
index 0000000000..e8a364cbd1
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-catch.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-catch.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}).catch(rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+});
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-async-iterator.js b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-async-iterator.js
new file mode 100644
index 0000000000..8bc57c6e15
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-async-iterator.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-async-iterator.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: yield * [Promise.reject(value)] is treated as throw value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        for await (let line of readFile()) {
+          yield line;
+        }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-sync-iterator.js b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-sync-iterator.js
new file mode 100644
index 0000000000..ad11204f65
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-for-await-of-sync-iterator.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-sync-iterator.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: yield Promise.reject(value) in for-await-of is treated as throw value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        for await (let value of iterable) {
+          yield value;
+        }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-async-iterator.js b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-async-iterator.js
new file mode 100644
index 0000000000..c23a7b7f0c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-async-iterator.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-async-iterator.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield * readFile();
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}, $DONE).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-sync-iterator.js b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-sync-iterator.js
new file mode 100644
index 0000000000..712569e48c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next-yield-star-sync-iterator.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-sync-iterator.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield * iterable;
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next.js b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next.js
new file mode 100644
index 0000000000..82e7173c80
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-promise-reject-next.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-spread-arr-multiple.js b/test/language/statements/class/async-gen-private-method-static-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..9afb0c202c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-spread-arr-multiple.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-multiple.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+
+item.then(({ done, value }) => {
+  item = iter.next(value);
+
+  item.then(({ done, value }) => {
+    assert(compareArray(value, arr));
+    assert.sameValue(done, false);
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-spread-arr-single.js b/test/language/statements/class/async-gen-private-method-static-yield-spread-arr-single.js
new file mode 100644
index 0000000000..65b38368fc
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-spread-arr-single.js
@@ -0,0 +1,64 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-single.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+
+item.then(({ done, value }) => {
+  assert.notSameValue(value, arr, 'value is a new array');
+  assert(Array.isArray(value), 'value is an Array exotic object');
+  assert.sameValue(value.length, 3)
+  assert.sameValue(value[0], 'a');
+  assert.sameValue(value[1], 'b');
+  assert.sameValue(value[2], 'c');
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-spread-obj.js b/test/language/statements/class/async-gen-private-method-static-yield-spread-obj.js
new file mode 100644
index 0000000000..d1b3e0cde0
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-spread-obj.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-obj.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Use yield value in a object spread position (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-static-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+item.then(({ done, value }) => {
+  assert.sameValue(value.x, 42);
+  assert.sameValue(value.y, 39);
+  assert.sameValue(Object.keys(value).length, 2);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-async-next.js b/test/language/statements/class/async-gen-private-method-static-yield-star-async-next.js
new file mode 100644
index 0000000000..4bbfbf19cb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-async-next.js
@@ -0,0 +1,234 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-next.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Execution order for yield* with async iterator and next() (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({ name: "get [Symbol.iterator]" });
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({
+      name: "get [Symbol.asyncIterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.asyncIterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "asyncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-promise-1",
+                get then() {
+                  log.push({
+                    name: "get next then (1)",
+                    thisValue: this
+                  });
+                  return function(resolve) {
+                    log.push({
+                      name: "call next then (1)",
+                      thisValue: this,
+                      args: [...arguments]
+                    });
+
+                    resolve({
+                      name: "next-result-1",
+                      get value() {
+                        log.push({
+                          name: "get next value (1)",
+                          thisValue: this
+                        });
+                        return "next-value-1";
+                      },
+                      get done() {
+                        log.push({
+                          name: "get next done (1)",
+                          thisValue: this
+                        });
+                        return false;
+                      }
+                    });
+                  };
+                }
+              };
+            }
+
+            return {
+              name: "next-promise-2",
+              get then() {
+                log.push({
+                  name: "get next then (2)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call next then (2)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "next-result-2",
+                    get value() {
+                      log.push({
+                        name: "get next value (2)",
+                        thisValue: this
+                      });
+                      return "next-value-2";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get next done (2)",
+                        thisValue: this
+                      });
+                      return true;
+                    }
+                  });
+                };
+              }
+            };
+          };
+        }
+      };
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+  assert.sameValue(log[1].thisValue, obj, "get [Symbol.asyncIterator] thisValue");
+
+  assert.sameValue(log[2].name, "call [Symbol.asyncIterator]");
+  assert.sameValue(log[2].thisValue, obj, "[Symbol.asyncIterator] thisValue");
+  assert.sameValue(log[2].args.length, 0, "[Symbol.asyncIterator] args.length");
+
+  assert.sameValue(log[3].name, "get next");
+  assert.sameValue(log[3].thisValue.name, "asyncIterator", "get next thisValue");
+
+  assert.sameValue(log[4].name, "call next");
+  assert.sameValue(log[4].thisValue.name, "asyncIterator", "next thisValue");
+  assert.sameValue(log[4].args.length, 1, "next args.length");
+  assert.sameValue(log[4].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[5].name, "get next then (1)");
+  assert.sameValue(log[5].thisValue.name, "next-promise-1", "get next then thisValue");
+
+  assert.sameValue(log[6].name, "call next then (1)");
+  assert.sameValue(log[6].thisValue.name, "next-promise-1", "next then thisValue");
+  assert.sameValue(log[6].args.length, 2, "next then args.length");
+  assert.sameValue(typeof log[6].args[0], "function", "next then args[0]");
+  assert.sameValue(typeof log[6].args[1], "function", "next then args[1]");
+
+  assert.sameValue(log[7].name, "get next done (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[8].name, "get next value (1)");
+  assert.sameValue(log[8].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 9, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[9].name, "call next");
+    assert.sameValue(log[9].thisValue.name, "asyncIterator", "next thisValue");
+    assert.sameValue(log[9].args.length, 1, "next args.length");
+    assert.sameValue(log[9].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[10].name, "get next then (2)");
+    assert.sameValue(log[10].thisValue.name, "next-promise-2", "get next then thisValue");
+
+    assert.sameValue(log[11].name, "call next then (2)");
+    assert.sameValue(log[11].thisValue.name, "next-promise-2", "next then thisValue");
+    assert.sameValue(log[11].args.length, 2, "next then args.length");
+    assert.sameValue(typeof log[11].args[0], "function", "next then args[0]");
+    assert.sameValue(typeof log[11].args[1], "function", "next then args[1]");
+
+    assert.sameValue(log[12].name, "get next done (2)");
+    assert.sameValue(log[12].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[13].name, "get next value (2)");
+    assert.sameValue(log[13].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[14].name, "after yield*");
+    assert.sameValue(log[14].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 15, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-async-return.js b/test/language/statements/class/async-gen-private-method-static-yield-star-async-return.js
new file mode 100644
index 0000000000..40a6dbd162
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-async-return.js
@@ -0,0 +1,250 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-return.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: execution order for yield* with async iterator and return() (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator, « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. If generatorKind is async, then set value to ? Await(value).
+             3. Return Completion{[[Type]]: return, [[Value]]: value, [[Target]]: empty}.
+        ix. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+        ...
+
+    AsyncGeneratorYield ( value )
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var returnCount = 0;
+    return {
+      name: 'asyncIterator',
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-promise-1",
+              get then() {
+                log.push({
+                  name: "get return then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call return then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "return-result-1",
+                    get value() {
+                      log.push({
+                        name: "get return value (1)",
+                        thisValue: this
+                      });
+                      return "return-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get return done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "return-promise-2",
+            get then() {
+              log.push({
+                name: "get return then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call return then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "return-result-2",
+                  get value() {
+                    log.push({
+                      name: "get return value (2)",
+                      thisValue: this
+                    });
+                    return "return-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get return done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return then (1)");
+    assert.sameValue(log[4].thisValue.name, "return-promise-1", "get return then thisValue");
+
+    assert.sameValue(log[5].name, "call return then (1)");
+    assert.sameValue(log[5].thisValue.name, "return-promise-1", "return then thisValue");
+    assert.sameValue(log[5].args.length, 2, "return then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "return then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "return then args[1]");
+
+    assert.sameValue(log[6].name, "get return done (1)");
+    assert.sameValue(log[6].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[7].name, "get return value (1)");
+    assert.sameValue(log[7].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get return");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get return thisValue");
+
+      assert.sameValue(log[9].name, "call return");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "return thisValue");
+      assert.sameValue(log[9].args.length, 1, "return args.length");
+      assert.sameValue(log[9].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[10].name, "get return then (2)");
+      assert.sameValue(log[10].thisValue.name, "return-promise-2", "get return then thisValue");
+
+      assert.sameValue(log[11].name, "call return then (2)");
+      assert.sameValue(log[11].thisValue.name, "return-promise-2", "return then thisValue");
+      assert.sameValue(log[11].args.length, 2, "return then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "return then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "return then args[1]");
+
+      assert.sameValue(log[12].name, "get return done (2)");
+      assert.sameValue(log[12].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[13].name, "get return value (2)");
+      assert.sameValue(log[13].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 14, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-async-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-async-throw.js
new file mode 100644
index 0000000000..599b769a67
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-async-throw.js
@@ -0,0 +1,258 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: execution order for yield* with async iterator and throw() (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Let resultValue be Return ? IteratorValue(innerResult).
+            b. If generatorKind is async, then set resultValue to ? Await(resultValue).
+            c. Return resultValue.
+          7. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+      ...
+
+    AsyncGeneratorYield ( value )
+
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var throwCount = 0;
+    return {
+      name: "asyncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-promise-1",
+              get then() {
+                log.push({
+                  name: "get throw then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call throw then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "throw-result-1",
+                    get value() {
+                      log.push({
+                        name: "get throw value (1)",
+                        thisValue: this
+                      });
+                      return "throw-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get throw done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "throw-promise-2",
+            get then() {
+              log.push({
+                name: "get throw then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call throw then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "throw-result-2",
+                  get value() {
+                    log.push({
+                      name: "get throw value (2)",
+                      thisValue: this
+                    });
+                    return "throw-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get throw done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw then (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-promise-1", "get throw thisValue");
+
+    assert.sameValue(log[5].name, "call throw then (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-promise-1", "throw thisValue");
+    assert.sameValue(log[5].args.length, 2, "throw then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "throw then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "throw then args[1]");
+
+    assert.sameValue(log[6].name, "get throw done (1)");
+    assert.sameValue(log[6].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[7].name, "get throw value (1)");
+    assert.sameValue(log[7].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get throw");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get throw thisValue");
+
+      assert.sameValue(log[9].name, "call throw");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "throw thisValue");
+      assert.sameValue(log[9].args.length, 1, "throw args.length");
+      assert.sameValue(log[9].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[10].name, "get throw then (2)");
+      assert.sameValue(log[10].thisValue.name, "throw-promise-2", "get throw thisValue");
+
+      assert.sameValue(log[11].name, "call throw then (2)");
+      assert.sameValue(log[11].thisValue.name, "throw-promise-2", "throw thisValue");
+      assert.sameValue(log[11].args.length, 2, "throw then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "throw then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "throw then args[1]");
+
+      assert.sameValue(log[12].name, "get throw done (2)");
+      assert.sameValue(log[12].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[13].name, "get throw value (2)");
+      assert.sameValue(log[13].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[14].name, "after yield*");
+      assert.sameValue(log[14].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 15, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-expr-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-expr-abrupt.js
new file mode 100644
index 0000000000..010fc74aa9
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-expr-abrupt.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-expr-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting yield* operand (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    ...
+
+---*/
+var obj = {};
+var abrupt = function() {
+  throw obj;
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* abrupt();
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, obj, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-get-abrupt.js
new file mode 100644
index 0000000000..814a3dbe44
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-get-abrupt.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.asyncIterator] (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  get [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-boolean-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..869f0dc7e2
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-boolean-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (boolean) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: false
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-number-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-number-throw.js
new file mode 100644
index 0000000000..14bcb7efd8
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-number-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-number-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (number) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: 0
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-object-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-object-throw.js
new file mode 100644
index 0000000000..3f7abcc65b
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-object-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-object-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (object) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: {}
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-string-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-string-throw.js
new file mode 100644
index 0000000000..6cfb8a4df7
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-string-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-string-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (string) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: ''
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-symbol-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..8bb318a930
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-not-callable-symbol-throw.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (symbol) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: Symbol.asyncIterator
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-null-sync-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-null-sync-get-abrupt.js
new file mode 100644
index 0000000000..aa3675cc6c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-null-sync-get-abrupt.js
@@ -0,0 +1,94 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after null @@asyncIterator (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-abrupt.js
new file mode 100644
index 0000000000..40d1767aa3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-abrupt.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.asyncIterator] (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-boolean-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-boolean-throw.js
new file mode 100644
index 0000000000..b894abee47
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-boolean-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-boolean-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - boolean (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-null-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-null-throw.js
new file mode 100644
index 0000000000..e1db3157f4
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-null-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-null-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - null (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-number-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-number-throw.js
new file mode 100644
index 0000000000..5bdbd206db
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-number-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-number-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - number (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return 42;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-string-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-string-throw.js
new file mode 100644
index 0000000000..fc5a242226
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-string-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-string-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - string (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return '42';
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-symbol-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-symbol-throw.js
new file mode 100644
index 0000000000..5184d164af
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-symbol-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-symbol-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - symbol (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return Symbol.asyncIterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-undefined-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-undefined-throw.js
new file mode 100644
index 0000000000..cbd9051214
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-returns-undefined-throw.js
@@ -0,0 +1,85 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-undefined-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - undefined (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-undefined-sync-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-undefined-sync-get-abrupt.js
new file mode 100644
index 0000000000..d5ae0228d6
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-async-undefined-sync-get-abrupt.js
@@ -0,0 +1,94 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after undefined @@asyncIterator (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-get-abrupt.js
new file mode 100644
index 0000000000..4a3b6833e2
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-get-abrupt.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.iterator] (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-boolean-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..586f102679
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-boolean-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (boolean) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: false
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-number-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-number-throw.js
new file mode 100644
index 0000000000..afeb7d1bf1
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-number-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (number) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: 0
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-object-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-object-throw.js
new file mode 100644
index 0000000000..3469bde3d1
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-object-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (object) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: {}
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-string-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-string-throw.js
new file mode 100644
index 0000000000..55e93371bb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-string-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (string) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: ''
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-symbol-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..7be72a8781
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-not-callable-symbol-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (symbol) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: Symbol.iterator
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-abrupt.js
new file mode 100644
index 0000000000..6cea12d4f3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-abrupt.js
@@ -0,0 +1,82 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.iterator] (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-boolean-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-boolean-throw.js
new file mode 100644
index 0000000000..fb0db49602
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-boolean-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - boolean (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-null-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-null-throw.js
new file mode 100644
index 0000000000..1dc68438c7
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-null-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-null-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - null (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-number-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-number-throw.js
new file mode 100644
index 0000000000..8f56fcc635
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-number-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-number-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - number (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return 0;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-string-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-string-throw.js
new file mode 100644
index 0000000000..50b6c634ef
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-string-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-string-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - string (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return '';
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-symbol-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-symbol-throw.js
new file mode 100644
index 0000000000..bf9751618f
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-symbol-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - symbol (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return Symbol.iterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-undefined-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-undefined-throw.js
new file mode 100644
index 0000000000..dd69e462fb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-getiter-sync-returns-undefined-throw.js
@@ -0,0 +1,87 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - undefined (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-done-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-done-get-abrupt.js
new file mode 100644
index 0000000000..448b27f283
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-done-get-abrupt.js
@@ -0,0 +1,88 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-done-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting done (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get done() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-returns-abrupt.js
new file mode 100644
index 0000000000..3344319b33
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-returns-abrupt.js
@@ -0,0 +1,80 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while calling next (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-value-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-value-get-abrupt.js
new file mode 100644
index 0000000000..23a841463b
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-call-value-get-abrupt.js
@@ -0,0 +1,90 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-value-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting value (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          done: true,
+          get value() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-get-abrupt.js
new file mode 100644
index 0000000000..adfa30012d
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-get-abrupt.js
@@ -0,0 +1,80 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Abrupt completion while getting next (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      get next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-non-object-ignores-then.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-non-object-ignores-then.js
new file mode 100644
index 0000000000..b7fbed1b81
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-non-object-ignores-then.js
@@ -0,0 +1,100 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-non-object-ignores-then.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: If next() value is not-object, do not access respective then property (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+
+---*/
+Number.prototype.then = function() {
+  throw new Test262Error('Number#then should not be used');
+};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return 42;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, 'TypeError');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-boolean-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..0cc0d61c69
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-boolean-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - boolean (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: true
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-null-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-null-throw.js
new file mode 100644
index 0000000000..bcd563916f
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-null-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-null-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - null (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: null
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-number-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-number-throw.js
new file mode 100644
index 0000000000..8bd63d1434
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-number-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-number-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - number (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: 42
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-object-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-object-throw.js
new file mode 100644
index 0000000000..b9914dde4a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-object-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-object-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - object (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: {}
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-string-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-string-throw.js
new file mode 100644
index 0000000000..d4ebf97b04
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-string-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-string-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - string (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: ''
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-symbol-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..4056be6d84
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-symbol-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - symbol (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: Symbol('oi')
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-undefined-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-undefined-throw.js
new file mode 100644
index 0000000000..34491a0131
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-not-callable-undefined-throw.js
@@ -0,0 +1,77 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-undefined-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Not-callable next value in a yield star position - undefined (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: undefined
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-get-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-get-abrupt.js
new file mode 100644
index 0000000000..f400b14753
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-get-abrupt.js
@@ -0,0 +1,104 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-get-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Return abrupt after getting next().then (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-boolean-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-boolean-fulfillpromise.js
new file mode 100644
index 0000000000..fa7ff154c4
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-boolean-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-boolean-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (boolean) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: true,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-null-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-null-fulfillpromise.js
new file mode 100644
index 0000000000..209664ebd3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-null-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-null-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (null) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: null,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-number-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-number-fulfillpromise.js
new file mode 100644
index 0000000000..d19224cfb5
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-number-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-number-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (number) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: 39,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-object-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-object-fulfillpromise.js
new file mode 100644
index 0000000000..e954d41755
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-object-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-object-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (object) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: {},
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-string-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-string-fulfillpromise.js
new file mode 100644
index 0000000000..93397d9326
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-string-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-string-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (string) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: '',
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-symbol-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-symbol-fulfillpromise.js
new file mode 100644
index 0000000000..4bbf2789a4
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-symbol-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-symbol-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (symbol) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: Symbol('oi'),
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-undefined-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-undefined-fulfillpromise.js
new file mode 100644
index 0000000000..d277cf12b9
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-non-callable-undefined-fulfillpromise.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-undefined-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (undefined) (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: undefined,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-returns-abrupt.js
new file mode 100644
index 0000000000..1a4fbb2685
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-next-then-returns-abrupt.js
@@ -0,0 +1,104 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: Return abrupt after calling next().then (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-sync-next.js b/test/language/statements/class/async-gen-private-method-static-yield-star-sync-next.js
new file mode 100644
index 0000000000..db0fc1dd86
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-sync-next.js
@@ -0,0 +1,237 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-next.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: execution order for yield* with sync iterator and next() (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    5. Let received be NormalCompletion(undefined).
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        i. Let innerResult be ? IteratorNext(iterator, received.[[Value]]).
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+        vii. Let received be GeneratorYield(innerResult).
+      ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    %AsyncFromSyncIteratorPrototype%.next ( value )
+
+    ...
+    5. Let nextResult be IteratorNext(syncIterator, value).
+    ...
+    7. Let nextValue be IteratorValue(nextResult).
+    ...
+    9. Let nextDone be IteratorComplete(nextResult).
+    ...
+    12. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « nextValue »).
+    ...
+    14. Set onFulfilled.[[Done]] to nextDone.
+    15. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+    Async Iterator Value Unwrap Functions
+
+    1. Return ! CreateIterResultObject(value, F.[[Done]]).
+
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({
+      name: "get [Symbol.iterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.iterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "syncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-result-1",
+                get value() {
+                  log.push({
+                    name: "get next value (1)",
+                    thisValue: this
+                  });
+                  return "next-value-1";
+                },
+                get done() {
+                  log.push({
+                    name: "get next done (1)",
+                    thisValue: this
+                  });
+                  return false;
+                }
+              };
+            }
+
+            return {
+              name: "next-result-2",
+              get value() {
+                log.push({
+                  name: "get next value (2)",
+                  thisValue: this
+                });
+                return "next-value-2";
+              },
+              get done() {
+                log.push({
+                  name: "get next done (2)",
+                  thisValue: this
+                });
+                return true;
+              }
+            };
+          };
+        }
+      };
+    };
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({ name: "get [Symbol.asyncIterator]" });
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+
+  assert.sameValue(log[2].name, "get [Symbol.iterator]");
+  assert.sameValue(log[2].thisValue, obj, "get [Symbol.iterator] thisValue");
+
+  assert.sameValue(log[3].name, "call [Symbol.iterator]");
+  assert.sameValue(log[3].thisValue, obj, "[Symbol.iterator] thisValue");
+  assert.sameValue(log[3].args.length, 0, "[Symbol.iterator] args.length");
+
+  assert.sameValue(log[4].name, "get next");
+  assert.sameValue(log[4].thisValue.name, "syncIterator", "get next thisValue");
+
+  assert.sameValue(log[5].name, "call next");
+  assert.sameValue(log[5].thisValue.name, "syncIterator", "next thisValue");
+  assert.sameValue(log[5].args.length, 1, "next args.length");
+  assert.sameValue(log[5].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[6].name, "get next done (1)");
+  assert.sameValue(log[6].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[7].name, "get next value (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 8, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[8].name, "call next");
+    assert.sameValue(log[8].thisValue.name, "syncIterator", "next thisValue");
+    assert.sameValue(log[8].args.length, 1, "next args.length");
+    assert.sameValue(log[8].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[9].name, "get next done (2)");
+    assert.sameValue(log[9].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[10].name, "get next value (2)");
+    assert.sameValue(log[10].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[11].name, "after yield*");
+    assert.sameValue(log[11].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 12, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-sync-return.js b/test/language/statements/class/async-gen-private-method-static-yield-star-sync-return.js
new file mode 100644
index 0000000000..9ce50f8851
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-sync-return.js
@@ -0,0 +1,212 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-return.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: execution order for yield* with sync iterator and return() (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator,
+            « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to
+           ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. Return Completion{[[Type]]: return, [[Value]]: value,
+                [[Target]]: empty}.
+        ix. Let received be GeneratorYield(innerResult).
+
+    %AsyncFromSyncIteratorPrototype%.return ( value )
+
+    5. Let return be GetMethod(syncIterator, "return").
+    ...
+    ...
+    8. Let returnResult be Call(return, syncIterator, « value »).
+    ...
+    11. Let returnValue be IteratorValue(returnResult).
+    ..
+    13. Let returnDone be IteratorComplete(returnResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined, « returnValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to returnDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var returnCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-result-1",
+              get value() {
+                log.push({
+                  name: "get return value (1)",
+                  thisValue: this
+                });
+                return "return-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get return done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "return-result-2",
+            get value() {
+              log.push({
+                name: "get return value (2)",
+                thisValue: this
+              });
+              return "return-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get return done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return done (1)");
+    assert.sameValue(log[4].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[5].name, "get return value (1)");
+    assert.sameValue(log[5].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get return");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
+
+      assert.sameValue(log[7].name, "call return");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
+      assert.sameValue(log[7].args.length, 1, "return args.length");
+      assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[8].name, "get return done (2)");
+      assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[9].name, "get return value (2)");
+      assert.sameValue(log[9].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 10, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-static-yield-star-sync-throw.js b/test/language/statements/class/async-gen-private-method-static-yield-star-sync-throw.js
new file mode 100644
index 0000000000..71d0c8bec3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-static-yield-star-sync-throw.js
@@ -0,0 +1,218 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-throw.case
+// - src/async-generators/default/async-class-decl-static-private-method.template
+/*---
+description: execution order for yield* with sync iterator and throw() (Static async generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-static-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Return ? IteratorValue(innerResult).
+          7. Let received be GeneratorYield(innerResult).
+      ...
+
+    %AsyncFromSyncIteratorPrototype%.throw ( value )
+
+    ...
+    5. Let throw be GetMethod(syncIterator, "throw").
+    ...
+    8. Let throwResult be Call(throw, syncIterator, « value »).
+    ...
+    11. Let throwValue be IteratorValue(throwResult).
+    ...
+    13. Let throwDone be IteratorComplete(throwResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « throwValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to throwDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var throwCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-result-1",
+              get value() {
+                log.push({
+                  name: "get throw value (1)",
+                  thisValue: this
+                });
+                return "throw-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get throw done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "throw-result-2",
+            get value() {
+              log.push({
+                name: "get throw value (2)",
+                thisValue: this
+              });
+              return "throw-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get throw done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    static async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw done (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[5].name, "get throw value (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get throw");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
+
+      assert.sameValue(log[7].name, "call throw");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
+      assert.sameValue(log[7].args.length, 1, "throw args.length");
+      assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[8].name, "get throw done (2)");
+      assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[9].name, "get throw value (2)");
+      assert.sameValue(log[9].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[10].name, "after yield*");
+      assert.sameValue(log[10].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 11, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-as-binding-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..0ab8b943db
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    var yi\u0065ld;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-yield-as-binding-identifier.js b/test/language/statements/class/async-gen-private-method-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..dd54f5cbc6
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-binding-identifier.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    var yield;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-yield-as-identifier-reference-escaped.js b/test/language/statements/class/async-gen-private-method-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..734eaee519
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference-escaped.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    void yi\u0065ld;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-yield-as-identifier-reference.js b/test/language/statements/class/async-gen-private-method-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..5d58620285
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-identifier-reference.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    void yield;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-yield-as-label-identifier-escaped.js b/test/language/statements/class/async-gen-private-method-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..4118dd4ee8
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier-escaped.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    yi\u0065ld: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-yield-as-label-identifier.js b/test/language/statements/class/async-gen-private-method-yield-as-label-identifier.js
new file mode 100644
index 0000000000..1df5909bd0
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-as-label-identifier.case
+// - src/async-generators/syntax/async-class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async Generator private method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorMethod
+features: [async-iteration, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * # PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async *#gen() {
+    yield: ;
+}}
diff --git a/test/language/statements/class/async-gen-private-method-yield-identifier-spread-strict.js b/test/language/statements/class/async-gen-private-method-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..756d8f60eb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-identifier-spread-strict.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-spread-strict.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-identifier-strict.js b/test/language/statements/class/async-gen-private-method-yield-identifier-strict.js
new file mode 100644
index 0000000000..7a355b0acd
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-identifier-strict.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-identifier-strict.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-catch.js b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-catch.js
new file mode 100644
index 0000000000..0645b12531
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-catch.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-catch.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}).catch(rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+});
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-for-await-of-async-iterator.js b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-for-await-of-async-iterator.js
new file mode 100644
index 0000000000..a54e16178f
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-for-await-of-async-iterator.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-async-iterator.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: yield * [Promise.reject(value)] is treated as throw value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        for await (let line of readFile()) {
+          yield line;
+        }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-for-await-of-sync-iterator.js b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-for-await-of-sync-iterator.js
new file mode 100644
index 0000000000..330f52b535
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-for-await-of-sync-iterator.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-for-await-of-sync-iterator.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: yield Promise.reject(value) in for-await-of is treated as throw value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        for await (let value of iterable) {
+          yield value;
+        }
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-yield-star-async-iterator.js b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-yield-star-async-iterator.js
new file mode 100644
index 0000000000..f084b8cc96
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-yield-star-async-iterator.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-async-iterator.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+async function * readFile() {
+  yield Promise.reject(error);
+  yield "unreachable";
+}
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield * readFile();
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}, $DONE).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-yield-star-sync-iterator.js b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-yield-star-sync-iterator.js
new file mode 100644
index 0000000000..4dad592f1a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next-yield-star-sync-iterator.js
@@ -0,0 +1,66 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next-yield-star-sync-iterator.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: yield * (async iterator) is treated as throw value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+let iterable = [
+  Promise.reject(error),
+  "unreachable"
+];
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield * iterable;
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-promise-reject-next.js b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next.js
new file mode 100644
index 0000000000..935f74824b
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-promise-reject-next.js
@@ -0,0 +1,63 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-promise-reject-next.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: yield Promise.reject(value) is treated as throw value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+---*/
+let error = new Error();
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield Promise.reject(error);
+        yield "unreachable";
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error("Promise incorrectly resolved.");
+}, rejectValue => {
+  // yield Promise.reject(error);
+  assert.sameValue(rejectValue, error);
+
+  iter.next().then(({done, value}) => {
+    // iter is closed now.
+    assert.sameValue(done, true, "The value of IteratorResult.done is `true`");
+    assert.sameValue(value, undefined, "The value of IteratorResult.value is `undefined`");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-spread-arr-multiple.js b/test/language/statements/class/async-gen-private-method-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..45644af5da
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-spread-arr-multiple.js
@@ -0,0 +1,69 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-multiple.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Use yield value in a array spread position (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+
+item.then(({ done, value }) => {
+  item = iter.next(value);
+
+  item.then(({ done, value }) => {
+    assert(compareArray(value, arr));
+    assert.sameValue(done, false);
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-spread-arr-single.js b/test/language/statements/class/async-gen-private-method-yield-spread-arr-single.js
new file mode 100644
index 0000000000..9fa18d3ab1
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-spread-arr-single.js
@@ -0,0 +1,68 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-arr-single.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Use yield value in a array spread position (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+
+item.then(({ done, value }) => {
+  assert.notSameValue(value, arr, 'value is a new array');
+  assert(Array.isArray(value), 'value is an Array exotic object');
+  assert.sameValue(value.length, 3)
+  assert.sameValue(value[0], 'a');
+  assert.sameValue(value[1], 'b');
+  assert.sameValue(value[2], 'c');
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-spread-obj.js b/test/language/statements/class/async-gen-private-method-yield-spread-obj.js
new file mode 100644
index 0000000000..124b85a011
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-spread-obj.js
@@ -0,0 +1,72 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-spread-obj.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Use yield value in a object spread position (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [object-spread, async-iteration, class-methods-private]
+flags: [generated, async]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+item.then(({ done, value }) => {
+  assert.sameValue(value.x, 42);
+  assert.sameValue(value.y, 39);
+  assert.sameValue(Object.keys(value).length, 2);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-async-next.js b/test/language/statements/class/async-gen-private-method-yield-star-async-next.js
new file mode 100644
index 0000000000..43967f080e
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-async-next.js
@@ -0,0 +1,238 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-next.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Execution order for yield* with async iterator and next() (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({ name: "get [Symbol.iterator]" });
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({
+      name: "get [Symbol.asyncIterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.asyncIterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "asyncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-promise-1",
+                get then() {
+                  log.push({
+                    name: "get next then (1)",
+                    thisValue: this
+                  });
+                  return function(resolve) {
+                    log.push({
+                      name: "call next then (1)",
+                      thisValue: this,
+                      args: [...arguments]
+                    });
+
+                    resolve({
+                      name: "next-result-1",
+                      get value() {
+                        log.push({
+                          name: "get next value (1)",
+                          thisValue: this
+                        });
+                        return "next-value-1";
+                      },
+                      get done() {
+                        log.push({
+                          name: "get next done (1)",
+                          thisValue: this
+                        });
+                        return false;
+                      }
+                    });
+                  };
+                }
+              };
+            }
+
+            return {
+              name: "next-promise-2",
+              get then() {
+                log.push({
+                  name: "get next then (2)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call next then (2)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "next-result-2",
+                    get value() {
+                      log.push({
+                        name: "get next value (2)",
+                        thisValue: this
+                      });
+                      return "next-value-2";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get next done (2)",
+                        thisValue: this
+                      });
+                      return true;
+                    }
+                  });
+                };
+              }
+            };
+          };
+        }
+      };
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+  assert.sameValue(log[1].thisValue, obj, "get [Symbol.asyncIterator] thisValue");
+
+  assert.sameValue(log[2].name, "call [Symbol.asyncIterator]");
+  assert.sameValue(log[2].thisValue, obj, "[Symbol.asyncIterator] thisValue");
+  assert.sameValue(log[2].args.length, 0, "[Symbol.asyncIterator] args.length");
+
+  assert.sameValue(log[3].name, "get next");
+  assert.sameValue(log[3].thisValue.name, "asyncIterator", "get next thisValue");
+
+  assert.sameValue(log[4].name, "call next");
+  assert.sameValue(log[4].thisValue.name, "asyncIterator", "next thisValue");
+  assert.sameValue(log[4].args.length, 1, "next args.length");
+  assert.sameValue(log[4].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[5].name, "get next then (1)");
+  assert.sameValue(log[5].thisValue.name, "next-promise-1", "get next then thisValue");
+
+  assert.sameValue(log[6].name, "call next then (1)");
+  assert.sameValue(log[6].thisValue.name, "next-promise-1", "next then thisValue");
+  assert.sameValue(log[6].args.length, 2, "next then args.length");
+  assert.sameValue(typeof log[6].args[0], "function", "next then args[0]");
+  assert.sameValue(typeof log[6].args[1], "function", "next then args[1]");
+
+  assert.sameValue(log[7].name, "get next done (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[8].name, "get next value (1)");
+  assert.sameValue(log[8].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 9, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[9].name, "call next");
+    assert.sameValue(log[9].thisValue.name, "asyncIterator", "next thisValue");
+    assert.sameValue(log[9].args.length, 1, "next args.length");
+    assert.sameValue(log[9].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[10].name, "get next then (2)");
+    assert.sameValue(log[10].thisValue.name, "next-promise-2", "get next then thisValue");
+
+    assert.sameValue(log[11].name, "call next then (2)");
+    assert.sameValue(log[11].thisValue.name, "next-promise-2", "next then thisValue");
+    assert.sameValue(log[11].args.length, 2, "next then args.length");
+    assert.sameValue(typeof log[11].args[0], "function", "next then args[0]");
+    assert.sameValue(typeof log[11].args[1], "function", "next then args[1]");
+
+    assert.sameValue(log[12].name, "get next done (2)");
+    assert.sameValue(log[12].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[13].name, "get next value (2)");
+    assert.sameValue(log[13].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[14].name, "after yield*");
+    assert.sameValue(log[14].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 15, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-async-return.js b/test/language/statements/class/async-gen-private-method-yield-star-async-return.js
new file mode 100644
index 0000000000..238c2c94b0
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-async-return.js
@@ -0,0 +1,254 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-return.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: execution order for yield* with async iterator and return() (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator, « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. If generatorKind is async, then set value to ? Await(value).
+             3. Return Completion{[[Type]]: return, [[Value]]: value, [[Target]]: empty}.
+        ix. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+        ...
+
+    AsyncGeneratorYield ( value )
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var returnCount = 0;
+    return {
+      name: 'asyncIterator',
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-promise-1",
+              get then() {
+                log.push({
+                  name: "get return then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call return then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "return-result-1",
+                    get value() {
+                      log.push({
+                        name: "get return value (1)",
+                        thisValue: this
+                      });
+                      return "return-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get return done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "return-promise-2",
+            get then() {
+              log.push({
+                name: "get return then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call return then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "return-result-2",
+                  get value() {
+                    log.push({
+                      name: "get return value (2)",
+                      thisValue: this
+                    });
+                    return "return-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get return done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return then (1)");
+    assert.sameValue(log[4].thisValue.name, "return-promise-1", "get return then thisValue");
+
+    assert.sameValue(log[5].name, "call return then (1)");
+    assert.sameValue(log[5].thisValue.name, "return-promise-1", "return then thisValue");
+    assert.sameValue(log[5].args.length, 2, "return then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "return then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "return then args[1]");
+
+    assert.sameValue(log[6].name, "get return done (1)");
+    assert.sameValue(log[6].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[7].name, "get return value (1)");
+    assert.sameValue(log[7].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get return");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get return thisValue");
+
+      assert.sameValue(log[9].name, "call return");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "return thisValue");
+      assert.sameValue(log[9].args.length, 1, "return args.length");
+      assert.sameValue(log[9].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[10].name, "get return then (2)");
+      assert.sameValue(log[10].thisValue.name, "return-promise-2", "get return then thisValue");
+
+      assert.sameValue(log[11].name, "call return then (2)");
+      assert.sameValue(log[11].thisValue.name, "return-promise-2", "return then thisValue");
+      assert.sameValue(log[11].args.length, 2, "return then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "return then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "return then args[1]");
+
+      assert.sameValue(log[12].name, "get return done (2)");
+      assert.sameValue(log[12].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[13].name, "get return value (2)");
+      assert.sameValue(log[13].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 14, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-async-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-async-throw.js
new file mode 100644
index 0000000000..04b10c0efb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-async-throw.js
@@ -0,0 +1,262 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-async-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: execution order for yield* with async iterator and throw() (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Let resultValue be Return ? IteratorValue(innerResult).
+            b. If generatorKind is async, then set resultValue to ? Await(resultValue).
+            c. Return resultValue.
+          7. If generatorKind is async, then let received be AsyncGeneratorYield(? IteratorValue(innerResult)).
+      ...
+
+    AsyncGeneratorYield ( value )
+
+    ...
+    8. Return ! AsyncGeneratorResolve(generator, value, false).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.asyncIterator]() {
+    var throwCount = 0;
+    return {
+      name: "asyncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-promise-1",
+              get then() {
+                log.push({
+                  name: "get throw then (1)",
+                  thisValue: this
+                });
+                return function(resolve) {
+                  log.push({
+                    name: "call throw then (1)",
+                    thisValue: this,
+                    args: [...arguments]
+                  });
+
+                  resolve({
+                    name: "throw-result-1",
+                    get value() {
+                      log.push({
+                        name: "get throw value (1)",
+                        thisValue: this
+                      });
+                      return "throw-value-1";
+                    },
+                    get done() {
+                      log.push({
+                        name: "get throw done (1)",
+                        thisValue: this
+                      });
+                      return false;
+                    }
+                  });
+                };
+              }
+            };
+          }
+
+          return {
+            name: "throw-promise-2",
+            get then() {
+              log.push({
+                name: "get throw then (2)",
+                thisValue: this
+              });
+              return function(resolve) {
+                log.push({
+                  name: "call throw then (2)",
+                  thisValue: this,
+                  args: [...arguments]
+                });
+
+                resolve({
+                  name: "throw-result-2",
+                  get value() {
+                    log.push({
+                      name: "get throw value (2)",
+                      thisValue: this
+                    });
+                    return "throw-value-2";
+                  },
+                  get done() {
+                    log.push({
+                      name: "get throw done (2)",
+                      thisValue: this
+                    });
+                    return true;
+                  }
+                });
+              };
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "asyncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "asyncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw then (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-promise-1", "get throw thisValue");
+
+    assert.sameValue(log[5].name, "call throw then (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-promise-1", "throw thisValue");
+    assert.sameValue(log[5].args.length, 2, "throw then args.length");
+    assert.sameValue(typeof log[5].args[0], "function", "throw then args[0]");
+    assert.sameValue(typeof log[5].args[1], "function", "throw then args[1]");
+
+    assert.sameValue(log[6].name, "get throw done (1)");
+    assert.sameValue(log[6].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[7].name, "get throw value (1)");
+    assert.sameValue(log[7].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 8, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[8].name, "get throw");
+      assert.sameValue(log[8].thisValue.name, "asyncIterator", "get throw thisValue");
+
+      assert.sameValue(log[9].name, "call throw");
+      assert.sameValue(log[9].thisValue.name, "asyncIterator", "throw thisValue");
+      assert.sameValue(log[9].args.length, 1, "throw args.length");
+      assert.sameValue(log[9].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[10].name, "get throw then (2)");
+      assert.sameValue(log[10].thisValue.name, "throw-promise-2", "get throw thisValue");
+
+      assert.sameValue(log[11].name, "call throw then (2)");
+      assert.sameValue(log[11].thisValue.name, "throw-promise-2", "throw thisValue");
+      assert.sameValue(log[11].args.length, 2, "throw then args.length");
+      assert.sameValue(typeof log[11].args[0], "function", "throw then args[0]");
+      assert.sameValue(typeof log[11].args[1], "function", "throw then args[1]");
+
+      assert.sameValue(log[12].name, "get throw done (2)");
+      assert.sameValue(log[12].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[13].name, "get throw value (2)");
+      assert.sameValue(log[13].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[14].name, "after yield*");
+      assert.sameValue(log[14].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 15, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-expr-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-expr-abrupt.js
new file mode 100644
index 0000000000..c127cd49be
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-expr-abrupt.js
@@ -0,0 +1,73 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-expr-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting yield* operand (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    ...
+
+---*/
+var obj = {};
+var abrupt = function() {
+  throw obj;
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* abrupt();
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, obj, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-get-abrupt.js
new file mode 100644
index 0000000000..30377f1904
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-get-abrupt.js
@@ -0,0 +1,93 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.asyncIterator] (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  get [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-boolean-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..c97e0a7c6a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-boolean-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (boolean) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: false
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-number-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-number-throw.js
new file mode 100644
index 0000000000..b20a4ec807
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-number-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-number-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (number) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: 0
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-object-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-object-throw.js
new file mode 100644
index 0000000000..ec534bfa25
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-object-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-object-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (object) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: {}
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-string-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-string-throw.js
new file mode 100644
index 0000000000..db0de0d8d8
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-string-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-string-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (string) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: ''
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-symbol-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..62a4e8a25a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-not-callable-symbol-throw.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.asyncIterator] (symbol) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    3. If func is either undefined or null, return undefined.
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]: Symbol.asyncIterator
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-null-sync-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-null-sync-get-abrupt.js
new file mode 100644
index 0000000000..11eaa74d75
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-null-sync-get-abrupt.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after null @@asyncIterator (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-abrupt.js
new file mode 100644
index 0000000000..1601390cfb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-abrupt.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.asyncIterator] (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-boolean-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-boolean-throw.js
new file mode 100644
index 0000000000..6dd829922e
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-boolean-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-boolean-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - boolean (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-null-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-null-throw.js
new file mode 100644
index 0000000000..949be2e3ed
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-null-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-null-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - null (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-number-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-number-throw.js
new file mode 100644
index 0000000000..088ba42b00
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-number-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-number-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - number (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return 42;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-string-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-string-throw.js
new file mode 100644
index 0000000000..c28b7879e9
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-string-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-string-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - string (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return '42';
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-symbol-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-symbol-throw.js
new file mode 100644
index 0000000000..8e3b8ecdb4
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-symbol-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-symbol-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - symbol (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return Symbol.asyncIterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-undefined-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-undefined-throw.js
new file mode 100644
index 0000000000..d8dbe61b85
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-returns-undefined-throw.js
@@ -0,0 +1,89 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-returns-undefined-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.asyncIterator]() - undefined (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+    ...
+    6. Let iterator be ? Call(method, obj).
+    7. If Type(iterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-undefined-sync-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-undefined-sync-get-abrupt.js
new file mode 100644
index 0000000000..6024371e55
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-async-undefined-sync-get-abrupt.js
@@ -0,0 +1,98 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting @@iterator after undefined @@asyncIterator (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var calls = 0;
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  },
+  get [Symbol.asyncIterator]() {
+    calls += 1;
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+  assert.sameValue(calls, 1);
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-get-abrupt.js
new file mode 100644
index 0000000000..3d9f03d6f6
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-get-abrupt.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting [Symbol.iterator] (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-boolean-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..529b311723
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-boolean-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (boolean) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: false
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-number-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-number-throw.js
new file mode 100644
index 0000000000..6223dac04a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-number-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (number) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: 0
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-object-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-object-throw.js
new file mode 100644
index 0000000000..648a198d40
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-object-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (object) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: {}
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-string-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-string-throw.js
new file mode 100644
index 0000000000..3c0259c76e
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-string-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (string) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: ''
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-symbol-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..f13a60e1ee
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-not-callable-symbol-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Throws a TypeError on a non-callable [Symbol.iterator] (symbol) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+    ...
+
+    GetMethod ( V, P )
+
+    ...
+    2. Let func be ? GetV(V, P).
+    ...
+    4. If IsCallable(func) is false, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]: Symbol.iterator
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-abrupt.js
new file mode 100644
index 0000000000..02dcbbffcb
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-abrupt.js
@@ -0,0 +1,86 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while calling [Symbol.iterator] (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  [Symbol.iterator]() {
+    throw reason;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-boolean-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-boolean-throw.js
new file mode 100644
index 0000000000..310d51984c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-boolean-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - boolean (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return true;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-null-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-null-throw.js
new file mode 100644
index 0000000000..991fea247b
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-null-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-null-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - null (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-number-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-number-throw.js
new file mode 100644
index 0000000000..8b2fec004e
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-number-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-number-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - number (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return 0;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-string-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-string-throw.js
new file mode 100644
index 0000000000..4c3dc320d4
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-string-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-string-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - string (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return '';
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-symbol-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-symbol-throw.js
new file mode 100644
index 0000000000..e6b1f6823c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-symbol-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - symbol (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return Symbol.iterator;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-undefined-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-undefined-throw.js
new file mode 100644
index 0000000000..580d1a2f65
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-getiter-sync-returns-undefined-throw.js
@@ -0,0 +1,91 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Non object returned by [Symbol.iterator]() - undefined (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    1. Let exprRef be the result of evaluating AssignmentExpression.
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    CreateAsyncFromSyncIterator(syncIterator)
+
+    1. If Type(syncIterator) is not Object, throw a TypeError exception.
+    ...
+
+---*/
+var obj = {
+  [Symbol.iterator]() {
+    return undefined;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-call-done-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-next-call-done-get-abrupt.js
new file mode 100644
index 0000000000..82addf0c25
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-call-done-get-abrupt.js
@@ -0,0 +1,92 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-done-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting done (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get done() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-call-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-next-call-returns-abrupt.js
new file mode 100644
index 0000000000..06bac4e1dd
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-call-returns-abrupt.js
@@ -0,0 +1,84 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while calling next (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-call-value-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-next-call-value-get-abrupt.js
new file mode 100644
index 0000000000..e37ab085d3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-call-value-get-abrupt.js
@@ -0,0 +1,94 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-call-value-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting value (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          done: true,
+          get value() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-next-get-abrupt.js
new file mode 100644
index 0000000000..16009cdf23
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-get-abrupt.js
@@ -0,0 +1,84 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Abrupt completion while getting next (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      get next() {
+        throw reason;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, "reject reason");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-non-object-ignores-then.js b/test/language/statements/class/async-gen-private-method-yield-star-next-non-object-ignores-then.js
new file mode 100644
index 0000000000..495150b0f3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-non-object-ignores-then.js
@@ -0,0 +1,104 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-non-object-ignores-then.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: If next() value is not-object, do not access respective then property (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+
+---*/
+Number.prototype.then = function() {
+  throw new Test262Error('Number#then should not be used');
+};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return 42;
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, 'TypeError');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-boolean-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-boolean-throw.js
new file mode 100644
index 0000000000..0fd699817c
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-boolean-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-boolean-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - boolean (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: true
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-null-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-null-throw.js
new file mode 100644
index 0000000000..6c02881f70
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-null-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-null-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - null (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: null
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-number-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-number-throw.js
new file mode 100644
index 0000000000..d4365fbc0a
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-number-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-number-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - number (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: 42
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-object-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-object-throw.js
new file mode 100644
index 0000000000..7f10b18a14
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-object-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-object-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - object (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: {}
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-string-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-string-throw.js
new file mode 100644
index 0000000000..a5c9a87aa4
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-string-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-string-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - string (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: ''
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-symbol-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-symbol-throw.js
new file mode 100644
index 0000000000..9cb1506bad
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-symbol-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-symbol-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - symbol (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: Symbol('oi')
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-undefined-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-undefined-throw.js
new file mode 100644
index 0000000000..e942797ef5
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-not-callable-undefined-throw.js
@@ -0,0 +1,81 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-not-callable-undefined-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Not-callable next value in a yield star position - undefined (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next: undefined
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v.constructor, TypeError, "TypeError");
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-get-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-get-abrupt.js
new file mode 100644
index 0000000000..8fe629fe3b
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-get-abrupt.js
@@ -0,0 +1,108 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-get-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Return abrupt after getting next().then (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          get then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-boolean-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-boolean-fulfillpromise.js
new file mode 100644
index 0000000000..7a9ebad34b
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-boolean-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-boolean-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (boolean) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: true,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-null-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-null-fulfillpromise.js
new file mode 100644
index 0000000000..3e7d5b6f83
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-null-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-null-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (null) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: null,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-number-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-number-fulfillpromise.js
new file mode 100644
index 0000000000..fda8feef39
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-number-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-number-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (number) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: 39,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-object-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-object-fulfillpromise.js
new file mode 100644
index 0000000000..2048f1f95f
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-object-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-object-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (object) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: {},
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-string-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-string-fulfillpromise.js
new file mode 100644
index 0000000000..6a06b3bc7d
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-string-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-string-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (string) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: '',
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-symbol-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-symbol-fulfillpromise.js
new file mode 100644
index 0000000000..17b7a22dcf
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-symbol-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-symbol-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (symbol) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: Symbol('oi'),
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-undefined-fulfillpromise.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-undefined-fulfillpromise.js
new file mode 100644
index 0000000000..fc7f9ca147
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-non-callable-undefined-fulfillpromise.js
@@ -0,0 +1,102 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-non-callable-undefined-fulfillpromise.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: FulfillPromise if next().then is not-callable (undefined) (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        iv. If Type(innerResult) is not Object, throw a TypeError exception.
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    7. If Type(resolution) is not Object, then
+      a. Return FulfillPromise(promise, resolution).
+    8. Let then be Get(resolution, "then").
+    ...
+    11. If IsCallable(thenAction) is false, then
+      a. Return FulfillPromise(promise, resolution).
+    ...
+
+---*/
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then: undefined,
+          value: 42,
+          done: false
+        }
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(({ value, done }) => {
+  assert.sameValue(value, 42);
+  assert.sameValue(done, false);
+}).then($DONE, $DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-next-then-returns-abrupt.js b/test/language/statements/class/async-gen-private-method-yield-star-next-then-returns-abrupt.js
new file mode 100644
index 0000000000..9844b94a2d
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-next-then-returns-abrupt.js
@@ -0,0 +1,108 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-next-then-returns-abrupt.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: Return abrupt after calling next().then (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, Symbol.asyncIterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+    ...
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+    ...
+
+    Await
+
+    ...
+    2. Let promiseCapability be ! NewPromiseCapability(%Promise%).
+    3. Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
+    ...
+
+    Promise Resolve Functions
+
+    ...
+    8. Let then be Get(resolution, "then").
+    ...
+    10. Get thenAction be then.[[Value]].
+    ...
+    12. Perform EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise,
+        resolution, thenAction »).
+    ...
+
+---*/
+var reason = {};
+var obj = {
+  get [Symbol.iterator]() {
+    throw new Test262Error('it should not get Symbol.iterator');
+  },
+  [Symbol.asyncIterator]() {
+    return {
+      next() {
+        return {
+          then() {
+            throw reason;
+          }
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        yield* obj;
+          throw new Test262Error('abrupt completion closes iter');
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+iter.next().then(() => {
+  throw new Test262Error('Promise incorrectly fulfilled.');
+}, v => {
+  assert.sameValue(v, reason, 'reject reason');
+
+  iter.next().then(({ done, value }) => {
+    assert.sameValue(done, true, 'the iterator is completed');
+    assert.sameValue(value, undefined, 'value is undefined');
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-sync-next.js b/test/language/statements/class/async-gen-private-method-yield-star-sync-next.js
new file mode 100644
index 0000000000..3b4d9817ce
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-sync-next.js
@@ -0,0 +1,241 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-next.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: execution order for yield* with sync iterator and next() (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    2. Let value be ? GetValue(exprRef).
+    3. Let generatorKind be ! GetGeneratorKind().
+    4. Let iterator be ? GetIterator(value, generatorKind).
+    5. Let received be NormalCompletion(undefined).
+    6. Repeat
+      a. If received.[[Type]] is normal, then
+        i. Let innerResult be ? IteratorNext(iterator, received.[[Value]]).
+        ii. Let innerResult be ? Invoke(iterator, "next",
+            « received.[[Value]] »).
+        iii. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+        ...
+        v. Let done be ? IteratorComplete(innerResult).
+        vi. If done is true, then
+           1. Return ? IteratorValue(innerResult).
+        vii. Let received be GeneratorYield(innerResult).
+      ...
+
+    GetIterator ( obj [ , hint ] )
+
+    ...
+    3. If hint is async,
+      a. Set method to ? GetMethod(obj, @@asyncIterator).
+      b. If method is undefined,
+        i. Let syncMethod be ? GetMethod(obj, @@iterator).
+        ii. Let syncIterator be ? Call(syncMethod, obj).
+        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
+    ...
+
+    %AsyncFromSyncIteratorPrototype%.next ( value )
+
+    ...
+    5. Let nextResult be IteratorNext(syncIterator, value).
+    ...
+    7. Let nextValue be IteratorValue(nextResult).
+    ...
+    9. Let nextDone be IteratorComplete(nextResult).
+    ...
+    12. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « nextValue »).
+    ...
+    14. Set onFulfilled.[[Done]] to nextDone.
+    15. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+    Async Iterator Value Unwrap Functions
+
+    1. Return ! CreateIterResultObject(value, F.[[Done]]).
+
+---*/
+var log = [];
+var obj = {
+  get [Symbol.iterator]() {
+    log.push({
+      name: "get [Symbol.iterator]",
+      thisValue: this
+    });
+    return function() {
+      log.push({
+        name: "call [Symbol.iterator]",
+        thisValue: this,
+        args: [...arguments]
+      });
+      var nextCount = 0;
+      return {
+        name: "syncIterator",
+        get next() {
+          log.push({
+            name: "get next",
+            thisValue: this
+          });
+          return function() {
+            log.push({
+              name: "call next",
+              thisValue: this,
+              args: [...arguments]
+            });
+
+            nextCount++;
+            if (nextCount == 1) {
+              return {
+                name: "next-result-1",
+                get value() {
+                  log.push({
+                    name: "get next value (1)",
+                    thisValue: this
+                  });
+                  return "next-value-1";
+                },
+                get done() {
+                  log.push({
+                    name: "get next done (1)",
+                    thisValue: this
+                  });
+                  return false;
+                }
+              };
+            }
+
+            return {
+              name: "next-result-2",
+              get value() {
+                log.push({
+                  name: "get next value (2)",
+                  thisValue: this
+                });
+                return "next-value-2";
+              },
+              get done() {
+                log.push({
+                  name: "get next done (2)",
+                  thisValue: this
+                });
+                return true;
+              }
+            };
+          };
+        }
+      };
+    };
+  },
+  get [Symbol.asyncIterator]() {
+    log.push({ name: "get [Symbol.asyncIterator]" });
+    return null;
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next("next-arg-1").then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
+
+  assert.sameValue(log[2].name, "get [Symbol.iterator]");
+  assert.sameValue(log[2].thisValue, obj, "get [Symbol.iterator] thisValue");
+
+  assert.sameValue(log[3].name, "call [Symbol.iterator]");
+  assert.sameValue(log[3].thisValue, obj, "[Symbol.iterator] thisValue");
+  assert.sameValue(log[3].args.length, 0, "[Symbol.iterator] args.length");
+
+  assert.sameValue(log[4].name, "get next");
+  assert.sameValue(log[4].thisValue.name, "syncIterator", "get next thisValue");
+
+  assert.sameValue(log[5].name, "call next");
+  assert.sameValue(log[5].thisValue.name, "syncIterator", "next thisValue");
+  assert.sameValue(log[5].args.length, 1, "next args.length");
+  assert.sameValue(log[5].args[0], undefined, "next args[0]");
+
+  assert.sameValue(log[6].name, "get next done (1)");
+  assert.sameValue(log[6].thisValue.name, "next-result-1", "get next done thisValue");
+
+  assert.sameValue(log[7].name, "get next value (1)");
+  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next value thisValue");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 8, "log.length");
+
+  iter.next("next-arg-2").then(v => {
+    assert.sameValue(log[8].name, "call next");
+    assert.sameValue(log[8].thisValue.name, "syncIterator", "next thisValue");
+    assert.sameValue(log[8].args.length, 1, "next args.length");
+    assert.sameValue(log[8].args[0], "next-arg-2", "next args[0]");
+
+    assert.sameValue(log[9].name, "get next done (2)");
+    assert.sameValue(log[9].thisValue.name, "next-result-2", "get next done thisValue");
+
+    assert.sameValue(log[10].name, "get next value (2)");
+    assert.sameValue(log[10].thisValue.name, "next-result-2", "get next value thisValue");
+
+    assert.sameValue(log[11].name, "after yield*");
+    assert.sameValue(log[11].value, "next-value-2");
+
+    assert.sameValue(v.value, "return-value");
+    assert.sameValue(v.done, true);
+
+    assert.sameValue(log.length, 12, "log.length");
+  }).then($DONE, $DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-sync-return.js b/test/language/statements/class/async-gen-private-method-yield-star-sync-return.js
new file mode 100644
index 0000000000..c2f7f41ab3
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-sync-return.js
@@ -0,0 +1,216 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-return.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: execution order for yield* with sync iterator and return() (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, Symbol.asyncIterator, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      c. Else,
+        i. Assert: received.[[Type]] is return.
+        ii. Let return be ? GetMethod(iterator, "return").
+        iii. If return is undefined, return Completion(received).
+        iv. Let innerReturnResult be ? Call(return, iterator,
+            « received.[[Value]] »).
+        v. If generatorKind is async, then set innerReturnResult to
+           ? Await(innerReturnResult).
+        ...
+        vii. Let done be ? IteratorComplete(innerReturnResult).
+        viii. If done is true, then
+             1. Let value be ? IteratorValue(innerReturnResult).
+             2. Return Completion{[[Type]]: return, [[Value]]: value,
+                [[Target]]: empty}.
+        ix. Let received be GeneratorYield(innerResult).
+
+    %AsyncFromSyncIteratorPrototype%.return ( value )
+
+    5. Let return be GetMethod(syncIterator, "return").
+    ...
+    ...
+    8. Let returnResult be Call(return, syncIterator, « value »).
+    ...
+    11. Let returnValue be IteratorValue(returnResult).
+    ..
+    13. Let returnDone be IteratorComplete(returnResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined, « returnValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to returnDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var returnCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get return() {
+        log.push({
+          name: "get return",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call return",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          returnCount++;
+          if (returnCount == 1) {
+            return {
+              name: "return-result-1",
+              get value() {
+                log.push({
+                  name: "get return value (1)",
+                  thisValue: this
+                });
+                return "return-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get return done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "return-result-2",
+            get value() {
+              log.push({
+                name: "get return value (2)",
+                thisValue: this
+              });
+              return "return-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get return done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          yield* obj;
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.return("return-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get return");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get return thisValue");
+
+    assert.sameValue(log[3].name, "call return");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "return thisValue");
+    assert.sameValue(log[3].args.length, 1, "return args.length");
+    assert.sameValue(log[3].args[0], "return-arg-1", "return args[0]");
+
+    assert.sameValue(log[4].name, "get return done (1)");
+    assert.sameValue(log[4].thisValue.name, "return-result-1", "get return done thisValue");
+
+    assert.sameValue(log[5].name, "get return value (1)");
+    assert.sameValue(log[5].thisValue.name, "return-result-1", "get return value thisValue");
+
+    assert.sameValue(v.value, "return-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.return("return-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get return");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
+
+      assert.sameValue(log[7].name, "call return");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
+      assert.sameValue(log[7].args.length, 1, "return args.length");
+      assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
+
+      assert.sameValue(log[8].name, "get return done (2)");
+      assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
+
+      assert.sameValue(log[9].name, "get return value (2)");
+      assert.sameValue(log[9].thisValue.name, "return-result-2", "get return value thisValue");
+
+      assert.sameValue(v.value, "return-value-2");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 10, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-gen-private-method-yield-star-sync-throw.js b/test/language/statements/class/async-gen-private-method-yield-star-sync-throw.js
new file mode 100644
index 0000000000..28722834f8
--- /dev/null
+++ b/test/language/statements/class/async-gen-private-method-yield-star-sync-throw.js
@@ -0,0 +1,222 @@
+// This file was procedurally generated from the following sources:
+// - src/async-generators/yield-star-sync-throw.case
+// - src/async-generators/default/async-class-decl-private-method.template
+/*---
+description: execution order for yield* with sync iterator and throw() (Async Generator method as a ClassDeclaration element)
+esid: prod-AsyncGeneratorPrivateMethod
+features: [Symbol.iterator, async-iteration, class-methods-private]
+flags: [generated, async]
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncGeneratorMethod
+
+    Async Generator Function Definitions
+
+    AsyncGeneratorMethod :
+      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
+
+
+    YieldExpression: yield * AssignmentExpression
+
+    ...
+    6. Repeat
+      ...
+      b. Else if received.[[Type]] is throw, then
+        i. Let throw be ? GetMethod(iterator, "throw").
+        ii. If throw is not undefined, then
+          1. Let innerResult be ? Call(throw, iterator, « received.[[Value]] »).
+          2. If generatorKind is async, then set innerResult to
+             ? Await(innerResult).
+          ...
+          5. Let done be ? IteratorComplete(innerResult).
+          6. If done is true, then
+            a. Return ? IteratorValue(innerResult).
+          7. Let received be GeneratorYield(innerResult).
+      ...
+
+    %AsyncFromSyncIteratorPrototype%.throw ( value )
+
+    ...
+    5. Let throw be GetMethod(syncIterator, "throw").
+    ...
+    8. Let throwResult be Call(throw, syncIterator, « value »).
+    ...
+    11. Let throwValue be IteratorValue(throwResult).
+    ...
+    13. Let throwDone be IteratorComplete(throwResult).
+    ...
+    16. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
+        « throwValue »).
+    ...
+    18. Set onFulfilled.[[Done]] to throwDone.
+    19. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
+        onFulfilled, undefined, promiseCapability).
+    ...
+
+---*/
+var log = [];
+var obj = {
+  [Symbol.iterator]() {
+    var throwCount = 0;
+    return {
+      name: "syncIterator",
+      get next() {
+        log.push({ name: "get next" });
+        return function() {
+          return {
+            value: "next-value-1",
+            done: false
+          };
+        };
+      },
+      get throw() {
+        log.push({
+          name: "get throw",
+          thisValue: this
+        });
+        return function() {
+          log.push({
+            name: "call throw",
+            thisValue: this,
+            args: [...arguments]
+          });
+
+          throwCount++;
+          if (throwCount == 1) {
+            return {
+              name: "throw-result-1",
+              get value() {
+                log.push({
+                  name: "get throw value (1)",
+                  thisValue: this
+                });
+                return "throw-value-1";
+              },
+              get done() {
+                log.push({
+                  name: "get throw done (1)",
+                  thisValue: this
+                });
+                return false;
+              }
+            };
+          }
+
+          return {
+            name: "throw-result-2",
+            get value() {
+              log.push({
+                name: "get throw value (2)",
+                thisValue: this
+              });
+              return "throw-value-2";
+            },
+            get done() {
+              log.push({
+                name: "get throw done (2)",
+                thisValue: this
+              });
+              return true;
+            }
+          };
+        };
+      }
+    };
+  }
+};
+
+
+
+var callCount = 0;
+
+class C {
+    async *#gen() {
+        callCount += 1;
+        log.push({ name: "before yield*" });
+          var v = yield* obj;
+          log.push({
+            name: "after yield*",
+            value: v
+          });
+          return "return-value";
+
+    }
+    get gen() { return this.#gen; }
+}
+
+const c = new C();
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
+
+assert.sameValue(log.length, 0, "log.length");
+
+iter.next().then(v => {
+  assert.sameValue(log[0].name, "before yield*");
+
+  assert.sameValue(log[1].name, "get next");
+
+  assert.sameValue(v.value, "next-value-1");
+  assert.sameValue(v.done, false);
+
+  assert.sameValue(log.length, 2, "log.length");
+
+  iter.throw("throw-arg-1").then(v => {
+    assert.sameValue(log[2].name, "get throw");
+    assert.sameValue(log[2].thisValue.name, "syncIterator", "get throw thisValue");
+
+    assert.sameValue(log[3].name, "call throw");
+    assert.sameValue(log[3].thisValue.name, "syncIterator", "throw thisValue");
+    assert.sameValue(log[3].args.length, 1, "throw args.length");
+    assert.sameValue(log[3].args[0], "throw-arg-1", "throw args[0]");
+
+    assert.sameValue(log[4].name, "get throw done (1)");
+    assert.sameValue(log[4].thisValue.name, "throw-result-1", "get throw done thisValue");
+
+    assert.sameValue(log[5].name, "get throw value (1)");
+    assert.sameValue(log[5].thisValue.name, "throw-result-1", "get throw value thisValue");
+
+    assert.sameValue(v.value, "throw-value-1");
+    assert.sameValue(v.done, false);
+
+    assert.sameValue(log.length, 6, "log.length");
+
+    iter.throw("throw-arg-2").then(v => {
+      assert.sameValue(log[6].name, "get throw");
+      assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
+
+      assert.sameValue(log[7].name, "call throw");
+      assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
+      assert.sameValue(log[7].args.length, 1, "throw args.length");
+      assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
+
+      assert.sameValue(log[8].name, "get throw done (2)");
+      assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
+
+      assert.sameValue(log[9].name, "get throw value (2)");
+      assert.sameValue(log[9].thisValue.name, "throw-result-2", "get throw value thisValue");
+
+      assert.sameValue(log[10].name, "after yield*");
+      assert.sameValue(log[10].value, "throw-value-2");
+
+      assert.sameValue(v.value, "return-value");
+      assert.sameValue(v.done, true);
+
+      assert.sameValue(log.length, 11, "log.length");
+    }).then($DONE, $DONE);
+  }).catch($DONE);
+}).catch($DONE);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/async-private-method-await-as-binding-identifier-escaped.js b/test/language/statements/class/async-private-method-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..07e0d484d5
--- /dev/null
+++ b/test/language/statements/class/async-private-method-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier-escaped.case
+// - src/async-functions/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async #method() {
+    var \u0061wait;
+}}
diff --git a/test/language/statements/class/async-private-method-await-as-binding-identifier.js b/test/language/statements/class/async-private-method-await-as-binding-identifier.js
new file mode 100644
index 0000000000..00964e33d7
--- /dev/null
+++ b/test/language/statements/class/async-private-method-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier.case
+// - src/async-functions/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async #method() {
+    var await;
+}}
diff --git a/test/language/statements/class/async-private-method-await-as-identifier-reference-escaped.js b/test/language/statements/class/async-private-method-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..0770c691d4
--- /dev/null
+++ b/test/language/statements/class/async-private-method-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference-escaped.case
+// - src/async-functions/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async #method() {
+    void \u0061wait;
+}}
diff --git a/test/language/statements/class/async-private-method-await-as-identifier-reference.js b/test/language/statements/class/async-private-method-await-as-identifier-reference.js
new file mode 100644
index 0000000000..61a5506e15
--- /dev/null
+++ b/test/language/statements/class/async-private-method-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference.case
+// - src/async-functions/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async #method() {
+    void await;
+}}
diff --git a/test/language/statements/class/async-private-method-await-as-label-identifier-escaped.js b/test/language/statements/class/async-private-method-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..d685ae6b22
--- /dev/null
+++ b/test/language/statements/class/async-private-method-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier-escaped.case
+// - src/async-functions/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async #method() {
+    \u0061wait: ;
+}}
diff --git a/test/language/statements/class/async-private-method-await-as-label-identifier.js b/test/language/statements/class/async-private-method-await-as-label-identifier.js
new file mode 100644
index 0000000000..0dd1200900
--- /dev/null
+++ b/test/language/statements/class/async-private-method-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier.case
+// - src/async-functions/syntax/async-class-decl-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { async #method() {
+    await: ;
+}}
diff --git a/test/language/statements/class/async-private-method-static-await-as-binding-identifier-escaped.js b/test/language/statements/class/async-private-method-static-await-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..baa630e65f
--- /dev/null
+++ b/test/language/statements/class/async-private-method-static-await-as-binding-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier-escaped.case
+// - src/async-functions/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async #method() {
+    var \u0061wait;
+}}
diff --git a/test/language/statements/class/async-private-method-static-await-as-binding-identifier.js b/test/language/statements/class/async-private-method-static-await-as-binding-identifier.js
new file mode 100644
index 0000000000..cff0e24402
--- /dev/null
+++ b/test/language/statements/class/async-private-method-static-await-as-binding-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-binding-identifier.case
+// - src/async-functions/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async #method() {
+    var await;
+}}
diff --git a/test/language/statements/class/async-private-method-static-await-as-identifier-reference-escaped.js b/test/language/statements/class/async-private-method-static-await-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..e8ff8d02c8
--- /dev/null
+++ b/test/language/statements/class/async-private-method-static-await-as-identifier-reference-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference-escaped.case
+// - src/async-functions/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async #method() {
+    void \u0061wait;
+}}
diff --git a/test/language/statements/class/async-private-method-static-await-as-identifier-reference.js b/test/language/statements/class/async-private-method-static-await-as-identifier-reference.js
new file mode 100644
index 0000000000..6de3d74913
--- /dev/null
+++ b/test/language/statements/class/async-private-method-static-await-as-identifier-reference.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-identifier-reference.case
+// - src/async-functions/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async #method() {
+    void await;
+}}
diff --git a/test/language/statements/class/async-private-method-static-await-as-label-identifier-escaped.js b/test/language/statements/class/async-private-method-static-await-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..2eae7d949d
--- /dev/null
+++ b/test/language/statements/class/async-private-method-static-await-as-label-identifier-escaped.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier-escaped.case
+// - src/async-functions/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async #method() {
+    \u0061wait: ;
+}}
diff --git a/test/language/statements/class/async-private-method-static-await-as-label-identifier.js b/test/language/statements/class/async-private-method-static-await-as-label-identifier.js
new file mode 100644
index 0000000000..c90b33963a
--- /dev/null
+++ b/test/language/statements/class/async-private-method-static-await-as-label-identifier.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/async-functions/await-as-label-identifier.case
+// - src/async-functions/syntax/async-class-decl-static-private-method.template
+/*---
+description: await is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static async private method as a ClassDeclaration element)
+esid: prod-AsyncMethod
+features: [async-functions, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      AsyncMethod
+
+    Async Function Definitions
+
+    AsyncMethod :
+      async [no LineTerminator here] # PropertyName ( UniqueFormalParameters ) { AsyncFunctionBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Await] parameter and
+    StringValue of Identifier is "await".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+
+class C { static async #method() {
+    await: ;
+}}
diff --git a/test/language/statements/class/gen-method-yield-identifier-spread-strict.js b/test/language/statements/class/gen-method-yield-identifier-spread-strict.js
index 007629c9b2..594be88f44 100644
--- a/test/language/statements/class/gen-method-yield-identifier-spread-strict.js
+++ b/test/language/statements/class/gen-method-yield-identifier-spread-strict.js
@@ -1,17 +1,17 @@
 // This file was procedurally generated from the following sources:
 // - src/generators/yield-identifier-spread-strict.case
-// - src/generators/default/class-decl-method.template
+// - src/generators/default/class-decl-private-method.template
 /*---
-description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Geenerator method as a ClassDeclaration element)
-esid: prod-GeneratorMethod
-features: [object-spread, generators]
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-methods-private]
 flags: [generated, onlyStrict]
 negative:
   phase: parse
   type: SyntaxError
 info: |
     ClassElement :
-      MethodDefinition
+      PrivateMethodDefinition
 
     MethodDefinition :
       GeneratorMethod
@@ -33,20 +33,33 @@ throw "Test262: This statement should not be evaluated.";
 
 var callCount = 0;
 
-class C { *gen() {
-    callCount += 1;
-    return {
-         ...(function() {
-            var yield;
-            throw new Test262Error();
-         }()),
-      }
-}}
+class C {
+    *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    get gen() { return this.#gen; }
+}
 
-var gen = C.prototype.gen;
+const c = new C();
 
-var iter = gen();
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
 
 
 
 assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/gen-method-yield-identifier-strict.js b/test/language/statements/class/gen-method-yield-identifier-strict.js
index 411de49e3b..95ab5b4149 100644
--- a/test/language/statements/class/gen-method-yield-identifier-strict.js
+++ b/test/language/statements/class/gen-method-yield-identifier-strict.js
@@ -1,17 +1,17 @@
 // This file was procedurally generated from the following sources:
 // - src/generators/yield-identifier-strict.case
-// - src/generators/default/class-decl-method.template
+// - src/generators/default/class-decl-private-method.template
 /*---
-description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Geenerator method as a ClassDeclaration element)
-esid: prod-GeneratorMethod
-features: [generators]
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-methods-private]
 flags: [generated, onlyStrict]
 negative:
   phase: parse
   type: SyntaxError
 info: |
     ClassElement :
-      MethodDefinition
+      PrivateMethodDefinition
 
     MethodDefinition :
       GeneratorMethod
@@ -26,18 +26,31 @@ throw "Test262: This statement should not be evaluated.";
 
 var callCount = 0;
 
-class C { *gen() {
-    callCount += 1;
-    (function() {
-        var yield;
-        throw new Test262Error();
-      }())
-}}
+class C {
+    *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    get gen() { return this.#gen; }
+}
 
-var gen = C.prototype.gen;
+const c = new C();
 
-var iter = gen();
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
 
 
 
 assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/gen-method-yield-spread-arr-multiple.js b/test/language/statements/class/gen-method-yield-spread-arr-multiple.js
index a2e10a8ce2..1725a9b35c 100644
--- a/test/language/statements/class/gen-method-yield-spread-arr-multiple.js
+++ b/test/language/statements/class/gen-method-yield-spread-arr-multiple.js
@@ -1,15 +1,15 @@
 // This file was procedurally generated from the following sources:
 // - src/generators/yield-spread-arr-multiple.case
-// - src/generators/default/class-decl-method.template
+// - src/generators/default/class-decl-private-method.template
 /*---
-description: Use yield value in a array spread position (Geenerator method as a ClassDeclaration element)
-esid: prod-GeneratorMethod
-features: [generators]
+description: Use yield value in a array spread position (Generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-methods-private]
 flags: [generated]
 includes: [compareArray.js]
 info: |
     ClassElement :
-      MethodDefinition
+      PrivateMethodDefinition
 
     MethodDefinition :
       GeneratorMethod
@@ -31,14 +31,22 @@ var item;
 
 var callCount = 0;
 
-class C { *gen() {
-    callCount += 1;
-    yield [...yield yield];
-}}
+class C {
+    *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    get gen() { return this.#gen; }
+}
 
-var gen = C.prototype.gen;
+const c = new C();
 
-var iter = gen();
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
 
 iter.next(false);
 item = iter.next(['a', 'b', 'c']);
@@ -48,3 +56,8 @@ assert(compareArray(item.value, arr));
 assert.sameValue(item.done, false);
 
 assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/gen-method-yield-spread-arr-single.js b/test/language/statements/class/gen-method-yield-spread-arr-single.js
index 4e94ae41a7..c1801eb476 100644
--- a/test/language/statements/class/gen-method-yield-spread-arr-single.js
+++ b/test/language/statements/class/gen-method-yield-spread-arr-single.js
@@ -1,14 +1,14 @@
 // This file was procedurally generated from the following sources:
 // - src/generators/yield-spread-arr-single.case
-// - src/generators/default/class-decl-method.template
+// - src/generators/default/class-decl-private-method.template
 /*---
-description: Use yield value in a array spread position (Geenerator method as a ClassDeclaration element)
-esid: prod-GeneratorMethod
-features: [generators]
+description: Use yield value in a array spread position (Generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-methods-private]
 flags: [generated]
 info: |
     ClassElement :
-      MethodDefinition
+      PrivateMethodDefinition
 
     MethodDefinition :
       GeneratorMethod
@@ -28,14 +28,22 @@ var arr = ['a', 'b', 'c'];
 
 var callCount = 0;
 
-class C { *gen() {
-    callCount += 1;
-    yield [...yield];
-}}
+class C {
+    *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    get gen() { return this.#gen; }
+}
 
-var gen = C.prototype.gen;
+const c = new C();
 
-var iter = gen();
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
 
 iter.next(false);
 var item = iter.next(arr);
@@ -50,3 +58,8 @@ assert.sameValue(value[2], 'c');
 assert.sameValue(item.done, false);
 
 assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/gen-method-yield-spread-obj.js b/test/language/statements/class/gen-method-yield-spread-obj.js
index 0636efd83d..93e1824ceb 100644
--- a/test/language/statements/class/gen-method-yield-spread-obj.js
+++ b/test/language/statements/class/gen-method-yield-spread-obj.js
@@ -1,15 +1,15 @@
 // This file was procedurally generated from the following sources:
 // - src/generators/yield-spread-obj.case
-// - src/generators/default/class-decl-method.template
+// - src/generators/default/class-decl-private-method.template
 /*---
-description: Use yield value in a object spread position (Geenerator method as a ClassDeclaration element)
-esid: prod-GeneratorMethod
-features: [object-spread, generators]
+description: Use yield value in a object spread position (Generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-methods-private]
 flags: [generated]
 includes: [compareArray.js]
 info: |
     ClassElement :
-      MethodDefinition
+      PrivateMethodDefinition
 
     MethodDefinition :
       GeneratorMethod
@@ -30,18 +30,26 @@ info: |
 
 var callCount = 0;
 
-class C { *gen() {
-    callCount += 1;
-    yield {
-        ...yield,
-        y: 1,
-        ...yield yield,
-      };
-}}
+class C {
+    *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    get gen() { return this.#gen; }
+}
 
-var gen = C.prototype.gen;
+const c = new C();
 
-var iter = gen();
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
+
+var iter = c.gen();
 
 iter.next();
 iter.next({ x: 42 });
@@ -54,3 +62,8 @@ assert.sameValue(Object.keys(item.value).length, 2);
 assert.sameValue(item.done, false);
 
 assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties after set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(c, "#gen"), false, 'Object.hasOwnProperty.call(c, "#gen")');
diff --git a/test/language/statements/class/gen-private-method-static-yield-as-binding-identifier-escaped.js b/test/language/statements/class/gen-private-method-static-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..e5da74e871
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier-escaped.case
+// - src/generators/syntax/class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C {static *#gen() {
+    var yi\u0065ld;
+}}
diff --git a/test/language/statements/class/gen-private-method-static-yield-as-binding-identifier.js b/test/language/statements/class/gen-private-method-static-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..9d08e191b8
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-as-binding-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier.case
+// - src/generators/syntax/class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Static generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C {static *#gen() {
+    var yield;
+}}
diff --git a/test/language/statements/class/gen-private-method-static-yield-as-identifier-reference-escaped.js b/test/language/statements/class/gen-private-method-static-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..271ca3a4f7
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference-escaped.case
+// - src/generators/syntax/class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C {static *#gen() {
+    void yi\u0065ld;
+}}
diff --git a/test/language/statements/class/gen-private-method-static-yield-as-identifier-reference.js b/test/language/statements/class/gen-private-method-static-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..349b6bae3c
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-as-identifier-reference.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference.case
+// - src/generators/syntax/class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Static generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C {static *#gen() {
+    void yield;
+}}
diff --git a/test/language/statements/class/gen-private-method-static-yield-as-label-identifier-escaped.js b/test/language/statements/class/gen-private-method-static-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..b7d8e31040
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-as-label-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier-escaped.case
+// - src/generators/syntax/class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C {static *#gen() {
+    yi\u0065ld: ;
+}}
diff --git a/test/language/statements/class/gen-private-method-static-yield-as-label-identifier.js b/test/language/statements/class/gen-private-method-static-yield-as-label-identifier.js
new file mode 100644
index 0000000000..4921370252
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-as-label-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier.case
+// - src/generators/syntax/class-decl-static-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Static generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C {static *#gen() {
+    yield: ;
+}}
diff --git a/test/language/statements/class/gen-private-method-static-yield-identifier-spread-strict.js b/test/language/statements/class/gen-private-method-static-yield-identifier-spread-strict.js
new file mode 100644
index 0000000000..a6001d19ec
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-identifier-spread-strict.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-identifier-spread-strict.case
+// - src/generators/default/class-decl-static-private-method.template
+/*---
+description: It's an early error if the AssignmentExpression is a function body with yield as an identifier in strict mode. (Static generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var callCount = 0;
+
+class C {
+    static *#gen() {
+        callCount += 1;
+        return {
+             ...(function() {
+                var yield;
+                throw new Test262Error();
+             }()),
+          }
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/gen-private-method-static-yield-identifier-strict.js b/test/language/statements/class/gen-private-method-static-yield-identifier-strict.js
new file mode 100644
index 0000000000..fe63c8a453
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-identifier-strict.js
@@ -0,0 +1,52 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-identifier-strict.case
+// - src/generators/default/class-decl-static-private-method.template
+/*---
+description: It's an early error if the generator body has another function body with yield as an identifier in strict mode. (Static generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-static-methods-private]
+flags: [generated, onlyStrict]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+var callCount = 0;
+
+class C {
+    static *#gen() {
+        callCount += 1;
+        (function() {
+            var yield;
+            throw new Test262Error();
+          }())
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/gen-private-method-static-yield-spread-arr-multiple.js b/test/language/statements/class/gen-private-method-static-yield-spread-arr-multiple.js
new file mode 100644
index 0000000000..c8f989297d
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-spread-arr-multiple.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-arr-multiple.case
+// - src/generators/default/class-decl-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+
+---*/
+var arr = ['a', 'b', 'c'];
+var item;
+
+var callCount = 0;
+
+class C {
+    static *#gen() {
+        callCount += 1;
+        yield [...yield yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+item = iter.next(['a', 'b', 'c']);
+item = iter.next(item.value);
+
+assert(compareArray(item.value, arr));
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/gen-private-method-static-yield-spread-arr-single.js b/test/language/statements/class/gen-private-method-static-yield-spread-arr-single.js
new file mode 100644
index 0000000000..fc071f30ae
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-spread-arr-single.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-arr-single.case
+// - src/generators/default/class-decl-static-private-method.template
+/*---
+description: Use yield value in a array spread position (Static generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [generators, class-static-methods-private]
+flags: [generated]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Array Initializer
+
+    SpreadElement[Yield, Await]:
+      ...AssignmentExpression[+In, ?Yield, ?Await]
+---*/
+var arr = ['a', 'b', 'c'];
+
+var callCount = 0;
+
+class C {
+    static *#gen() {
+        callCount += 1;
+        yield [...yield];
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next(false);
+var item = iter.next(arr);
+var value = item.value;
+
+assert.notSameValue(value, arr, 'value is a new array');
+assert(Array.isArray(value), 'value is an Array exotic object');
+assert.sameValue(value.length, 3)
+assert.sameValue(value[0], 'a');
+assert.sameValue(value[1], 'b');
+assert.sameValue(value[2], 'c');
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/gen-private-method-static-yield-spread-obj.js b/test/language/statements/class/gen-private-method-static-yield-spread-obj.js
new file mode 100644
index 0000000000..7ca80d67d4
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-static-yield-spread-obj.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-spread-obj.case
+// - src/generators/default/class-decl-static-private-method.template
+/*---
+description: Use yield value in a object spread position (Static generator private method as a ClassDeclaration element)
+esid: prod-GeneratorPrivateMethod
+features: [object-spread, generators, class-static-methods-private]
+flags: [generated]
+includes: [compareArray.js]
+info: |
+    ClassElement :
+      static PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    Spread Properties
+
+    PropertyDefinition[Yield]:
+      (...)
+      ...AssignmentExpression[In, ?Yield]
+
+---*/
+
+var callCount = 0;
+
+class C {
+    static *#gen() {
+        callCount += 1;
+        yield {
+            ...yield,
+            y: 1,
+            ...yield yield,
+          };
+    }
+    static get gen() { return this.#gen; }
+}
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
+
+var iter = C.gen();
+
+iter.next();
+iter.next({ x: 42 });
+iter.next({ x: 'lol' });
+var item = iter.next({ y: 39 });
+
+assert.sameValue(item.value.x, 42);
+assert.sameValue(item.value.y, 39);
+assert.sameValue(Object.keys(item.value).length, 2);
+assert.sameValue(item.done, false);
+
+assert.sameValue(callCount, 1);
+
+// Test the private fields do not appear as properties before set to value
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#gen"), false, 'Object.hasOwnProperty.call(C.prototype, "#gen")');
+assert.sameValue(Object.hasOwnProperty.call(C, "#gen"), false, 'Object.hasOwnProperty.call(C, "#gen")');
diff --git a/test/language/statements/class/gen-private-method-yield-as-binding-identifier-escaped.js b/test/language/statements/class/gen-private-method-yield-as-binding-identifier-escaped.js
new file mode 100644
index 0000000000..cd751f6232
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-yield-as-binding-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier-escaped.case
+// - src/generators/syntax/class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C { *#gen() {
+    var yi\u0065ld;
+}}
diff --git a/test/language/statements/class/gen-private-method-yield-as-binding-identifier.js b/test/language/statements/class/gen-private-method-yield-as-binding-identifier.js
new file mode 100644
index 0000000000..00ae3247b2
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-yield-as-binding-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-binding-identifier.case
+// - src/generators/syntax/class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a binding identifier. (Generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    BindingIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C { *#gen() {
+    var yield;
+}}
diff --git a/test/language/statements/class/gen-private-method-yield-as-identifier-reference-escaped.js b/test/language/statements/class/gen-private-method-yield-as-identifier-reference-escaped.js
new file mode 100644
index 0000000000..e6123cf404
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-yield-as-identifier-reference-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference-escaped.case
+// - src/generators/syntax/class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C { *#gen() {
+    void yi\u0065ld;
+}}
diff --git a/test/language/statements/class/gen-private-method-yield-as-identifier-reference.js b/test/language/statements/class/gen-private-method-yield-as-identifier-reference.js
new file mode 100644
index 0000000000..63b3d73ade
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-yield-as-identifier-reference.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-identifier-reference.case
+// - src/generators/syntax/class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as an identifier reference. (Generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    IdentifierReference : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C { *#gen() {
+    void yield;
+}}
diff --git a/test/language/statements/class/gen-private-method-yield-as-label-identifier-escaped.js b/test/language/statements/class/gen-private-method-yield-as-label-identifier-escaped.js
new file mode 100644
index 0000000000..fe4fa8049f
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-yield-as-label-identifier-escaped.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier-escaped.case
+// - src/generators/syntax/class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C { *#gen() {
+    yi\u0065ld: ;
+}}
diff --git a/test/language/statements/class/gen-private-method-yield-as-label-identifier.js b/test/language/statements/class/gen-private-method-yield-as-label-identifier.js
new file mode 100644
index 0000000000..32321d68f1
--- /dev/null
+++ b/test/language/statements/class/gen-private-method-yield-as-label-identifier.js
@@ -0,0 +1,35 @@
+// This file was procedurally generated from the following sources:
+// - src/generators/yield-as-label-identifier.case
+// - src/generators/syntax/class-decl-private-method.template
+/*---
+description: yield is a reserved keyword within generator function bodies and may not be used as a label identifier. (Generator method as a ClassDeclaration element)
+esid: prod-GeneratorMethod
+features: [generators, class-methods-private]
+flags: [generated]
+negative:
+  phase: parse
+  type: SyntaxError
+info: |
+    ClassElement :
+      PrivateMethodDefinition
+
+    MethodDefinition :
+      GeneratorMethod
+
+    14.4 Generator Function Definitions
+
+    GeneratorMethod :
+      * # PropertyName ( UniqueFormalParameters ) { GeneratorBody }
+
+
+    LabelIdentifier : Identifier
+
+    It is a Syntax Error if this production has a [Yield] parameter and
+    StringValue of Identifier is "yield".
+
+---*/
+throw "Test262: This statement should not be evaluated.";
+
+class C { *#gen() {
+    yield: ;
+}}