From f91886421d12e4b074b2d83dffea76e37db604e1 Mon Sep 17 00:00:00 2001
From: Mike Pennisi <mike@mikepennisi.com>
Date: Sat, 11 Jun 2016 17:44:14 -0400
Subject: [PATCH] Generate tests

---
 .../array/spread-err-mult-err-expr-throws.js  | 36 ++++++++++
 .../spread-err-mult-err-iter-get-value.js     | 49 ++++++++++++++
 .../array/spread-err-mult-err-itr-get-call.js | 47 +++++++++++++
 .../array/spread-err-mult-err-itr-get-get.js  | 48 +++++++++++++
 .../array/spread-err-mult-err-itr-step.js     | 57 ++++++++++++++++
 .../array/spread-err-mult-err-itr-value.js    | 60 +++++++++++++++++
 .../array/spread-err-mult-err-unresolvable.js | 43 ++++++++++++
 .../array/spread-err-sngl-err-expr-throws.js  | 38 +++++++++++
 .../array/spread-err-sngl-err-itr-get-call.js | 48 +++++++++++++
 .../array/spread-err-sngl-err-itr-get-get.js  | 49 ++++++++++++++
 .../spread-err-sngl-err-itr-get-value.js      | 48 +++++++++++++
 .../array/spread-err-sngl-err-itr-step.js     | 61 +++++++++++++++++
 .../array/spread-err-sngl-err-itr-value.js    | 67 +++++++++++++++++++
 .../array/spread-err-sngl-err-unresolvable.js | 44 ++++++++++++
 .../expressions/array/spread-mult-empty.js    | 48 +++++++++++++
 .../expressions/array/spread-mult-expr.js     | 53 +++++++++++++++
 .../expressions/array/spread-mult-iter.js     | 65 ++++++++++++++++++
 .../expressions/array/spread-mult-literal.js  | 50 ++++++++++++++
 .../expressions/array/spread-sngl-empty.js    | 47 +++++++++++++
 .../expressions/array/spread-sngl-expr.js     | 55 +++++++++++++++
 .../expressions/array/spread-sngl-iter.js     | 62 +++++++++++++++++
 .../expressions/array/spread-sngl-literal.js  | 52 ++++++++++++++
 .../expressions/call/spread-mult-expr.js      | 51 ++++++++++++++
 .../expressions/call/spread-mult-literal.js   | 48 +++++++++++++
 .../expressions/call/spread-sngl-expr.js      | 53 +++++++++++++++
 .../expressions/call/spread-sngl-literal.js   | 50 ++++++++++++++
 .../expressions/new/spread-mult-expr.js       | 50 ++++++++++++++
 .../expressions/new/spread-mult-literal.js    | 47 +++++++++++++
 .../expressions/new/spread-sngl-expr.js       | 52 ++++++++++++++
 .../expressions/new/spread-sngl-literal.js    | 49 ++++++++++++++
 .../expressions/super/spread-mult-expr.js     | 57 ++++++++++++++++
 .../expressions/super/spread-mult-literal.js  | 54 +++++++++++++++
 .../expressions/super/spread-sngl-expr.js     | 59 ++++++++++++++++
 .../expressions/super/spread-sngl-literal.js  | 56 ++++++++++++++++
 34 files changed, 1753 insertions(+)
 create mode 100644 test/language/expressions/array/spread-err-mult-err-expr-throws.js
 create mode 100644 test/language/expressions/array/spread-err-mult-err-iter-get-value.js
 create mode 100644 test/language/expressions/array/spread-err-mult-err-itr-get-call.js
 create mode 100644 test/language/expressions/array/spread-err-mult-err-itr-get-get.js
 create mode 100644 test/language/expressions/array/spread-err-mult-err-itr-step.js
 create mode 100644 test/language/expressions/array/spread-err-mult-err-itr-value.js
 create mode 100644 test/language/expressions/array/spread-err-mult-err-unresolvable.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-expr-throws.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-itr-get-call.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-itr-get-get.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-itr-get-value.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-itr-step.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-itr-value.js
 create mode 100644 test/language/expressions/array/spread-err-sngl-err-unresolvable.js
 create mode 100644 test/language/expressions/array/spread-mult-empty.js
 create mode 100644 test/language/expressions/array/spread-mult-expr.js
 create mode 100644 test/language/expressions/array/spread-mult-iter.js
 create mode 100644 test/language/expressions/array/spread-mult-literal.js
 create mode 100644 test/language/expressions/array/spread-sngl-empty.js
 create mode 100644 test/language/expressions/array/spread-sngl-expr.js
 create mode 100644 test/language/expressions/array/spread-sngl-iter.js
 create mode 100644 test/language/expressions/array/spread-sngl-literal.js
 create mode 100644 test/language/expressions/call/spread-mult-expr.js
 create mode 100644 test/language/expressions/call/spread-mult-literal.js
 create mode 100644 test/language/expressions/call/spread-sngl-expr.js
 create mode 100644 test/language/expressions/call/spread-sngl-literal.js
 create mode 100644 test/language/expressions/new/spread-mult-expr.js
 create mode 100644 test/language/expressions/new/spread-mult-literal.js
 create mode 100644 test/language/expressions/new/spread-sngl-expr.js
 create mode 100644 test/language/expressions/new/spread-sngl-literal.js
 create mode 100644 test/language/expressions/super/spread-mult-expr.js
 create mode 100644 test/language/expressions/super/spread-mult-literal.js
 create mode 100644 test/language/expressions/super/spread-sngl-expr.js
 create mode 100644 test/language/expressions/super/spread-sngl-literal.js

diff --git a/test/language/expressions/array/spread-err-mult-err-expr-throws.js b/test/language/expressions/array/spread-err-mult-err-expr-throws.js
new file mode 100644
index 0000000000..f9bba177f1
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-expr-throws.js
@@ -0,0 +1,36 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-expr-throws.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when evaluation throws (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+---*/
+
+assert.throws(Test262Error, function() {
+  [0, ...function*() { throw new Test262Error(); }()];
+});
diff --git a/test/language/expressions/array/spread-err-mult-err-iter-get-value.js b/test/language/expressions/array/spread-err-mult-err-iter-get-value.js
new file mode 100644
index 0000000000..f0e8996d8d
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-iter-get-value.js
@@ -0,0 +1,49 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-iter-get-value.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when GetIterator fails (@@iterator function return value) (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+
+    7.4.1 GetIterator ( obj, method )
+
+    [...]
+    2. Let iterator be ? Call(method, obj).
+    3. If Type(iterator) is not Object, throw a TypeError exception.
+---*/
+var iter = {};
+Object.defineProperty(iter, Symbol.iterator, {
+  get: function() {
+    return null;
+  }
+});
+
+assert.throws(TypeError, function() {
+  [0, ...iter];
+});
diff --git a/test/language/expressions/array/spread-err-mult-err-itr-get-call.js b/test/language/expressions/array/spread-err-mult-err-itr-get-call.js
new file mode 100644
index 0000000000..e15c34bb2a
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-itr-get-call.js
@@ -0,0 +1,47 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-itr-get-call.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when GetIterator fails (@@iterator function invocation) (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+
+    7.4.1 GetIterator ( obj, method )
+
+    [...]
+    3. Let iterator be Call(method,obj).
+    4. ReturnIfAbrupt(iterator).
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  throw new Test262Error();
+};
+
+assert.throws(Test262Error, function() {
+  [0, ...iter];
+});
diff --git a/test/language/expressions/array/spread-err-mult-err-itr-get-get.js b/test/language/expressions/array/spread-err-mult-err-itr-get-get.js
new file mode 100644
index 0000000000..2e5db261c3
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-itr-get-get.js
@@ -0,0 +1,48 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-itr-get-get.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when GetIterator fails (@@iterator property access) (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+
+    7.4.1 GetIterator ( obj, method )
+
+    1. If method was not passed, then
+       a. Let method be ? GetMethod(obj, @@iterator).
+---*/
+var iter = {};
+Object.defineProperty(iter, Symbol.iterator, {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+
+assert.throws(Test262Error, function() {
+  [0, ...iter];
+});
diff --git a/test/language/expressions/array/spread-err-mult-err-itr-step.js b/test/language/expressions/array/spread-err-mult-err-itr-step.js
new file mode 100644
index 0000000000..160f2dcb50
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-itr-step.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-itr-step.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when IteratorStep fails (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+
+    7.4.5 IteratorStep ( iterator )
+
+    1. Let result be IteratorNext(iterator).
+    2. ReturnIfAbrupt(result).
+
+    7.4.2 IteratorNext ( iterator, value )
+
+    1. If value was not passed, then
+       a. Let result be Invoke(iterator, "next", « »).
+    [...]
+    3. ReturnIfAbrupt(result).
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      throw new Test262Error();
+    }
+  };
+};
+
+assert.throws(Test262Error, function() {
+  [0, ...iter];
+});
diff --git a/test/language/expressions/array/spread-err-mult-err-itr-value.js b/test/language/expressions/array/spread-err-mult-err-itr-value.js
new file mode 100644
index 0000000000..fc8f107c0e
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-itr-value.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-itr-value.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when IteratorValue fails (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+
+    7.4.4 IteratorValue ( iterResult )
+
+    1. Assert: Type(iterResult) is Object.
+    2. Return Get(iterResult, "value").
+
+    7.3.1 Get (O, P)
+
+    [...]
+    3. Return O.[[Get]](P, O).
+---*/
+var iter = {};
+var poisonedValue = Object.defineProperty({}, 'value', {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return poisonedValue;
+    }
+  };
+};
+
+assert.throws(Test262Error, function() {
+  [0, ...iter];
+});
diff --git a/test/language/expressions/array/spread-err-mult-err-unresolvable.js b/test/language/expressions/array/spread-err-mult-err-unresolvable.js
new file mode 100644
index 0000000000..02117291f5
--- /dev/null
+++ b/test/language/expressions/array/spread-err-mult-err-unresolvable.js
@@ -0,0 +1,43 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-err-unresolvable.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator following other arguments when reference is unresolvable (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+
+    6.2.3.1 GetValue (V)
+
+    1. ReturnIfAbrupt(V).
+    2. If Type(V) is not Reference, return V.
+    3. Let base be GetBase(V).
+    4. If IsUnresolvableReference(V), throw a ReferenceError exception.
+---*/
+
+assert.throws(ReferenceError, function() {
+  [0, ...unresolvableReference];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-expr-throws.js b/test/language/expressions/array/spread-err-sngl-err-expr-throws.js
new file mode 100644
index 0000000000..15c9019e53
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-expr-throws.js
@@ -0,0 +1,38 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-expr-throws.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when evaluation throws (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [generators]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+---*/
+
+assert.throws(Test262Error, function() {
+  [...function*() { throw new Test262Error(); }()];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-itr-get-call.js b/test/language/expressions/array/spread-err-sngl-err-itr-get-call.js
new file mode 100644
index 0000000000..21dfd11d6f
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-itr-get-call.js
@@ -0,0 +1,48 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-itr-get-call.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when GetIterator fails (@@iterator function invocation) (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+
+    7.4.1 GetIterator ( obj, method )
+
+    [...]
+    3. Let iterator be Call(method,obj).
+    4. ReturnIfAbrupt(iterator).
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  throw new Test262Error();
+};
+
+assert.throws(Test262Error, function() {
+  [...iter];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-itr-get-get.js b/test/language/expressions/array/spread-err-sngl-err-itr-get-get.js
new file mode 100644
index 0000000000..3bc6e40d83
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-itr-get-get.js
@@ -0,0 +1,49 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-itr-get-get.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when GetIterator fails (@@iterator property access) (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+
+    7.4.1 GetIterator ( obj, method )
+
+    1. If method was not passed, then
+       a. Let method be ? GetMethod(obj, @@iterator).
+---*/
+var iter = {};
+Object.defineProperty(iter, Symbol.iterator, {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+
+assert.throws(Test262Error, function() {
+  [...iter];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-itr-get-value.js b/test/language/expressions/array/spread-err-sngl-err-itr-get-value.js
new file mode 100644
index 0000000000..bc7a1c3f79
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-itr-get-value.js
@@ -0,0 +1,48 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-itr-get-value.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when GetIterator fails (@@iterator function return value) (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+
+    7.4.1 GetIterator ( obj, method )
+
+    [...]
+    2. Let iterator be ? Call(method, obj).
+    3. If Type(iterator) is not Object, throw a TypeError exception.
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return null;
+};
+
+assert.throws(TypeError, function() {
+  [...iter];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-itr-step.js b/test/language/expressions/array/spread-err-sngl-err-itr-step.js
new file mode 100644
index 0000000000..406d67c7d0
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-itr-step.js
@@ -0,0 +1,61 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-itr-step.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when IteratorStep fails (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+
+    7.4.5 IteratorStep ( iterator )
+
+    1. Let result be IteratorNext(iterator).
+    2. ReturnIfAbrupt(result).
+
+    7.4.2 IteratorNext ( iterator, value )
+
+    1. If value was not passed, then
+       a. Let result be Invoke(iterator, "next", « »).
+    [...]
+    3. ReturnIfAbrupt(result).
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      throw new Test262Error();
+    }
+  };
+};
+
+assert.throws(Test262Error, function() {
+  [...iter];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-itr-value.js b/test/language/expressions/array/spread-err-sngl-err-itr-value.js
new file mode 100644
index 0000000000..8a6628f8f7
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-itr-value.js
@@ -0,0 +1,67 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-itr-value.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when IteratorValue fails (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+
+    7.4.4 IteratorValue ( iterResult )
+
+    1. Assert: Type(iterResult) is Object.
+    2. Return Get(iterResult, "value").
+
+    7.3.1 Get (O, P)
+
+    [...]
+    3. Return O.[[Get]](P, O).
+---*/
+var iter = {};
+var poisonedValue = Object.defineProperty({}, 'value', {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+iter[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return poisonedValue;
+    }
+  };
+};
+
+assert.throws(Test262Error, function() {
+  [...iter];
+});
diff --git a/test/language/expressions/array/spread-err-sngl-err-unresolvable.js b/test/language/expressions/array/spread-err-sngl-err-unresolvable.js
new file mode 100644
index 0000000000..2d82c900fd
--- /dev/null
+++ b/test/language/expressions/array/spread-err-sngl-err-unresolvable.js
@@ -0,0 +1,44 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-err-unresolvable.case
+// - src/spread/error/array.template
+/*---
+description: Spread operator applied to the only argument when reference is unresolvable (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+
+    6.2.3.1 GetValue (V)
+
+    1. ReturnIfAbrupt(V).
+    2. If Type(V) is not Reference, return V.
+    3. Let base be GetBase(V).
+    4. If IsUnresolvableReference(V), throw a ReferenceError exception.
+---*/
+
+assert.throws(ReferenceError, function() {
+  [...unresolvableReference];
+});
diff --git a/test/language/expressions/array/spread-mult-empty.js b/test/language/expressions/array/spread-mult-empty.js
new file mode 100644
index 0000000000..47afca0b27
--- /dev/null
+++ b/test/language/expressions/array/spread-mult-empty.js
@@ -0,0 +1,48 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-empty.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator following other arguments when no iteration occurs (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 1);
+  assert.sameValue(arguments[1], 2);
+  assert.sameValue(arguments[2], 3);
+  callCount += 1;
+}.apply(null, [1, 2, 3, ...[]]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-mult-expr.js b/test/language/expressions/array/spread-mult-expr.js
new file mode 100644
index 0000000000..64feb1522b
--- /dev/null
+++ b/test/language/expressions/array/spread-mult-expr.js
@@ -0,0 +1,53 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-expr.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+var source = [3, 4, 5];
+var target;
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 1);
+  assert.sameValue(arguments[1], 2);
+  assert.sameValue(arguments[2], 3);
+  assert.sameValue(arguments[3], 4);
+  assert.sameValue(arguments[4], 5);
+  assert.sameValue(target, source);
+  callCount += 1;
+}.apply(null, [1, 2, ...target = source]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-mult-iter.js b/test/language/expressions/array/spread-mult-iter.js
new file mode 100644
index 0000000000..96e1e12e77
--- /dev/null
+++ b/test/language/expressions/array/spread-mult-iter.js
@@ -0,0 +1,65 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-iter.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator following other arguments with a valid iterator (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  var nextCount = 3;
+  return {
+    next: function() {
+      nextCount += 1;
+      return { done: nextCount === 6, value: nextCount };
+    }
+  };
+};
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 1);
+  assert.sameValue(arguments[1], 2);
+  assert.sameValue(arguments[2], 3);
+  assert.sameValue(arguments[3], 4);
+  assert.sameValue(arguments[4], 5);
+  callCount += 1;
+}.apply(null, [1, 2, 3, ...iter]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-mult-literal.js b/test/language/expressions/array/spread-mult-literal.js
new file mode 100644
index 0000000000..c77d85aa6f
--- /dev/null
+++ b/test/language/expressions/array/spread-mult-literal.js
@@ -0,0 +1,50 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-literal.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 5);
+  assert.sameValue(arguments[1], 6);
+  assert.sameValue(arguments[2], 7);
+  assert.sameValue(arguments[3], 8);
+  assert.sameValue(arguments[4], 9);
+  callCount += 1;
+}.apply(null, [5, ...[6, 7, 8], 9]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-sngl-empty.js b/test/language/expressions/array/spread-sngl-empty.js
new file mode 100644
index 0000000000..a023ef091e
--- /dev/null
+++ b/test/language/expressions/array/spread-sngl-empty.js
@@ -0,0 +1,47 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-empty.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator applied to the only argument when no iteration occurs (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       [...]
+---*/
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 0);
+  callCount += 1;
+}.apply(null, [...[]]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-sngl-expr.js b/test/language/expressions/array/spread-sngl-expr.js
new file mode 100644
index 0000000000..091daebbb8
--- /dev/null
+++ b/test/language/expressions/array/spread-sngl-expr.js
@@ -0,0 +1,55 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-expr.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator applied to AssignmentExpression as only element (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+var source = [2, 3, 4];
+var target;
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 2);
+  assert.sameValue(arguments[1], 3);
+  assert.sameValue(arguments[2], 4);
+  assert.sameValue(target, source);
+  callCount += 1;
+}.apply(null, [...target = source]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-sngl-iter.js b/test/language/expressions/array/spread-sngl-iter.js
new file mode 100644
index 0000000000..79c00d64c0
--- /dev/null
+++ b/test/language/expressions/array/spread-sngl-iter.js
@@ -0,0 +1,62 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-iter.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator applied to the only argument with a valid iterator (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+features: [Symbol.iterator]
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+var iter = {};
+iter[Symbol.iterator] = function() {
+  var nextCount = 0;
+  return {
+    next: function() {
+      nextCount += 1;
+      return { done: nextCount === 3, value: nextCount };
+    }
+  };
+};
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 2);
+  assert.sameValue(arguments[0], 1);
+  assert.sameValue(arguments[1], 2);
+  callCount += 1;
+}.apply(null, [...iter]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/array/spread-sngl-literal.js b/test/language/expressions/array/spread-sngl-literal.js
new file mode 100644
index 0000000000..0374c9d2d1
--- /dev/null
+++ b/test/language/expressions/array/spread-sngl-literal.js
@@ -0,0 +1,52 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-literal.case
+// - src/spread/default/array.template
+/*---
+description: Spread operator applied to array literal as only element (Array initializer)
+esid: sec-runtime-semantics-arrayaccumulation
+es6id: 12.2.5.2
+flags: [generated]
+info: |
+    SpreadElement : ...AssignmentExpression
+
+    1. Let spreadRef be the result of evaluating AssignmentExpression.
+    2. Let spreadObj be ? GetValue(spreadRef).
+    3. Let iterator be ? GetIterator(spreadObj).
+    4. Repeat
+       a. Let next be ? IteratorStep(iterator).
+       b. If next is false, return nextIndex.
+       c. Let nextValue be ? IteratorValue(next).
+       d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)),
+          nextValue).
+       e. Assert: status is true.
+       f. Let nextIndex be nextIndex + 1.
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 3);
+  assert.sameValue(arguments[1], 4);
+  assert.sameValue(arguments[2], 5);
+  callCount += 1;
+}.apply(null, [...[3, 4, 5]]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/call/spread-mult-expr.js b/test/language/expressions/call/spread-mult-expr.js
new file mode 100644
index 0000000000..d15ed52055
--- /dev/null
+++ b/test/language/expressions/call/spread-mult-expr.js
@@ -0,0 +1,51 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-expr.case
+// - src/spread/default/call-expr.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (CallExpression)
+esid: sec-function-calls-runtime-semantics-evaluation
+es6id: 12.3.4.1
+flags: [generated]
+info: |
+    CallExpression : MemberExpression Arguments
+
+    [...]
+    9. Return EvaluateDirectCall(func, thisValue, Arguments, tailCall).
+
+    12.3.4.3 Runtime Semantics: EvaluateDirectCall
+
+    1. Let argList be ArgumentListEvaluation(arguments).
+    [...]
+    6. Let result be Call(func, thisValue, argList).
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+var source = [3, 4, 5];
+var target;
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 1);
+  assert.sameValue(arguments[1], 2);
+  assert.sameValue(arguments[2], 3);
+  assert.sameValue(arguments[3], 4);
+  assert.sameValue(arguments[4], 5);
+  assert.sameValue(target, source);
+  callCount += 1;
+}(1, 2, ...target = source));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/call/spread-mult-literal.js b/test/language/expressions/call/spread-mult-literal.js
new file mode 100644
index 0000000000..87b2a79c48
--- /dev/null
+++ b/test/language/expressions/call/spread-mult-literal.js
@@ -0,0 +1,48 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-literal.case
+// - src/spread/default/call-expr.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (CallExpression)
+esid: sec-function-calls-runtime-semantics-evaluation
+es6id: 12.3.4.1
+flags: [generated]
+info: |
+    CallExpression : MemberExpression Arguments
+
+    [...]
+    9. Return EvaluateDirectCall(func, thisValue, Arguments, tailCall).
+
+    12.3.4.3 Runtime Semantics: EvaluateDirectCall
+
+    1. Let argList be ArgumentListEvaluation(arguments).
+    [...]
+    6. Let result be Call(func, thisValue, argList).
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 5);
+  assert.sameValue(arguments[1], 6);
+  assert.sameValue(arguments[2], 7);
+  assert.sameValue(arguments[3], 8);
+  assert.sameValue(arguments[4], 9);
+  callCount += 1;
+}(5, ...[6, 7, 8], 9));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/call/spread-sngl-expr.js b/test/language/expressions/call/spread-sngl-expr.js
new file mode 100644
index 0000000000..80684f8383
--- /dev/null
+++ b/test/language/expressions/call/spread-sngl-expr.js
@@ -0,0 +1,53 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-expr.case
+// - src/spread/default/call-expr.template
+/*---
+description: Spread operator applied to AssignmentExpression as only element (CallExpression)
+esid: sec-function-calls-runtime-semantics-evaluation
+es6id: 12.3.4.1
+flags: [generated]
+info: |
+    CallExpression : MemberExpression Arguments
+
+    [...]
+    9. Return EvaluateDirectCall(func, thisValue, Arguments, tailCall).
+
+    12.3.4.3 Runtime Semantics: EvaluateDirectCall
+
+    1. Let argList be ArgumentListEvaluation(arguments).
+    [...]
+    6. Let result be Call(func, thisValue, argList).
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+var source = [2, 3, 4];
+var target;
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 2);
+  assert.sameValue(arguments[1], 3);
+  assert.sameValue(arguments[2], 4);
+  assert.sameValue(target, source);
+  callCount += 1;
+}(...target = source));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/call/spread-sngl-literal.js b/test/language/expressions/call/spread-sngl-literal.js
new file mode 100644
index 0000000000..90ac612086
--- /dev/null
+++ b/test/language/expressions/call/spread-sngl-literal.js
@@ -0,0 +1,50 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-literal.case
+// - src/spread/default/call-expr.template
+/*---
+description: Spread operator applied to array literal as only element (CallExpression)
+esid: sec-function-calls-runtime-semantics-evaluation
+es6id: 12.3.4.1
+flags: [generated]
+info: |
+    CallExpression : MemberExpression Arguments
+
+    [...]
+    9. Return EvaluateDirectCall(func, thisValue, Arguments, tailCall).
+
+    12.3.4.3 Runtime Semantics: EvaluateDirectCall
+
+    1. Let argList be ArgumentListEvaluation(arguments).
+    [...]
+    6. Let result be Call(func, thisValue, argList).
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+
+var callCount = 0;
+
+(function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 3);
+  assert.sameValue(arguments[1], 4);
+  assert.sameValue(arguments[2], 5);
+  callCount += 1;
+}(...[3, 4, 5]));
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/new/spread-mult-expr.js b/test/language/expressions/new/spread-mult-expr.js
new file mode 100644
index 0000000000..a4e038ea78
--- /dev/null
+++ b/test/language/expressions/new/spread-mult-expr.js
@@ -0,0 +1,50 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-expr.case
+// - src/spread/default/member-expr.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (`new` operator)
+esid: sec-new-operator-runtime-semantics-evaluation
+es6id: 12.3.3.1
+flags: [generated]
+info: |
+    MemberExpression : new MemberExpression Arguments
+
+    1. Return EvaluateNew(MemberExpression, Arguments).
+
+    12.3.3.1.1 Runtime Semantics: EvaluateNew
+
+    6. If arguments is empty, let argList be an empty List.
+    7. Else,
+       a. Let argList be ArgumentListEvaluation of arguments.
+       [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+var source = [3, 4, 5];
+var target;
+
+var callCount = 0;
+
+new function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 1);
+  assert.sameValue(arguments[1], 2);
+  assert.sameValue(arguments[2], 3);
+  assert.sameValue(arguments[3], 4);
+  assert.sameValue(arguments[4], 5);
+  assert.sameValue(target, source);
+  callCount += 1;
+}(1, 2, ...target = source);
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/new/spread-mult-literal.js b/test/language/expressions/new/spread-mult-literal.js
new file mode 100644
index 0000000000..990a6a07fa
--- /dev/null
+++ b/test/language/expressions/new/spread-mult-literal.js
@@ -0,0 +1,47 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-literal.case
+// - src/spread/default/member-expr.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (`new` operator)
+esid: sec-new-operator-runtime-semantics-evaluation
+es6id: 12.3.3.1
+flags: [generated]
+info: |
+    MemberExpression : new MemberExpression Arguments
+
+    1. Return EvaluateNew(MemberExpression, Arguments).
+
+    12.3.3.1.1 Runtime Semantics: EvaluateNew
+
+    6. If arguments is empty, let argList be an empty List.
+    7. Else,
+       a. Let argList be ArgumentListEvaluation of arguments.
+       [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+
+var callCount = 0;
+
+new function() {
+  assert.sameValue(arguments.length, 5);
+  assert.sameValue(arguments[0], 5);
+  assert.sameValue(arguments[1], 6);
+  assert.sameValue(arguments[2], 7);
+  assert.sameValue(arguments[3], 8);
+  assert.sameValue(arguments[4], 9);
+  callCount += 1;
+}(5, ...[6, 7, 8], 9);
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/new/spread-sngl-expr.js b/test/language/expressions/new/spread-sngl-expr.js
new file mode 100644
index 0000000000..9522722eee
--- /dev/null
+++ b/test/language/expressions/new/spread-sngl-expr.js
@@ -0,0 +1,52 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-expr.case
+// - src/spread/default/member-expr.template
+/*---
+description: Spread operator applied to AssignmentExpression as only element (`new` operator)
+esid: sec-new-operator-runtime-semantics-evaluation
+es6id: 12.3.3.1
+flags: [generated]
+info: |
+    MemberExpression : new MemberExpression Arguments
+
+    1. Return EvaluateNew(MemberExpression, Arguments).
+
+    12.3.3.1.1 Runtime Semantics: EvaluateNew
+
+    6. If arguments is empty, let argList be an empty List.
+    7. Else,
+       a. Let argList be ArgumentListEvaluation of arguments.
+       [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+var source = [2, 3, 4];
+var target;
+
+var callCount = 0;
+
+new function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 2);
+  assert.sameValue(arguments[1], 3);
+  assert.sameValue(arguments[2], 4);
+  assert.sameValue(target, source);
+  callCount += 1;
+}(...target = source);
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/new/spread-sngl-literal.js b/test/language/expressions/new/spread-sngl-literal.js
new file mode 100644
index 0000000000..812e1c4d67
--- /dev/null
+++ b/test/language/expressions/new/spread-sngl-literal.js
@@ -0,0 +1,49 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-literal.case
+// - src/spread/default/member-expr.template
+/*---
+description: Spread operator applied to array literal as only element (`new` operator)
+esid: sec-new-operator-runtime-semantics-evaluation
+es6id: 12.3.3.1
+flags: [generated]
+info: |
+    MemberExpression : new MemberExpression Arguments
+
+    1. Return EvaluateNew(MemberExpression, Arguments).
+
+    12.3.3.1.1 Runtime Semantics: EvaluateNew
+
+    6. If arguments is empty, let argList be an empty List.
+    7. Else,
+       a. Let argList be ArgumentListEvaluation of arguments.
+       [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+
+var callCount = 0;
+
+new function() {
+  assert.sameValue(arguments.length, 3);
+  assert.sameValue(arguments[0], 3);
+  assert.sameValue(arguments[1], 4);
+  assert.sameValue(arguments[2], 5);
+  callCount += 1;
+}(...[3, 4, 5]);
+
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/super/spread-mult-expr.js b/test/language/expressions/super/spread-mult-expr.js
new file mode 100644
index 0000000000..1eabf84957
--- /dev/null
+++ b/test/language/expressions/super/spread-mult-expr.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-expr.case
+// - src/spread/default/super-call.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (SuperCall)
+esid: sec-super-keyword-runtime-semantics-evaluation
+es6id: 12.3.5.1
+flags: [generated]
+info: |
+    SuperCall : super Arguments
+
+    1. Let newTarget be GetNewTarget().
+    2. If newTarget is undefined, throw a ReferenceError exception.
+    3. Let func be GetSuperConstructor().
+    4. ReturnIfAbrupt(func).
+    5. Let argList be ArgumentListEvaluation of Arguments.
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+var source = [3, 4, 5];
+var target;
+
+var callCount = 0;
+
+class Test262ParentClass {
+  constructor() {
+    assert.sameValue(arguments.length, 5);
+    assert.sameValue(arguments[0], 1);
+    assert.sameValue(arguments[1], 2);
+    assert.sameValue(arguments[2], 3);
+    assert.sameValue(arguments[3], 4);
+    assert.sameValue(arguments[4], 5);
+    assert.sameValue(target, source);
+    callCount += 1;
+  }
+}
+
+class Test262ChildClass extends Test262ParentClass {
+  constructor() {
+    super(1, 2, ...target = source);
+  }
+}
+
+new Test262ChildClass();
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/super/spread-mult-literal.js b/test/language/expressions/super/spread-mult-literal.js
new file mode 100644
index 0000000000..4f2b282e86
--- /dev/null
+++ b/test/language/expressions/super/spread-mult-literal.js
@@ -0,0 +1,54 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/mult-literal.case
+// - src/spread/default/super-call.template
+/*---
+description: Spread operator applied to AssignmentExpression following other elements (SuperCall)
+esid: sec-super-keyword-runtime-semantics-evaluation
+es6id: 12.3.5.1
+flags: [generated]
+info: |
+    SuperCall : super Arguments
+
+    1. Let newTarget be GetNewTarget().
+    2. If newTarget is undefined, throw a ReferenceError exception.
+    3. Let func be GetSuperConstructor().
+    4. ReturnIfAbrupt(func).
+    5. Let argList be ArgumentListEvaluation of Arguments.
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ArgumentList , ... AssignmentExpression
+
+    1. Let precedingArgs be the result of evaluating ArgumentList.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let iterator be GetIterator(GetValue(spreadRef) ).
+    4. ReturnIfAbrupt(iterator).
+    5. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return precedingArgs.
+---*/
+
+var callCount = 0;
+
+class Test262ParentClass {
+  constructor() {
+    assert.sameValue(arguments.length, 5);
+    assert.sameValue(arguments[0], 5);
+    assert.sameValue(arguments[1], 6);
+    assert.sameValue(arguments[2], 7);
+    assert.sameValue(arguments[3], 8);
+    assert.sameValue(arguments[4], 9);
+    callCount += 1;
+  }
+}
+
+class Test262ChildClass extends Test262ParentClass {
+  constructor() {
+    super(5, ...[6, 7, 8], 9);
+  }
+}
+
+new Test262ChildClass();
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/super/spread-sngl-expr.js b/test/language/expressions/super/spread-sngl-expr.js
new file mode 100644
index 0000000000..e61f79ed12
--- /dev/null
+++ b/test/language/expressions/super/spread-sngl-expr.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-expr.case
+// - src/spread/default/super-call.template
+/*---
+description: Spread operator applied to AssignmentExpression as only element (SuperCall)
+esid: sec-super-keyword-runtime-semantics-evaluation
+es6id: 12.3.5.1
+flags: [generated]
+info: |
+    SuperCall : super Arguments
+
+    1. Let newTarget be GetNewTarget().
+    2. If newTarget is undefined, throw a ReferenceError exception.
+    3. Let func be GetSuperConstructor().
+    4. ReturnIfAbrupt(func).
+    5. Let argList be ArgumentListEvaluation of Arguments.
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+var source = [2, 3, 4];
+var target;
+
+var callCount = 0;
+
+class Test262ParentClass {
+  constructor() {
+    assert.sameValue(arguments.length, 3);
+    assert.sameValue(arguments[0], 2);
+    assert.sameValue(arguments[1], 3);
+    assert.sameValue(arguments[2], 4);
+    assert.sameValue(target, source);
+    callCount += 1;
+  }
+}
+
+class Test262ChildClass extends Test262ParentClass {
+  constructor() {
+    super(...target = source);
+  }
+}
+
+new Test262ChildClass();
+assert.sameValue(callCount, 1);
diff --git a/test/language/expressions/super/spread-sngl-literal.js b/test/language/expressions/super/spread-sngl-literal.js
new file mode 100644
index 0000000000..6c0f02b42a
--- /dev/null
+++ b/test/language/expressions/super/spread-sngl-literal.js
@@ -0,0 +1,56 @@
+// This file was procedurally generated from the following sources:
+// - src/spread/sngl-literal.case
+// - src/spread/default/super-call.template
+/*---
+description: Spread operator applied to array literal as only element (SuperCall)
+esid: sec-super-keyword-runtime-semantics-evaluation
+es6id: 12.3.5.1
+flags: [generated]
+info: |
+    SuperCall : super Arguments
+
+    1. Let newTarget be GetNewTarget().
+    2. If newTarget is undefined, throw a ReferenceError exception.
+    3. Let func be GetSuperConstructor().
+    4. ReturnIfAbrupt(func).
+    5. Let argList be ArgumentListEvaluation of Arguments.
+    [...]
+
+    12.3.6.1 Runtime Semantics: ArgumentListEvaluation
+
+    ArgumentList : ... AssignmentExpression
+
+    1. Let list be an empty List.
+    2. Let spreadRef be the result of evaluating AssignmentExpression.
+    3. Let spreadObj be GetValue(spreadRef).
+    4. Let iterator be GetIterator(spreadObj).
+    5. ReturnIfAbrupt(iterator).
+    6. Repeat
+       a. Let next be IteratorStep(iterator).
+       b. ReturnIfAbrupt(next).
+       c. If next is false, return list.
+       d. Let nextArg be IteratorValue(next).
+       e. ReturnIfAbrupt(nextArg).
+       f. Append nextArg as the last element of list.
+---*/
+
+var callCount = 0;
+
+class Test262ParentClass {
+  constructor() {
+    assert.sameValue(arguments.length, 3);
+    assert.sameValue(arguments[0], 3);
+    assert.sameValue(arguments[1], 4);
+    assert.sameValue(arguments[2], 5);
+    callCount += 1;
+  }
+}
+
+class Test262ChildClass extends Test262ParentClass {
+  constructor() {
+    super(...[3, 4, 5]);
+  }
+}
+
+new Test262ChildClass();
+assert.sameValue(callCount, 1);
-- 
GitLab