From 07a7ac999dead704b61beb346bf14efcac940fd7 Mon Sep 17 00:00:00 2001
From: Leo Balter <leonardo.balter@gmail.com>
Date: Tue, 4 Sep 2018 15:19:45 -0400
Subject: [PATCH] Add templates for trailing comma in arguments list

Also fix destination path for generated tests
And add a case for spread operator in the arguments before a trailing comma
---
 .../args-trailing-comma-multiple.case         | 14 ++++-
 src/arguments/args-trailing-comma-null.case   | 14 ++++-
 .../args-trailing-comma-single-args.case      | 14 ++++-
 .../args-trailing-comma-spread-operator.case  | 34 +++++++++++
 .../args-trailing-comma-undefined.case        | 14 ++++-
 .../default/async-gen-func-decl.template      |  2 +-
 .../default/async-gen-func-expr.template      |  2 +-
 src/arguments/default/async-gen-meth.template |  2 +-
 .../async-gen-named-func-expr.template        |  2 +-
 .../cls-decl-async-gen-meth-static.template   |  2 +-
 .../default/cls-decl-async-gen-meth.template  |  2 +-
 ...ecl-async-private-gen-meth-static.template | 39 ++++++++++++
 .../cls-decl-async-private-gen-meth.template  | 56 ++++++++++++++++++
 .../cls-decl-private-gen-meth-static.template | 31 ++++++++++
 .../cls-decl-private-gen-meth.template        | 31 ++++++++++
 .../cls-decl-private-meth-static.template     | 31 ++++++++++
 .../default/cls-decl-private-meth.template    | 31 ++++++++++
 .../cls-expr-async-gen-meth-static.template   |  2 +-
 .../default/cls-expr-async-gen-meth.template  |  2 +-
 ...xpr-async-private-gen-meth-static.template | 58 ++++++++++++++++++
 .../cls-expr-async-private-gen-meth.template  | 59 +++++++++++++++++++
 .../cls-expr-private-gen-meth-static.template | 31 ++++++++++
 .../cls-expr-private-gen-meth.template        | 31 ++++++++++
 .../cls-expr-private-meth-static.template     | 31 ++++++++++
 .../default/cls-expr-private-meth.template    | 31 ++++++++++
 25 files changed, 546 insertions(+), 20 deletions(-)
 create mode 100644 src/arguments/args-trailing-comma-spread-operator.case
 create mode 100644 src/arguments/default/cls-decl-async-private-gen-meth-static.template
 create mode 100644 src/arguments/default/cls-decl-async-private-gen-meth.template
 create mode 100644 src/arguments/default/cls-decl-private-gen-meth-static.template
 create mode 100644 src/arguments/default/cls-decl-private-gen-meth.template
 create mode 100644 src/arguments/default/cls-decl-private-meth-static.template
 create mode 100644 src/arguments/default/cls-decl-private-meth.template
 create mode 100644 src/arguments/default/cls-expr-async-private-gen-meth-static.template
 create mode 100644 src/arguments/default/cls-expr-async-private-gen-meth.template
 create mode 100644 src/arguments/default/cls-expr-private-gen-meth-static.template
 create mode 100644 src/arguments/default/cls-expr-private-gen-meth.template
 create mode 100644 src/arguments/default/cls-expr-private-meth-static.template
 create mode 100644 src/arguments/default/cls-expr-private-meth.template

diff --git a/src/arguments/args-trailing-comma-multiple.case b/src/arguments/args-trailing-comma-multiple.case
index 6fec35a0cc..b62a9d544d 100644
--- a/src/arguments/args-trailing-comma-multiple.case
+++ b/src/arguments/args-trailing-comma-multiple.case
@@ -4,13 +4,21 @@
 /*---
 desc: A trailing comma should not increase the arguments.length, using multiple args
 template: default
-esid: prod-Arguments
 info: |
     Trailing comma in the arguments list
 
-    12.3 Left-Hand-Side Expressions
+    Left-Hand-Side Expressions
 
-    Arguments[Yield, Await] : ( ArgumentList[?Yield, ?Await] , )
+    Arguments :
+        ( )
+        ( ArgumentList )
+        ( ArgumentList , )
+
+    ArgumentList :
+        AssignmentExpression
+        ... AssignmentExpression
+        ArgumentList , AssignmentExpression
+        ArgumentList , ... AssignmentExpression
 ---*/
 
 //- args
diff --git a/src/arguments/args-trailing-comma-null.case b/src/arguments/args-trailing-comma-null.case
index 1eb48aa0f3..267dca0311 100644
--- a/src/arguments/args-trailing-comma-null.case
+++ b/src/arguments/args-trailing-comma-null.case
@@ -3,13 +3,21 @@
 /*---
 desc: A trailing comma after null should not increase the arguments.length
 template: default
-esid: prod-Arguments
 info: |
     Trailing comma in the arguments list
 
-    12.3 Left-Hand-Side Expressions
+    Left-Hand-Side Expressions
 
-    Arguments[Yield, Await] : ( ArgumentList[?Yield, ?Await] , )
+    Arguments :
+        ( )
+        ( ArgumentList )
+        ( ArgumentList , )
+
+    ArgumentList :
+        AssignmentExpression
+        ... AssignmentExpression
+        ArgumentList , AssignmentExpression
+        ArgumentList , ... AssignmentExpression
 ---*/
 
 //- args
diff --git a/src/arguments/args-trailing-comma-single-args.case b/src/arguments/args-trailing-comma-single-args.case
index 33eceeb586..a9c2063e65 100644
--- a/src/arguments/args-trailing-comma-single-args.case
+++ b/src/arguments/args-trailing-comma-single-args.case
@@ -4,13 +4,21 @@
 /*---
 desc: A trailing comma should not increase the arguments.length, using a single arg
 template: default
-esid: prod-Arguments
 info: |
     Trailing comma in the arguments list
 
-    12.3 Left-Hand-Side Expressions
+    Left-Hand-Side Expressions
 
-    Arguments[Yield, Await] : ( ArgumentList[?Yield, ?Await] , )
+    Arguments :
+        ( )
+        ( ArgumentList )
+        ( ArgumentList , )
+
+    ArgumentList :
+        AssignmentExpression
+        ... AssignmentExpression
+        ArgumentList , AssignmentExpression
+        ArgumentList , ... AssignmentExpression
 ---*/
 
 //- args
diff --git a/src/arguments/args-trailing-comma-spread-operator.case b/src/arguments/args-trailing-comma-spread-operator.case
new file mode 100644
index 0000000000..420d9fdfa1
--- /dev/null
+++ b/src/arguments/args-trailing-comma-spread-operator.case
@@ -0,0 +1,34 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: A trailing comma should not increase the arguments.length, using spread args
+template: default
+info: |
+    Trailing comma in the arguments list
+
+    Left-Hand-Side Expressions
+
+    Arguments :
+        ( )
+        ( ArgumentList )
+        ( ArgumentList , )
+
+    ArgumentList :
+        AssignmentExpression
+        ... AssignmentExpression
+        ArgumentList , AssignmentExpression
+        ArgumentList , ... AssignmentExpression
+---*/
+
+//- setup
+var arr = [2, 3];
+
+//- args
+42, ...[1], ...arr,
+//- body
+assert.sameValue(arguments.length, 4);
+assert.sameValue(arguments[0], 42);
+assert.sameValue(arguments[1], 1);
+assert.sameValue(arguments[2], 2);
+assert.sameValue(arguments[3], 3);
diff --git a/src/arguments/args-trailing-comma-undefined.case b/src/arguments/args-trailing-comma-undefined.case
index c8cd3ec3ba..d54dffb941 100644
--- a/src/arguments/args-trailing-comma-undefined.case
+++ b/src/arguments/args-trailing-comma-undefined.case
@@ -3,13 +3,21 @@
 /*---
 desc: A trailing comma after undefined should not increase the arguments.length
 template: default
-esid: prod-Arguments
 info: |
     Trailing comma in the arguments list
 
-    12.3 Left-Hand-Side Expressions
+    Left-Hand-Side Expressions
 
-    Arguments[Yield, Await] : ( ArgumentList[?Yield, ?Await] , )
+    Arguments :
+        ( )
+        ( ArgumentList )
+        ( ArgumentList , )
+
+    ArgumentList :
+        AssignmentExpression
+        ... AssignmentExpression
+        ArgumentList , AssignmentExpression
+        ArgumentList , ... AssignmentExpression
 ---*/
 
 //- args
diff --git a/src/arguments/default/async-gen-func-decl.template b/src/arguments/default/async-gen-func-decl.template
index 246b59921e..ddccb89cc6 100644
--- a/src/arguments/default/async-gen-func-decl.template
+++ b/src/arguments/default/async-gen-func-decl.template
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-path: language/statements/async-generator/
+path: language/arguments-object/cls-decl-async-gen-func-
 name: async generator function declaration
 esid: sec-asyncgenerator-definitions-instantiatefunctionobject
 info: |
diff --git a/src/arguments/default/async-gen-func-expr.template b/src/arguments/default/async-gen-func-expr.template
index 0647ade7f9..900a42086e 100644
--- a/src/arguments/default/async-gen-func-expr.template
+++ b/src/arguments/default/async-gen-func-expr.template
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-path: language/expressions/async-generator/
+path: language/arguments-object/cls-expr-async-gen-func-
 name: async generator function expression
 esid: sec-asyncgenerator-definitions-evaluation
 info: |
diff --git a/src/arguments/default/async-gen-meth.template b/src/arguments/default/async-gen-meth.template
index bc726b3453..477dbd560f 100644
--- a/src/arguments/default/async-gen-meth.template
+++ b/src/arguments/default/async-gen-meth.template
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-path: language/expressions/object/method-definition/async-gen-meth-
+path: language/arguments-object/async-gen-meth-
 name: async generator method
 esid: sec-asyncgenerator-definitions-propertydefinitionevaluation
 info: |
diff --git a/src/arguments/default/async-gen-named-func-expr.template b/src/arguments/default/async-gen-named-func-expr.template
index a196a6dc95..f89be065aa 100644
--- a/src/arguments/default/async-gen-named-func-expr.template
+++ b/src/arguments/default/async-gen-named-func-expr.template
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-path: language/expressions/async-generator/named-
+path: language/arguments-object/async-gen-named-func-expr-
 name: async generator named function expression
 esid: sec-asyncgenerator-definitions-evaluation
 info: |
diff --git a/src/arguments/default/cls-decl-async-gen-meth-static.template b/src/arguments/default/cls-decl-async-gen-meth-static.template
index 75d27616b0..3009158423 100644
--- a/src/arguments/default/cls-decl-async-gen-meth-static.template
+++ b/src/arguments/default/cls-decl-async-gen-meth-static.template
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-path: language/statements/class/async-gen-meth-static-
+path: language/arguments-object/cls-decl-async-gen-meth-static-
 name: static class expression generator method
 esid: sec-runtime-semantics-bindingclassdeclarationevaluation
 info: |
diff --git a/src/arguments/default/cls-decl-async-gen-meth.template b/src/arguments/default/cls-decl-async-gen-meth.template
index f0eac2cff4..bbc94205fe 100644
--- a/src/arguments/default/cls-decl-async-gen-meth.template
+++ b/src/arguments/default/cls-decl-async-gen-meth.template
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-path: language/statements/class/async-gen-meth-
+path: language/arguments-object/cls-decl-async-gen-meth-
 name: class expression method
 esid: sec-class-definitions-runtime-semantics-evaluation
 info: |
diff --git a/src/arguments/default/cls-decl-async-private-gen-meth-static.template b/src/arguments/default/cls-decl-async-private-gen-meth-static.template
new file mode 100644
index 0000000000..fcc7403c8e
--- /dev/null
+++ b/src/arguments/default/cls-decl-async-private-gen-meth-static.template
@@ -0,0 +1,39 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-decl-async-private-gen-meth-static-
+name: static class expression private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+  Arguments :
+    ( )
+    ( ArgumentList )
+    ( ArgumentList , )
+
+  ArgumentList :
+    AssignmentExpression
+    ... AssignmentExpression
+    ArgumentList , AssignmentExpression
+    ArgumentList , ... AssignmentExpression
+
+
+flags: [async]
+features: [async-iteration, class, class-static-methods-private]
+---*/
+
+var callCount = 0;
+class C {
+  static async * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  static get method() {
+      return this.#method;
+  }
+}
+
+C.method(/*{ args }*/).next().then(() => {
+    assert.sameValue(callCount, 1, 'method invoked exactly once');
+}).then($DONE, $DONE);
diff --git a/src/arguments/default/cls-decl-async-private-gen-meth.template b/src/arguments/default/cls-decl-async-private-gen-meth.template
new file mode 100644
index 0000000000..89f9c0051f
--- /dev/null
+++ b/src/arguments/default/cls-decl-async-private-gen-meth.template
@@ -0,0 +1,56 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/arguments-object/cls-decl-async-private-gen-meth-
+name: static class declaration private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    ClassDeclaration : class BindingIdentifier ClassTail
+
+    1. Let className be StringValue of BindingIdentifier.
+    2. Let value be the result of ClassDefinitionEvaluation of ClassTail with
+       argument className.
+    [...]
+
+    14.5.14 Runtime Semantics: ClassDefinitionEvaluation
+
+    21. For each ClassElement m in order from methods
+        a. If IsStatic of m is false, then
+           i. Let status be the result of performing
+              PropertyDefinitionEvaluation for m with arguments proto and
+              false.
+        [...]
+
+    Runtime Semantics: PropertyDefinitionEvaluation
+
+    AsyncGeneratorMethod :
+        async [no LineTerminator here] * PropertyName ( UniqueFormalParameters )
+            { AsyncGeneratorBody }
+
+    1. Let propKey be the result of evaluating PropertyName.
+    2. ReturnIfAbrupt(propKey).
+    3. If the function code for this AsyncGeneratorMethod is strict mode code, let strict be true.
+       Otherwise let strict be false.
+    4. Let scope be the running execution context's LexicalEnvironment.
+    5. Let closure be ! AsyncGeneratorFunctionCreate(Method, UniqueFormalParameters,
+       AsyncGeneratorBody, scope, strict).
+    [...]
+flags: [async]
+features: [async-iteration, class, class-methods-private]
+---*/
+
+var callCount = 0;
+class C {
+  async * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  get method() {
+    return this.#method;
+  }
+}
+
+new C().method(/*{ args }*/).next().then(() => {
+    assert.sameValue(callCount, 1, 'method invoked exactly once');
+}).then($DONE, $DONE);
diff --git a/src/arguments/default/cls-decl-private-gen-meth-static.template b/src/arguments/default/cls-decl-private-gen-meth-static.template
new file mode 100644
index 0000000000..1b25c82453
--- /dev/null
+++ b/src/arguments/default/cls-decl-private-gen-meth-static.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-decl-private-gen-meth-static-
+name: class declaration private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [generators, class, class-static-methods-private]
+---*/
+
+var callCount = 0;
+class C {
+  static * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  static get method() {
+    return this.#method;
+  }
+}
+
+C.method(/*{ args }*/).next();
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-decl-private-gen-meth.template b/src/arguments/default/cls-decl-private-gen-meth.template
new file mode 100644
index 0000000000..4f15350cf2
--- /dev/null
+++ b/src/arguments/default/cls-decl-private-gen-meth.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-decl-private-gen-meth-
+name: class declaration private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [generators, class, class-methods-private]
+---*/
+
+var callCount = 0;
+class C {
+  * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  get method() {
+    return this.#method;
+  }
+}
+
+new C().method(/*{ args }*/).next();
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-decl-private-meth-static.template b/src/arguments/default/cls-decl-private-meth-static.template
new file mode 100644
index 0000000000..2473d27f43
--- /dev/null
+++ b/src/arguments/default/cls-decl-private-meth-static.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-decl-private-meth-static-
+name: static class declaration private method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [class, class, class-static-methods-private]
+---*/
+
+var callCount = 0;
+class C {
+  static #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  static get method() {
+    return this.#method;
+  }
+}
+
+C.method(/*{ args }*/);
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-decl-private-meth.template b/src/arguments/default/cls-decl-private-meth.template
new file mode 100644
index 0000000000..ed95c0d283
--- /dev/null
+++ b/src/arguments/default/cls-decl-private-meth.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-decl-private-meth-
+name: class declaration private method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [class, class, class-methods-private]
+---*/
+
+var callCount = 0;
+class C {
+  #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  get method() {
+    return this.#method;
+  }
+}
+
+new C().method(/*{ args }*/);
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-expr-async-gen-meth-static.template b/src/arguments/default/cls-expr-async-gen-meth-static.template
index 9f0b4bddf5..383e93de17 100644
--- a/src/arguments/default/cls-expr-async-gen-meth-static.template
+++ b/src/arguments/default/cls-expr-async-gen-meth-static.template
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-path: language/expressions/class/async-gen-meth-static-
+path: language/arguments-object/cls-expr-async-gen-meth-static-
 name: static class expression async generator method
 esid: sec-class-definitions-runtime-semantics-evaluation
 info: |
diff --git a/src/arguments/default/cls-expr-async-gen-meth.template b/src/arguments/default/cls-expr-async-gen-meth.template
index 4bcf442bb5..0566239b24 100644
--- a/src/arguments/default/cls-expr-async-gen-meth.template
+++ b/src/arguments/default/cls-expr-async-gen-meth.template
@@ -2,7 +2,7 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-path: language/expressions/class/async-gen-meth-
+path: language/arguments-object/cls-expr-async-gen-meth-
 name: class expression async generator method
 esid: sec-class-definitions-runtime-semantics-evaluation
 info: |
diff --git a/src/arguments/default/cls-expr-async-private-gen-meth-static.template b/src/arguments/default/cls-expr-async-private-gen-meth-static.template
new file mode 100644
index 0000000000..4800d06afa
--- /dev/null
+++ b/src/arguments/default/cls-expr-async-private-gen-meth-static.template
@@ -0,0 +1,58 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-expr-async-private-gen-meth-static-
+name: static class expression async private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    ClassExpression : class BindingIdentifieropt ClassTail
+
+    1. If BindingIdentifieropt is not present, let className be undefined.
+    2. Else, let className be StringValue of BindingIdentifier.
+    3. Let value be the result of ClassDefinitionEvaluation of ClassTail
+       with argument className.
+    [...]
+
+    14.5.14 Runtime Semantics: ClassDefinitionEvaluation
+
+    21. For each ClassElement m in order from methods
+        a. If IsStatic of m is false, then
+        b. Else,
+           Let status be the result of performing PropertyDefinitionEvaluation
+           for m with arguments F and false.
+    [...]
+
+    Runtime Semantics: PropertyDefinitionEvaluation
+
+    AsyncGeneratorMethod :
+        async [no LineTerminator here] * PropertyName ( UniqueFormalParameters )
+            { AsyncGeneratorBody }
+
+    1. Let propKey be the result of evaluating PropertyName.
+    2. ReturnIfAbrupt(propKey).
+    3. If the function code for this AsyncGeneratorMethod is strict mode code, let strict be true.
+       Otherwise let strict be false.
+    4. Let scope be the running execution context's LexicalEnvironment.
+    5. Let closure be ! AsyncGeneratorFunctionCreate(Method, UniqueFormalParameters,
+       AsyncGeneratorBody, scope, strict).
+    [...]
+flags: [async]
+features: [async-iteration, class, class-static-methods-private]
+---*/
+
+var callCount = 0;
+var C = class {
+  static async * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  static get method() {
+    return this.#method;
+  }
+};
+
+C.method(/*{ args }*/).next().then(() => {
+    assert.sameValue(callCount, 1, 'method invoked exactly once');
+}).then($DONE, $DONE);
diff --git a/src/arguments/default/cls-expr-async-private-gen-meth.template b/src/arguments/default/cls-expr-async-private-gen-meth.template
new file mode 100644
index 0000000000..8fc0fe2b94
--- /dev/null
+++ b/src/arguments/default/cls-expr-async-private-gen-meth.template
@@ -0,0 +1,59 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-expr-async-private-gen-meth-
+name: class expression async private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    ClassExpression : class BindingIdentifieropt ClassTail
+
+    1. If BindingIdentifieropt is not present, let className be undefined.
+    2. Else, let className be StringValue of BindingIdentifier.
+    3. Let value be the result of ClassDefinitionEvaluation of ClassTail
+       with argument className.
+    [...]
+
+    14.5.14 Runtime Semantics: ClassDefinitionEvaluation
+
+    21. For each ClassElement m in order from methods
+        a. If IsStatic of m is false, then
+           i. Let status be the result of performing
+              PropertyDefinitionEvaluation for m with arguments proto and
+              false.
+        [...]
+
+    Runtime Semantics: PropertyDefinitionEvaluation
+
+    AsyncGeneratorMethod :
+        async [no LineTerminator here] * PropertyName ( UniqueFormalParameters )
+            { AsyncGeneratorBody }
+
+    1. Let propKey be the result of evaluating PropertyName.
+    2. ReturnIfAbrupt(propKey).
+    3. If the function code for this AsyncGeneratorMethod is strict mode code, let strict be true.
+       Otherwise let strict be false.
+    4. Let scope be the running execution context's LexicalEnvironment.
+    5. Let closure be ! AsyncGeneratorFunctionCreate(Method, UniqueFormalParameters,
+       AsyncGeneratorBody, scope, strict).
+    [...]
+flags: [async]
+features: [async-iteration, class, class-methods-private]
+---*/
+
+var callCount = 0;
+var C = class {
+  async * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  get method() {
+    return this.#method;
+  }
+};
+
+new C().method(/*{ args }*/).next().then(() => {
+    assert.sameValue(callCount, 1, 'method invoked exactly once');
+}).then($DONE, $DONE);
+
diff --git a/src/arguments/default/cls-expr-private-gen-meth-static.template b/src/arguments/default/cls-expr-private-gen-meth-static.template
new file mode 100644
index 0000000000..85d742bece
--- /dev/null
+++ b/src/arguments/default/cls-expr-private-gen-meth-static.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-expr-private-gen-meth-static-
+name: static class expression private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [generators, class, class-static-methods-private]
+---*/
+
+var callCount = 0;
+var C = class {
+  static * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  static get method() {
+    return this.#method;
+  }
+};
+
+C.method(/*{ args }*/).next();
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-expr-private-gen-meth.template b/src/arguments/default/cls-expr-private-gen-meth.template
new file mode 100644
index 0000000000..5a3ed59da8
--- /dev/null
+++ b/src/arguments/default/cls-expr-private-gen-meth.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-expr-private-gen-meth-
+name: class expression private generator method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [generators, class, class-methods-private]
+---*/
+
+var callCount = 0;
+var C = class {
+  * #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  get method() {
+    return this.#method;
+  }
+};
+
+new C().method(/*{ args }*/).next();
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-expr-private-meth-static.template b/src/arguments/default/cls-expr-private-meth-static.template
new file mode 100644
index 0000000000..c2b341e910
--- /dev/null
+++ b/src/arguments/default/cls-expr-private-meth-static.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-expr-private-meth-static-
+name: static class expression private method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [class, class-static-methods-private]
+---*/
+
+var callCount = 0;
+var C = class {
+  static #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  static get method() {
+    return this.#method;
+  }
+};
+
+C.method(/*{ args }*/);
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
diff --git a/src/arguments/default/cls-expr-private-meth.template b/src/arguments/default/cls-expr-private-meth.template
new file mode 100644
index 0000000000..51893c71d8
--- /dev/null
+++ b/src/arguments/default/cls-expr-private-meth.template
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+path: language/arguments-object/cls-expr-private-meth-
+name: class expression private method
+esid: sec-argument-lists-runtime-semantics-argumentlistevaluation
+info: |
+    9.4.4 Arguments Exotic Objects
+
+    Most ECMAScript functions make an arguments object available to their code. Depending upon the
+    characteristics of the function definition, its arguments object is either an ordinary object
+    or an arguments exotic object.
+features: [class, class-methods-private]
+---*/
+
+var callCount = 0;
+var C = class {
+  #method() {
+    /*{ body }*/
+    callCount = callCount + 1;
+  }
+
+  get method() {
+    return this.#method;
+  }
+};
+
+new C().method(/*{ args }*/);
+
+assert.sameValue(callCount, 1, 'method invoked exactly once');
-- 
GitLab