From 93e9da29a0604e9c2742436979eb1074eb301758 Mon Sep 17 00:00:00 2001
From: Rick Waldron <waldron.rick@gmail.com>
Date: Mon, 13 Apr 2015 14:35:06 -0400
Subject: [PATCH] 14.2 Arrow Function Definitions

---
 .../Arrow-Function_semantics.js               | 35 --------------
 .../ArrowFunction_restricted-properties.js    |  0
 .../cannot-override-this-with-thisArg.js      | 29 ++++++++++++
 .../empty-function-body-returns-undefined.js  | 10 ++++
 .../expression-body-implicit-return.js        |  9 ++++
 .../arrow-function/lexical-arguments.js       | 29 ++++++++++++
 ...erriden-by-formal-parameters-non-strict.js | 14 ++++++
 .../lexical-new.target-closure-returned.js    | 30 ++++++++++++
 .../arrow-function/lexical-new.target.js      | 33 +++++++++++++
 ...ical-super-call-from-within-constructor.js | 46 +++++++++++++++++++
 ...-super-property-from-within-constructor.js | 40 ++++++++++++++++
 .../arrow-function/lexical-super-property.js  | 38 +++++++++++++++
 ...upercall-from-immediately-invoked-arrow.js | 35 ++++++++++++++
 .../arrow-function/lexical-this.js            | 31 +++++++++++++
 ...ow-precedence-expression-body-no-parens.js | 10 ++++
 .../expressions/arrow-function/non-strict.js  | 20 ++++++++
 ...ect-literal-return-requires-body-parens.js | 10 ++++
 .../arrow-function/prototype-rules.js}        |  3 +-
 ...s-braces-must-return-explicitly-missing.js | 12 +++++
 ...-requires-braces-must-return-explicitly.js | 12 +++++
 .../expressions/arrow-function/strict.js      | 22 +++++++++
 ...wparameters-bindingidentifier-arguments.js | 17 +++++++
 ...tifier-concisebody-assignmentexpression.js | 16 +++++++
 ...dingidentifier-concisebody-functionbody.js | 22 +++++++++
 .../arrowparameters-bindingidentifier-eval.js | 18 ++++++++
 ...inator-concisebody-assignmentexpression.js | 17 +++++++
 ...lineterminator-concisebody-functionbody.js | 17 +++++++
 ...arrowparameters-bindingidentifier-yield.js | 14 ++++++
 ...-cover-concisebody-assignmentexpression.js | 16 +++++++
 ...rameters-cover-concisebody-functionbody.js | 15 ++++++
 ...meters-cover-formalparameters-arguments.js | 17 +++++++
 ...wparameters-cover-formalparameters-eval.js | 17 +++++++
 ...parameters-cover-formalparameters-yield.js | 17 +++++++
 ...-includes-rest-concisebody-functionbody.js | 19 ++++++++
 .../arrowparameters-cover-initialize-1.js     | 16 +++++++
 .../arrowparameters-cover-initialize-2.js     | 16 +++++++
 ...inator-concisebody-assignmentexpression.js | 17 +++++++
 ...lineterminator-concisebody-functionbody.js | 17 +++++++
 ...ers-cover-rest-concisebody-functionbody.js | 18 ++++++++
 ...lineterminator-concisebody-functionbody.js | 19 ++++++++
 ...dentifier-identifier-futurereservedword.js | 20 ++++++++
 ...er-identifier-strict-futurereservedword.js | 23 ++++++++++
 ...parameters-bindingidentifier-identifier.js | 20 ++++++++
 ...rameters-bindingidentifier-no-arguments.js | 15 ++++++
 ...rowparameters-bindingidentifier-no-eval.js | 16 +++++++
 ...owparameters-bindingidentifier-no-yield.js | 16 +++++++
 .../arrowparameters-bindingidentifier-rest.js | 12 +++++
 .../arrowparameters-cover-no-arguments.js     | 20 ++++++++
 ...ers-cover-no-duplicates-binding-array-1.js | 21 +++++++++
 ...ers-cover-no-duplicates-binding-array-2.js | 21 +++++++++
 ...ers-cover-no-duplicates-binding-array-3.js | 23 ++++++++++
 ...rs-cover-no-duplicates-binding-object-1.js | 21 +++++++++
 ...rs-cover-no-duplicates-binding-object-2.js | 23 ++++++++++
 ...rs-cover-no-duplicates-binding-object-3.js | 23 ++++++++++
 ...rs-cover-no-duplicates-binding-object-4.js | 25 ++++++++++
 ...rs-cover-no-duplicates-binding-object-5.js | 25 ++++++++++
 ...rs-cover-no-duplicates-binding-object-6.js | 23 ++++++++++
 ...rrowparameters-cover-no-duplicates-rest.js | 19 ++++++++
 .../arrowparameters-cover-no-duplicates.js    | 19 ++++++++
 .../arrowparameters-cover-no-eval.js          | 20 ++++++++
 .../arrowparameters-cover-no-yield.js         | 15 ++++++
 ...id-parenless-parameters-expression-body.js | 12 +++++
 ...estriction-invalid-parenless-parameters.js | 14 ++++++
 .../early-errors/asi-restriction-invalid.js   | 11 +++++
 .../arrow-function/syntax/variations.js}      |  0
 .../expressions/arrow-function/throw-new.js   | 14 ++++++
 .../rest-parameters/arrow-function-invalid.js |  9 ----
 67 files changed, 1227 insertions(+), 46 deletions(-)
 delete mode 100644 test/language/arrow-function/Arrow-Function_semantics.js
 rename test/language/{ => expressions}/arrow-function/ArrowFunction_restricted-properties.js (100%)
 create mode 100644 test/language/expressions/arrow-function/cannot-override-this-with-thisArg.js
 create mode 100644 test/language/expressions/arrow-function/empty-function-body-returns-undefined.js
 create mode 100644 test/language/expressions/arrow-function/expression-body-implicit-return.js
 create mode 100644 test/language/expressions/arrow-function/lexical-arguments.js
 create mode 100644 test/language/expressions/arrow-function/lexical-bindings-overriden-by-formal-parameters-non-strict.js
 create mode 100644 test/language/expressions/arrow-function/lexical-new.target-closure-returned.js
 create mode 100644 test/language/expressions/arrow-function/lexical-new.target.js
 create mode 100644 test/language/expressions/arrow-function/lexical-super-call-from-within-constructor.js
 create mode 100644 test/language/expressions/arrow-function/lexical-super-property-from-within-constructor.js
 create mode 100644 test/language/expressions/arrow-function/lexical-super-property.js
 create mode 100644 test/language/expressions/arrow-function/lexical-supercall-from-immediately-invoked-arrow.js
 create mode 100644 test/language/expressions/arrow-function/lexical-this.js
 create mode 100644 test/language/expressions/arrow-function/low-precedence-expression-body-no-parens.js
 create mode 100644 test/language/expressions/arrow-function/non-strict.js
 create mode 100644 test/language/expressions/arrow-function/object-literal-return-requires-body-parens.js
 rename test/language/{arrow-function/Arrow-Function_rules-for-prototype.js => expressions/arrow-function/prototype-rules.js} (76%)
 create mode 100644 test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly-missing.js
 create mode 100644 test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly.js
 create mode 100644 test/language/expressions/arrow-function/strict.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-arguments.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-assignmentexpression.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-eval.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-assignmentexpression.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-yield.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-assignmentexpression.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-arguments.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-eval.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-yield.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-includes-rest-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-1.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-2.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-assignmentexpression.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-lineterminator-concisebody-functionbody.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-futurereservedword.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-strict-futurereservedword.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-arguments.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-eval.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-yield.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-rest.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-arguments.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-1.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-2.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-3.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-1.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-2.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-3.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-4.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-5.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-6.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-rest.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-eval.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-yield.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters-expression-body.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js
 create mode 100644 test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid.js
 rename test/language/{arrow-function/Arrow-Function_syntax-variations.js => expressions/arrow-function/syntax/variations.js} (100%)
 create mode 100644 test/language/expressions/arrow-function/throw-new.js
 delete mode 100644 test/language/rest-parameters/arrow-function-invalid.js

diff --git a/test/language/arrow-function/Arrow-Function_semantics.js b/test/language/arrow-function/Arrow-Function_semantics.js
deleted file mode 100644
index b9546db257..0000000000
--- a/test/language/arrow-function/Arrow-Function_semantics.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2014 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-/*---
-es6id: 14.2
-description: >
-    Semantics associated with specific Arrow Function syntactic forms.
-includes: [compareArray.js]
----*/
-
-// Empty arrow function returns undefined
-var empty = () => {};
-assert.sameValue(empty(), undefined);
-
-// Single parameter case needs no parentheses around parameter list
-var identity = x => x;
-assert.sameValue(identity(empty), empty);
-
-// No need for parentheses even for lower-precedence expression body
-var square = x => x * x;
-assert.sameValue(square(3), 9);
-
-// Parenthesize the body to return an object literal expression
-var key_maker = val => ({key: val});
-assert.sameValue(key_maker(empty).key, empty);
-
-// Expression Body implicit return
-var evens = [0, 2, 4, 6, 8];
-assert(compareArray(evens.map(v => v + 1), [1, 3, 5, 7, 9]));
-
-// Statement body needs braces, must use 'return' explicitly if not void
-var fives = [];
-[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach(v => {
-  if (v % 5 === 0) fives.push(v);
-});
-assert(compareArray(fives, [5, 10]));
diff --git a/test/language/arrow-function/ArrowFunction_restricted-properties.js b/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js
similarity index 100%
rename from test/language/arrow-function/ArrowFunction_restricted-properties.js
rename to test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js
diff --git a/test/language/expressions/arrow-function/cannot-override-this-with-thisArg.js b/test/language/expressions/arrow-function/cannot-override-this-with-thisArg.js
new file mode 100644
index 0000000000..459fbb294b
--- /dev/null
+++ b/test/language/expressions/arrow-function/cannot-override-this-with-thisArg.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction `this` cannot be overridden by thisArg
+
+    9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+      ...
+      9. If kind is Arrow, set the [[ThisMode]] internal slot of F to lexical.
+      ...
+
+    9.2.1.2 OrdinaryCallBindThis ( F, calleeContext, thisArgument )
+
+      1. Let thisMode be the value of F’s [[ThisMode]] internal slot.
+      2. If thisMode is lexical, return NormalCompletion(undefined).
+      ...
+
+---*/
+
+var calls = 0;
+var usurper = {};
+[1].forEach(value => {
+  calls++;
+  assert.notSameValue(this, usurper);
+}, usurper);
+
+assert.sameValue(calls, 1);
diff --git a/test/language/expressions/arrow-function/empty-function-body-returns-undefined.js b/test/language/expressions/arrow-function/empty-function-body-returns-undefined.js
new file mode 100644
index 0000000000..4ae7ca0d07
--- /dev/null
+++ b/test/language/expressions/arrow-function/empty-function-body-returns-undefined.js
@@ -0,0 +1,10 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    Empty arrow function returns undefined
+---*/
+
+var empty = () => {};
+assert.sameValue(empty(), undefined);
diff --git a/test/language/expressions/arrow-function/expression-body-implicit-return.js b/test/language/expressions/arrow-function/expression-body-implicit-return.js
new file mode 100644
index 0000000000..ab77b9cd8e
--- /dev/null
+++ b/test/language/expressions/arrow-function/expression-body-implicit-return.js
@@ -0,0 +1,9 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    Expression Body implicit return
+---*/
+var plusOne = v => v + 1;
+assert.sameValue(plusOne(1), 2);
diff --git a/test/language/expressions/arrow-function/lexical-arguments.js b/test/language/expressions/arrow-function/lexical-arguments.js
new file mode 100644
index 0000000000..5da096fdda
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-arguments.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    arguments
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+function f() {
+  var args = arguments;
+
+  var af = _ => {
+    return arguments;
+  };
+
+  return args === af();
+}
+
+assert(f());
diff --git a/test/language/expressions/arrow-function/lexical-bindings-overriden-by-formal-parameters-non-strict.js b/test/language/expressions/arrow-function/lexical-bindings-overriden-by-formal-parameters-non-strict.js
new file mode 100644
index 0000000000..a54fb2806d
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-bindings-overriden-by-formal-parameters-non-strict.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+flags: [noStrict]
+---*/
+function f() {
+  return (arguments) => arguments;
+}
+
+assert.sameValue(f(1)(2), 2);
diff --git a/test/language/expressions/arrow-function/lexical-new.target-closure-returned.js b/test/language/expressions/arrow-function/lexical-new.target-closure-returned.js
new file mode 100644
index 0000000000..cbe64efe1d
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-new.target-closure-returned.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    new.target
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+function F() {
+  this.af = _ => {
+    if (new.target) {
+      return 1;
+    }
+    return 2;
+  };
+}
+
+var f = new F();
+
+assert.sameValue(f.af(), 1);
diff --git a/test/language/expressions/arrow-function/lexical-new.target.js b/test/language/expressions/arrow-function/lexical-new.target.js
new file mode 100644
index 0000000000..ef76c6bd83
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-new.target.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    new.target
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+var functionInvocationCount = 0;
+var newInvocationCount = 0;
+
+function F() {
+  if ((_ => new.target)() !== undefined) {
+    newInvocationCount++;
+  }
+  functionInvocationCount++;
+}
+
+F();
+new F();
+
+assert.sameValue(functionInvocationCount, 2);
+assert.sameValue(newInvocationCount, 1);
diff --git a/test/language/expressions/arrow-function/lexical-super-call-from-within-constructor.js b/test/language/expressions/arrow-function/lexical-super-call-from-within-constructor.js
new file mode 100644
index 0000000000..533c777363
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-super-call-from-within-constructor.js
@@ -0,0 +1,46 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.3.5.1
+description: >
+    Runtime Semantics: Evaluation
+
+    SuperCall : super Arguments
+
+    ...
+    7. Let result be Construct(func, argList, newTarget).
+    ...
+    10. Return thisER.BindThisValue(result)
+
+
+    8.1.1.3.1 BindThisValue(V)
+
+    ...
+    3. If envRec.[[thisBindingStatus]] is "initialized", throw a ReferenceError exception.
+    ...
+---*/
+
+var count = 0;
+
+class A {
+  constructor() {
+    count++;
+  }
+}
+
+class B extends A {
+  constructor() {
+    super();
+    // envRec.[[thisBindingStatus]] is "initialized"
+    this.af = _ => super();
+  }
+}
+
+var b = new B();
+
+assert.throws(ReferenceError, function() {
+  b.af();
+});
+
+
+assert.sameValue(count, 2, "The value of `count` is `2`, because S7 of `SuperCall : super Arguments` will call the super constructor.");
diff --git a/test/language/expressions/arrow-function/lexical-super-property-from-within-constructor.js b/test/language/expressions/arrow-function/lexical-super-property-from-within-constructor.js
new file mode 100644
index 0000000000..b7146f6613
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-super-property-from-within-constructor.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    super
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+var count = 0;
+
+class A {
+  constructor() {
+    count++;
+  }
+  increment() {
+    count++;
+  }
+}
+
+class B extends A {
+  constructor() {
+    super();
+    (_ => super.increment())();
+  }
+}
+
+
+var bar = new B();
+
+assert.sameValue(count, 2);
diff --git a/test/language/expressions/arrow-function/lexical-super-property.js b/test/language/expressions/arrow-function/lexical-super-property.js
new file mode 100644
index 0000000000..99f6e4743d
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-super-property.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    super
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+var count = 0;
+
+class A {
+  increment() {
+    count++;
+  }
+}
+
+class B extends A {
+  incrementer() {
+    (_ => super.increment())();
+  }
+}
+
+
+var bar = new B();
+
+bar.incrementer();
+
+assert.sameValue(count, 1);
diff --git a/test/language/expressions/arrow-function/lexical-supercall-from-immediately-invoked-arrow.js b/test/language/expressions/arrow-function/lexical-supercall-from-immediately-invoked-arrow.js
new file mode 100644
index 0000000000..0d912e5c2a
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-supercall-from-immediately-invoked-arrow.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    super
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+var count = 0;
+
+class A {
+  constructor() {
+    count++;
+  }
+}
+
+class B extends A {
+  constructor() {
+    (_ => super())();
+  }
+}
+
+var bar = new B();
+
+assert.sameValue(count, 1);
diff --git a/test/language/expressions/arrow-function/lexical-this.js b/test/language/expressions/arrow-function/lexical-this.js
new file mode 100644
index 0000000000..f6ea9306bc
--- /dev/null
+++ b/test/language/expressions/arrow-function/lexical-this.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    this
+
+    ...
+    4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
+    ...
+
+    The non-normative note elaborates on the "scope" argument:
+
+    An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, or this within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function. Even though an ArrowFunction may contain references to super, the function object created in step 4 is not made into a method by performing MakeMethod. An ArrowFunction that references super is always contained within a non-ArrowFunction and the necessary state to implement super is accessible via the scope that is captured by the function object of the ArrowFunction.
+---*/
+
+function F() {
+  this.af = _ => {
+    return this;
+  };
+}
+
+var usurper = {};
+var f = new F();
+
+assert.sameValue(f.af(), f);
+assert.sameValue(f.af.apply(usurper), f);
+assert.sameValue(f.af.call(usurper), f);
+assert.sameValue(f.af.bind(usurper)(), f);
diff --git a/test/language/expressions/arrow-function/low-precedence-expression-body-no-parens.js b/test/language/expressions/arrow-function/low-precedence-expression-body-no-parens.js
new file mode 100644
index 0000000000..dfd61f49aa
--- /dev/null
+++ b/test/language/expressions/arrow-function/low-precedence-expression-body-no-parens.js
@@ -0,0 +1,10 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    No need for parentheses even for lower-precedence expression body
+---*/
+
+var square = x => x * x;
+assert.sameValue(square(3), 9);
diff --git a/test/language/expressions/arrow-function/non-strict.js b/test/language/expressions/arrow-function/non-strict.js
new file mode 100644
index 0000000000..5f6357d1b7
--- /dev/null
+++ b/test/language/expressions/arrow-function/non-strict.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    1. If the function code for this ArrowFunction is strict mode code (10.2.1),
+      let strict be true. Otherwise let strict be false.
+    ...
+
+flags: [noStrict]
+---*/
+var af = _ => {
+  foo = 1;
+};
+
+af();
+
+assert.sameValue(foo, 1);
diff --git a/test/language/expressions/arrow-function/object-literal-return-requires-body-parens.js b/test/language/expressions/arrow-function/object-literal-return-requires-body-parens.js
new file mode 100644
index 0000000000..0b2469f78b
--- /dev/null
+++ b/test/language/expressions/arrow-function/object-literal-return-requires-body-parens.js
@@ -0,0 +1,10 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    Parenthesize the body to return an object literal expression
+---*/
+
+var keyMaker = val => ({ key: val });
+assert.sameValue(keyMaker(1).key, 1);
diff --git a/test/language/arrow-function/Arrow-Function_rules-for-prototype.js b/test/language/expressions/arrow-function/prototype-rules.js
similarity index 76%
rename from test/language/arrow-function/Arrow-Function_rules-for-prototype.js
rename to test/language/expressions/arrow-function/prototype-rules.js
index cc12cbf59e..88e786704f 100644
--- a/test/language/arrow-function/Arrow-Function_rules-for-prototype.js
+++ b/test/language/expressions/arrow-function/prototype-rules.js
@@ -1,4 +1,4 @@
-// Copyright (C) 2014 the V8 project authors. All rights reserved.
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 es6id: 14.2
@@ -9,5 +9,4 @@ description: >
 
 assert.sameValue(typeof (() => {}), "function");
 assert.sameValue(Object.getPrototypeOf(() => {}), Function.prototype);
-assert.throws(TypeError, function() { new (() => {}); });
 assert.sameValue("prototype" in (() => {}), false);
diff --git a/test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly-missing.js b/test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly-missing.js
new file mode 100644
index 0000000000..62416b8c54
--- /dev/null
+++ b/test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly-missing.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    Statement body needs braces, must use 'return' explicitly if not void
+---*/
+var plusOne = v => {
+  v + 1;
+};
+
+assert.sameValue(plusOne(1), undefined);
diff --git a/test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly.js b/test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly.js
new file mode 100644
index 0000000000..84f8f8fd68
--- /dev/null
+++ b/test/language/expressions/arrow-function/statement-body-requires-braces-must-return-explicitly.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    Statement body needs braces, must use 'return' explicitly if not void
+---*/
+var plusOne = v => {
+  return v + 1;
+};
+
+assert.sameValue(plusOne(1), 2);
diff --git a/test/language/expressions/arrow-function/strict.js b/test/language/expressions/arrow-function/strict.js
new file mode 100644
index 0000000000..2883e64d71
--- /dev/null
+++ b/test/language/expressions/arrow-function/strict.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.16
+description: >
+    Runtime Semantics: Evaluation
+
+    1. If the function code for this ArrowFunction is strict mode code (10.2.1),
+      let strict be true. Otherwise let strict be false.
+    ...
+
+flags: [onlyStrict]
+---*/
+assert.throws(ReferenceError, function() {
+  var af = _ => {
+    foo = 1;
+  };
+
+  af();
+});
+
+assert.sameValue(typeof foo, "undefined");
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-arguments.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-arguments.js
new file mode 100644
index 0000000000..a44973119b
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-arguments.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+    
+    Parameter named "arguments", non-strict
+
+flags: [noStrict]
+---*/
+var af = arguments => arguments;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-assignmentexpression.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-assignmentexpression.js
new file mode 100644
index 0000000000..0b933bab25
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-assignmentexpression.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator not present
+    ArrowParameters[Yield] : BindingIdentifier
+    ConciseBody[In] : AssignmentExpression[?In]
+---*/
+var af = x => x;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-functionbody.js
new file mode 100644
index 0000000000..9a651b9328
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-concisebody-functionbody.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+
+    ConciseBody[In] :
+      ...
+      { FunctionBody }
+---*/
+var af = BindingIdentifier => {
+  return BindingIdentifier;
+};
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-eval.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-eval.js
new file mode 100644
index 0000000000..7dc1c2beff
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-eval.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+    
+    Parameter named "eval", non-strict
+
+flags: [noStrict]
+---*/
+var af = eval => eval;
+
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-assignmentexpression.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-assignmentexpression.js
new file mode 100644
index 0000000000..8ac7d0e115
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-assignmentexpression.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator between arrow and ConciseBody
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : AssignmentExpression[?In]
+---*/
+var af = x =>
+x;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-functionbody.js
new file mode 100644
index 0000000000..03712fa37a
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-lineterminator-concisebody-functionbody.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator between arrow and ConciseBody[?In]
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : { FunctionBody }
+---*/
+var af = x =>
+{ return x };
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-yield.js b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-yield.js
new file mode 100644
index 0000000000..59c4c01191
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-bindingidentifier-yield.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+    
+    Parameter named "yield", non-strict
+
+flags: [noStrict]
+---*/
+var af = yield => 1;
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-assignmentexpression.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-assignmentexpression.js
new file mode 100644
index 0000000000..128a9788ea
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-assignmentexpression.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator not present
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : [lookahead ≠ { ] AssignmentExpression[?In]
+---*/
+var af = (x) => x;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-functionbody.js
new file mode 100644
index 0000000000..b01f4822bf
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-concisebody-functionbody.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : { FunctionBody }
+---*/
+var af = (x) => { return x };
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-arguments.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-arguments.js
new file mode 100644
index 0000000000..ee0be17a95
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-arguments.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    Parameter named "arguments", non-strict
+
+flags: [noStrict]
+---*/
+var af = (arguments) => arguments;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-eval.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-eval.js
new file mode 100644
index 0000000000..62c5428ccb
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-eval.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    Parameter named "eval", non-strict
+
+flags: [noStrict]
+---*/
+var af = (eval) => eval;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-yield.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-yield.js
new file mode 100644
index 0000000000..f933129df1
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameters-yield.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    Parameter named "yield", non-strict
+
+flags: [noStrict]
+---*/
+var af = (yield) => 1;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-includes-rest-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-includes-rest-concisebody-functionbody.js
new file mode 100644
index 0000000000..a72925b861
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-includes-rest-concisebody-functionbody.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator between arrow and ConciseBody[?In]
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : { FunctionBody }
+
+    Includes ...rest
+---*/
+var af = (x, ...y) => { return [x, y.length]; };
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1, 1, 1)[0], 1);
+assert.sameValue(af(1, 1, 1)[1], 2);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-1.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-1.js
new file mode 100644
index 0000000000..8f6da004a4
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-1.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+---*/
+var af = (x = 1) => x;
+
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(), 1);
+assert.sameValue(af(2), 2);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-2.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-2.js
new file mode 100644
index 0000000000..63e14fa59c
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-initialize-2.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    12.14.5
+    ---*/
+var af = ({x = 1}) => x;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af({}), 1);
+assert.sameValue(af({x: 2}), 2);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-assignmentexpression.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-assignmentexpression.js
new file mode 100644
index 0000000000..9086c9c461
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-assignmentexpression.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator not present
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : [lookahead ≠ { ] AssignmentExpression[?In]
+---*/
+var af = (x) =>
+x;
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-functionbody.js
new file mode 100644
index 0000000000..dba9b66dc9
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-lineterminator-concisebody-functionbody.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator between arrow and ConciseBody[?In]
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : { FunctionBody }
+---*/
+var af = (x) =>
+{ return x };
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1), 1);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-concisebody-functionbody.js
new file mode 100644
index 0000000000..83db33f270
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-concisebody-functionbody.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator between arrow and ConciseBody[?In]
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : { FunctionBody }
+
+    Includes ...rest
+---*/
+var af = (...x) => { return x.length; };
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1, 1, 1), 3);
diff --git a/test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-lineterminator-concisebody-functionbody.js b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-lineterminator-concisebody-functionbody.js
new file mode 100644
index 0000000000..c2fd82c53b
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/arrowparameters-cover-rest-lineterminator-concisebody-functionbody.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    LineTerminator between arrow and ConciseBody[?In]
+    ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+    ConciseBody[In] : { FunctionBody }
+
+    Includes ...rest
+---*/
+var af = (...x) =>
+{ return x.length; };
+
+assert.sameValue(typeof af, "function");
+assert.sameValue(af(1, 1, 1), 3);
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-futurereservedword.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-futurereservedword.js
new file mode 100644
index 0000000000..cbbac94aae
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-futurereservedword.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+
+    (12.1)
+    BindingIdentifier[Yield] :
+      Identifier[~Yield] yield
+
+    Identifier :
+      IdentifierName but not ReservedWord
+
+    ReservedWord : FutureReservedWord
+
+negative: SyntaxError
+---*/
+var af = enum => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-strict-futurereservedword.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-strict-futurereservedword.js
new file mode 100644
index 0000000000..e0a3e05327
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-strict-futurereservedword.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+
+    (12.1)
+    BindingIdentifier[Yield] :
+      Identifier[~Yield] yield
+
+    Identifier :
+      IdentifierName but not ReservedWord
+
+    ReservedWord : FutureReservedWord
+
+    Strict Mode
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = package => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier.js
new file mode 100644
index 0000000000..4833155bf0
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+
+    (12.1)
+    BindingIdentifier[Yield] :
+      Identifier[~Yield] yield
+
+    Identifier :
+      IdentifierName but not ReservedWord
+
+    ReservedWord : Keyword
+
+negative: SyntaxError
+---*/
+var af = switch => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-arguments.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-arguments.js
new file mode 100644
index 0000000000..41185ef6eb
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-arguments.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+
+    No parameter named "arguments"
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = arguments => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-eval.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-eval.js
new file mode 100644
index 0000000000..bd4662e33b
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-eval.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+
+
+    No parameter named "eval"
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = eval => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-yield.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-yield.js
new file mode 100644
index 0000000000..98154b7b0f
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-yield.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      BindingIdentifier[?Yield]
+      ...
+
+
+    No parameter named "yield"
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = yield => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-rest.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-rest.js
new file mode 100644
index 0000000000..2deba68f53
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-rest.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowParameters : BindingIdentifier[?Yield]
+
+    Includes ...rest
+
+negative: SyntaxError
+---*/
+var af = ...x => x;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-arguments.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-arguments.js
new file mode 100644
index 0000000000..a956a4c133
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-arguments.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    No parameters named "arguments"
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = (arguments) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-1.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-1.js
new file mode 100644
index 0000000000..25507d52bb
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-1.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ArrayBindingPattern
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = (x, [x]) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-2.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-2.js
new file mode 100644
index 0000000000..f14fd4adae
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-2.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ArrayBindingPattern
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = ([x, x]) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-3.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-3.js
new file mode 100644
index 0000000000..62cd34fbc4
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-3.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ArrayBindingPattern
+
+    BindingRestElement
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = ([x], ...x) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-1.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-1.js
new file mode 100644
index 0000000000..726529fb3e
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-1.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ObjectBindingPattern
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = (x, {x}) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-2.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-2.js
new file mode 100644
index 0000000000..87ea214709
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-2.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ObjectBindingPattern
+
+    BindingPropertyList
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = (x, {y: x}) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-3.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-3.js
new file mode 100644
index 0000000000..9da505ef40
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-3.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ObjectBindingPattern
+
+    BindingPropertyList
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = ({x}, {y: x}) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-4.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-4.js
new file mode 100644
index 0000000000..fd05542d15
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-4.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ObjectBindingPattern
+
+    BindingPropertyList
+
+    BindingRestElement
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = ({x}, ...x) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-5.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-5.js
new file mode 100644
index 0000000000..b547b6cb3f
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-5.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ObjectBindingPattern
+
+    BindingPropertyList
+
+    BindingRestElement
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = ({y: x}, ...x) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-6.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-6.js
new file mode 100644
index 0000000000..d16d4d033f
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-6.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    ObjectBindingPattern
+
+    BindingPropertyList
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = ({y: x, x}) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-rest.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-rest.js
new file mode 100644
index 0000000000..368c8e9e01
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-rest.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    No duplicates, rest
+
+negative: SyntaxError
+---*/
+var af = (x, ...x) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates.js
new file mode 100644
index 0000000000..56e1cb3a4a
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    No duplicates
+
+negative: SyntaxError
+---*/
+var af = (x, x) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-eval.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-eval.js
new file mode 100644
index 0000000000..d38f6acc8d
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-eval.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    CoverParenthesizedExpressionAndArrowParameterList, refined by:
+
+    ArrowFormalParameters[Yield, GeneratorParameter] :
+      ( StrictFormalParameters[?Yield, ?GeneratorParameter] )
+
+    No parameters named "eval"
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = (eval) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-yield.js b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-yield.js
new file mode 100644
index 0000000000..4152b37072
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-yield.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2.1
+description: >
+    ArrowParameters[Yield] :
+      ...
+      CoverParenthesizedExpressionAndArrowParameterList[?Yield]
+
+    No parameter named "yield"
+
+negative: SyntaxError
+flags: [onlyStrict]
+---*/
+var af = (yield) => 1;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters-expression-body.js b/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters-expression-body.js
new file mode 100644
index 0000000000..c3321ec5f1
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters-expression-body.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+negative: SyntaxError
+---*/
+var af = x
+=> x;
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js b/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js
new file mode 100644
index 0000000000..27c3d9c70f
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+
+    No parens around ArrowParameters
+
+negative: SyntaxError
+---*/
+var af = x
+=> {};
diff --git a/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid.js b/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid.js
new file mode 100644
index 0000000000..e7bc0458a4
--- /dev/null
+++ b/test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid.js
@@ -0,0 +1,11 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.2
+description: >
+    ArrowFunction[In, Yield] :
+      ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]
+negative: SyntaxError
+---*/
+var af = ()
+=> {};
diff --git a/test/language/arrow-function/Arrow-Function_syntax-variations.js b/test/language/expressions/arrow-function/syntax/variations.js
similarity index 100%
rename from test/language/arrow-function/Arrow-Function_syntax-variations.js
rename to test/language/expressions/arrow-function/syntax/variations.js
diff --git a/test/language/expressions/arrow-function/throw-new.js b/test/language/expressions/arrow-function/throw-new.js
new file mode 100644
index 0000000000..dfe3134efa
--- /dev/null
+++ b/test/language/expressions/arrow-function/throw-new.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.3.3.1.1
+description: >
+    Runtime Semantics: EvaluateNew(constructProduction, arguments)
+
+    ...
+    8. If IsConstructor (constructor) is false, throw a TypeError exception.
+    ...
+
+---*/
+
+assert.throws(TypeError, function() { new (() => {}); });
diff --git a/test/language/rest-parameters/arrow-function-invalid.js b/test/language/rest-parameters/arrow-function-invalid.js
deleted file mode 100644
index 4d226f24b5..0000000000
--- a/test/language/rest-parameters/arrow-function-invalid.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (C) 2014 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-/*---
-es6id: 14.1
-description: >
-    Invalid rest parameter in arrow function parameters
-negative: SyntaxError
----*/
-var x = ...y => y;