From ab4ff914fb63b15f7bd00a4beed38b8fa1ff1b32 Mon Sep 17 00:00:00 2001
From: jugglinmike <mike@mikepennisi.com>
Date: Tue, 5 Jul 2016 18:20:56 -0400
Subject: [PATCH] Add tests for assignment target validation of new ES2015
 forms (#693)

This re-factors some existing Sputnik tests to be more targeted and to use a
pattern that can be generalized to other forms. We could test these all day,
but I've limited myself to forms introduced in ES2015, specifically
YieldExpression and new.target. Note that SpiderMonkey incorrectly throws a
SyntaxError for these.
I thoughtlessly wrote ReferenceError tests for yield = 1 until I realized
that such productions are not actually recognized by the grammar, so the early
errors do not apply. Instead, I've added a negative syntax test for that case.

* Refactor test for valid cover

* Add tests for ValidSimpleAssignmentTarget

Ensure that constructs introduced in ES2015 are disallowed as assignment
targets, with or without a "cover" grammar.

* Add test for grammar precedence of YieldExpression
---
 .../expressions/assignment/target-cover-id.js | 28 +++++++++++++++++
 .../assignment/target-cover-newtarget.js      | 26 ++++++++++++++++
 .../assignment/target-cover-yieldexpr.js      | 29 ++++++++++++++++++
 .../assignment/target-newtarget.js            | 26 ++++++++++++++++
 .../expressions/grouping/S11.1.6_A3_T5.js     | 21 -------------
 .../postfix-decrement/target-cover-id.js      | 29 ++++++++++++++++++
 .../target-cover-newtarget.js                 | 27 +++++++++++++++++
 .../target-cover-yieldexpr.js                 | 30 +++++++++++++++++++
 .../postfix-decrement/target-newtarget.js     | 27 +++++++++++++++++
 .../postfix-increment/target-cover-id.js      | 29 ++++++++++++++++++
 .../target-cover-newtarget.js                 | 27 +++++++++++++++++
 .../target-cover-yieldexpr.js                 | 30 +++++++++++++++++++
 .../postfix-increment/target-newtarget.js     | 27 +++++++++++++++++
 .../prefix-decrement/target-cover-id.js       | 29 ++++++++++++++++++
 .../target-cover-newtarget.js                 | 27 +++++++++++++++++
 .../target-cover-yieldexpr.js                 | 30 +++++++++++++++++++
 .../prefix-decrement/target-newtarget.js      | 27 +++++++++++++++++
 .../prefix-increment/target-cover-id.js       | 29 ++++++++++++++++++
 .../target-cover-newtarget.js                 | 27 +++++++++++++++++
 .../target-cover-yieldexpr.js                 | 30 +++++++++++++++++++
 .../prefix-increment/target-newtarget.js      | 27 +++++++++++++++++
 .../yield/invalid-left-hand-side.js           | 24 +++++++++++++++
 22 files changed, 585 insertions(+), 21 deletions(-)
 create mode 100644 test/language/expressions/assignment/target-cover-id.js
 create mode 100644 test/language/expressions/assignment/target-cover-newtarget.js
 create mode 100644 test/language/expressions/assignment/target-cover-yieldexpr.js
 create mode 100644 test/language/expressions/assignment/target-newtarget.js
 delete mode 100644 test/language/expressions/grouping/S11.1.6_A3_T5.js
 create mode 100644 test/language/expressions/postfix-decrement/target-cover-id.js
 create mode 100644 test/language/expressions/postfix-decrement/target-cover-newtarget.js
 create mode 100644 test/language/expressions/postfix-decrement/target-cover-yieldexpr.js
 create mode 100644 test/language/expressions/postfix-decrement/target-newtarget.js
 create mode 100644 test/language/expressions/postfix-increment/target-cover-id.js
 create mode 100644 test/language/expressions/postfix-increment/target-cover-newtarget.js
 create mode 100644 test/language/expressions/postfix-increment/target-cover-yieldexpr.js
 create mode 100644 test/language/expressions/postfix-increment/target-newtarget.js
 create mode 100644 test/language/expressions/prefix-decrement/target-cover-id.js
 create mode 100644 test/language/expressions/prefix-decrement/target-cover-newtarget.js
 create mode 100644 test/language/expressions/prefix-decrement/target-cover-yieldexpr.js
 create mode 100644 test/language/expressions/prefix-decrement/target-newtarget.js
 create mode 100644 test/language/expressions/prefix-increment/target-cover-id.js
 create mode 100644 test/language/expressions/prefix-increment/target-cover-newtarget.js
 create mode 100644 test/language/expressions/prefix-increment/target-cover-yieldexpr.js
 create mode 100644 test/language/expressions/prefix-increment/target-newtarget.js
 create mode 100644 test/language/expressions/yield/invalid-left-hand-side.js

diff --git a/test/language/expressions/assignment/target-cover-id.js b/test/language/expressions/assignment/target-cover-id.js
new file mode 100644
index 0000000000..6abdf7301a
--- /dev/null
+++ b/test/language/expressions/assignment/target-cover-id.js
@@ -0,0 +1,28 @@
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-assignment-operators-static-semantics-early-errors
+es6id: 12.14.1
+es5id: 11.1.6_A3_T5
+description: Applied to a "covered" IdentifierReference
+info: |
+  AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+
+  - It is an early Reference Error if LeftHandSideExpression is neither an
+    ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  Static Semantics: IsValidSimpleAssignmentTarget
+
+  IdentifierReference : Identifier
+
+  1. If this IdentifierReference is contained in strict mode code and
+     StringValue of Identifier is "eval" or "arguments", return false.
+  2. Return true.
+---*/
+
+var x;
+
+(x) = 1;
+
+assert.sameValue(x, 1);
diff --git a/test/language/expressions/assignment/target-cover-newtarget.js b/test/language/expressions/assignment/target-cover-newtarget.js
new file mode 100644
index 0000000000..2442cac6e9
--- /dev/null
+++ b/test/language/expressions/assignment/target-cover-newtarget.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-assignment-operators-static-semantics-early-errors
+es6id: 12.14.1
+description: Applied to a "covered" new.target
+info: |
+  AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+
+  - It is an early Reference Error if LeftHandSideExpression is neither an
+    ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  (new.target) = 1;
+}
diff --git a/test/language/expressions/assignment/target-cover-yieldexpr.js b/test/language/expressions/assignment/target-cover-yieldexpr.js
new file mode 100644
index 0000000000..0cfad36ebc
--- /dev/null
+++ b/test/language/expressions/assignment/target-cover-yieldexpr.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-assignment-operators-static-semantics-early-errors
+es6id: 12.14.1
+description: Applied to a "covered" YieldExpression
+info: |
+  AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+
+  - It is an early Reference Error if LeftHandSideExpression is neither an
+    ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.15.3 Static Semantics: IsValidSimpleAssignmentTarget
+
+  AssignmentExpression:
+    YieldExpression
+    ArrowFunction
+    LeftHandSideExpression = AssignmentExpression
+    LeftHandSideExpression AssignmentOperator AssignmentExpression
+
+  1. Return false.
+features: [generators]
+negative: ReferenceError
+---*/
+
+function* g() {
+  (yield) = 1;
+}
diff --git a/test/language/expressions/assignment/target-newtarget.js b/test/language/expressions/assignment/target-newtarget.js
new file mode 100644
index 0000000000..b4ebd6b596
--- /dev/null
+++ b/test/language/expressions/assignment/target-newtarget.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-assignment-operators-static-semantics-early-errors
+es6id: 12.14.1
+description: Applied to new.target
+info: |
+  AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+
+  - It is an early Reference Error if LeftHandSideExpression is neither an
+    ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  new.target = 1;
+}
diff --git a/test/language/expressions/grouping/S11.1.6_A3_T5.js b/test/language/expressions/grouping/S11.1.6_A3_T5.js
deleted file mode 100644
index 9f0e0ada1d..0000000000
--- a/test/language/expressions/grouping/S11.1.6_A3_T5.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-info: "\"This\" operator only evaluates Expression"
-es5id: 11.1.6_A3_T5
-description: Using grouping operator in declaration of variables
----*/
-
-//CHECK#1
-var x;
-(x) = 1;
-if (x !== 1) {
-  $ERROR('#1: (x) = 1; x === 1. Actual: ' + (x));
-}
-
-//CHECK#2
-var y = 1; (y)++; ++(y); (y)--; --(y);
-if (y !== 1) {
-  $ERROR('#2: var y = 1; (y)++; ++(y); (y)--; --(y); y === 1. Actual: ' + (y));
-}
diff --git a/test/language/expressions/postfix-decrement/target-cover-id.js b/test/language/expressions/postfix-decrement/target-cover-id.js
new file mode 100644
index 0000000000..446b5cb0f8
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/target-cover-id.js
@@ -0,0 +1,29 @@
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+es5id: 11.1.6_A3_T5
+description: Applied to a "covered" IdentifierReference
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  Static Semantics: IsValidSimpleAssignmentTarget
+
+  IdentifierReference : Identifier
+
+  1. If this IdentifierReference is contained in strict mode code and
+     StringValue of Identifier is "eval" or "arguments", return false.
+  2. Return true.
+---*/
+
+var y = 1;
+
+(y)--;
+
+assert.sameValue(y, 0);
diff --git a/test/language/expressions/postfix-decrement/target-cover-newtarget.js b/test/language/expressions/postfix-decrement/target-cover-newtarget.js
new file mode 100644
index 0000000000..55e3789d40
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/target-cover-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+description: Applied to a "covered" new.target
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  (new.target)--;
+}
diff --git a/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js b/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js
new file mode 100644
index 0000000000..4d7448ae89
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+description: Applied to a "covered" YieldExpression
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.15.3 Static Semantics: IsValidSimpleAssignmentTarget
+
+  AssignmentExpression:
+    YieldExpression
+    ArrowFunction
+    LeftHandSideExpression = AssignmentExpression
+    LeftHandSideExpression AssignmentOperator AssignmentExpression
+
+  1. Return false.
+features: [generators]
+negative: ReferenceError
+---*/
+
+function* g() {
+  (yield)--;
+}
diff --git a/test/language/expressions/postfix-decrement/target-newtarget.js b/test/language/expressions/postfix-decrement/target-newtarget.js
new file mode 100644
index 0000000000..bddee29f1e
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/target-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+description: Applied to new.target
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  new.target--;
+}
diff --git a/test/language/expressions/postfix-increment/target-cover-id.js b/test/language/expressions/postfix-increment/target-cover-id.js
new file mode 100644
index 0000000000..b01ce5f05e
--- /dev/null
+++ b/test/language/expressions/postfix-increment/target-cover-id.js
@@ -0,0 +1,29 @@
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+es5id: 11.1.6_A3_T5
+description: Applied to a "covered" IdentifierReference
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  Static Semantics: IsValidSimpleAssignmentTarget
+
+  IdentifierReference : Identifier
+
+  1. If this IdentifierReference is contained in strict mode code and
+     StringValue of Identifier is "eval" or "arguments", return false.
+  2. Return true.
+---*/
+
+var y = 1;
+
+(y)++;
+
+assert.sameValue(y, 2);
diff --git a/test/language/expressions/postfix-increment/target-cover-newtarget.js b/test/language/expressions/postfix-increment/target-cover-newtarget.js
new file mode 100644
index 0000000000..7168110cf0
--- /dev/null
+++ b/test/language/expressions/postfix-increment/target-cover-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+description: Applied to a "covered" new.target
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  (new.target)++;
+}
diff --git a/test/language/expressions/postfix-increment/target-cover-yieldexpr.js b/test/language/expressions/postfix-increment/target-cover-yieldexpr.js
new file mode 100644
index 0000000000..3fdc200d01
--- /dev/null
+++ b/test/language/expressions/postfix-increment/target-cover-yieldexpr.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+description: Applied to a "covered" YieldExpression
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.15.3 Static Semantics: IsValidSimpleAssignmentTarget
+
+  AssignmentExpression:
+    YieldExpression
+    ArrowFunction
+    LeftHandSideExpression = AssignmentExpression
+    LeftHandSideExpression AssignmentOperator AssignmentExpression
+
+  1. Return false.
+features: [generators]
+negative: ReferenceError
+---*/
+
+function* g() {
+  (yield)++;
+}
diff --git a/test/language/expressions/postfix-increment/target-newtarget.js b/test/language/expressions/postfix-increment/target-newtarget.js
new file mode 100644
index 0000000000..1cc7a2d226
--- /dev/null
+++ b/test/language/expressions/postfix-increment/target-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-postfix-expressions-static-semantics-early-errors
+es6id: 12.4.1
+description: Applied to new.target
+info: |
+  PostfixExpression :
+    LeftHandSideExpression ++
+    LeftHandSideExpression --
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    LeftHandSideExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  new.target++;
+}
diff --git a/test/language/expressions/prefix-decrement/target-cover-id.js b/test/language/expressions/prefix-decrement/target-cover-id.js
new file mode 100644
index 0000000000..476c4f2fed
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/target-cover-id.js
@@ -0,0 +1,29 @@
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+es5id: 11.1.6_A3_T5
+description: Applied to a "covered" IdentifierReference
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  Static Semantics: IsValidSimpleAssignmentTarget
+
+  IdentifierReference : Identifier
+
+  1. If this IdentifierReference is contained in strict mode code and
+     StringValue of Identifier is "eval" or "arguments", return false.
+  2. Return true.
+---*/
+
+var y = 1;
+
+--(y);
+
+assert.sameValue(y, 0);
diff --git a/test/language/expressions/prefix-decrement/target-cover-newtarget.js b/test/language/expressions/prefix-decrement/target-cover-newtarget.js
new file mode 100644
index 0000000000..3037aca67a
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/target-cover-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+description: Applied to a "covered" new.target
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  --(new.target);
+}
diff --git a/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js b/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js
new file mode 100644
index 0000000000..fbf6cbb2cc
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+description: Applied to a "covered" YieldExpression
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  12.15.3 Static Semantics: IsValidSimpleAssignmentTarget
+
+  AssignmentExpression:
+    YieldExpression
+    ArrowFunction
+    LeftHandSideExpression = AssignmentExpression
+    LeftHandSideExpression AssignmentOperator AssignmentExpression
+
+  1. Return false.
+features: [generators]
+negative: ReferenceError
+---*/
+
+function* g() {
+  --(yield);
+}
diff --git a/test/language/expressions/prefix-decrement/target-newtarget.js b/test/language/expressions/prefix-decrement/target-newtarget.js
new file mode 100644
index 0000000000..4f8d1ecbef
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/target-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+description: Applied to new.target
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  --new.target;
+}
diff --git a/test/language/expressions/prefix-increment/target-cover-id.js b/test/language/expressions/prefix-increment/target-cover-id.js
new file mode 100644
index 0000000000..1c4b8d91f8
--- /dev/null
+++ b/test/language/expressions/prefix-increment/target-cover-id.js
@@ -0,0 +1,29 @@
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+es5id: 11.1.6_A3_T5
+description: Applied to a "covered" IdentifierReference
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  Static Semantics: IsValidSimpleAssignmentTarget
+
+  IdentifierReference : Identifier
+
+  1. If this IdentifierReference is contained in strict mode code and
+     StringValue of Identifier is "eval" or "arguments", return false.
+  2. Return true.
+---*/
+
+var y = 1;
+
+++(y);
+
+assert.sameValue(y, 2);
diff --git a/test/language/expressions/prefix-increment/target-cover-newtarget.js b/test/language/expressions/prefix-increment/target-cover-newtarget.js
new file mode 100644
index 0000000000..113b4a2074
--- /dev/null
+++ b/test/language/expressions/prefix-increment/target-cover-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+description: Applied to a "covered" new.target
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  ++(new.target);
+}
diff --git a/test/language/expressions/prefix-increment/target-cover-yieldexpr.js b/test/language/expressions/prefix-increment/target-cover-yieldexpr.js
new file mode 100644
index 0000000000..10ee8602e1
--- /dev/null
+++ b/test/language/expressions/prefix-increment/target-cover-yieldexpr.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+description: Applied to a "covered" YieldExpression
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  12.15.3 Static Semantics: IsValidSimpleAssignmentTarget
+
+  AssignmentExpression:
+    YieldExpression
+    ArrowFunction
+    LeftHandSideExpression = AssignmentExpression
+    LeftHandSideExpression AssignmentOperator AssignmentExpression
+
+  1. Return false.
+features: [generators]
+negative: ReferenceError
+---*/
+
+function* g() {
+  ++(yield);
+}
diff --git a/test/language/expressions/prefix-increment/target-newtarget.js b/test/language/expressions/prefix-increment/target-newtarget.js
new file mode 100644
index 0000000000..928f32b8c9
--- /dev/null
+++ b/test/language/expressions/prefix-increment/target-newtarget.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-unary-operators-static-semantics-early-errors
+es6id: 12.5.1
+description: Applied to new.target
+info: |
+  UnaryExpression :
+    ++ UnaryExpression
+    -- UnaryExpression
+
+  - It is an early Reference Error if IsValidSimpleAssignmentTarget of
+    UnaryExpression is false.
+
+  12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget
+
+  NewTarget:
+
+  new.target
+
+  1. Return false.
+negative: ReferenceError
+---*/
+
+function f() {
+  ++new.target;
+}
diff --git a/test/language/expressions/yield/invalid-left-hand-side.js b/test/language/expressions/yield/invalid-left-hand-side.js
new file mode 100644
index 0000000000..e5d000a914
--- /dev/null
+++ b/test/language/expressions/yield/invalid-left-hand-side.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-generator-function-definitions
+es6id: 14.4
+description: A YieldExpression is not a valid LeftHandSideExpression
+info: |
+  AssignmentExpression[In, Yield] :
+    ConditionalExpression[?In, ?Yield]
+    [+Yield]YieldExpression[?In]
+    ArrowFunction[?In, ?Yield]
+    LeftHandSideExpression[?Yield] = AssignmentExpression[?In, ?Yield]
+    LeftHandSideExpression[?Yield] AssignmentOperator AssignmentExpression[?In, ?Yield]
+
+  LeftHandSideExpression[Yield] :
+    NewExpression[?Yield]
+    CallExpression[?Yield]
+features: [generators]
+negative: SyntaxError
+---*/
+
+function* g() {
+  yield = 1;
+}
-- 
GitLab