From 2d4ac25fa0048fff10068e88dda17a1a0ec60cfb Mon Sep 17 00:00:00 2001
From: Thomas Wood <tw1509@doc.ic.ac.uk>
Date: Tue, 24 Jul 2018 20:25:22 +0100
Subject: [PATCH] Add feature flags for `new.target`

Additionally removed the `arrow-function` feature for
test/language/eval-code/direct/new.target-fn.js as it is not testing
arrow-functions, but they are mentioned in the preamble.
---
 src/class-fields/eval-err-contains-newtarget.case               | 2 +-
 test/built-ins/Proxy/construct/trap-is-null.js                  | 2 +-
 test/built-ins/Proxy/construct/trap-is-undefined-no-property.js | 2 +-
 test/built-ins/Proxy/construct/trap-is-undefined.js             | 2 +-
 test/language/eval-code/direct/new.target-arrow.js              | 2 +-
 test/language/eval-code/direct/new.target-fn.js                 | 2 +-
 test/language/eval-code/direct/new.target.js                    | 1 +
 test/language/eval-code/indirect/new.target.js                  | 1 +
 .../arrow-function/lexical-new.target-closure-returned.js       | 1 +
 test/language/expressions/arrow-function/lexical-new.target.js  | 1 +
 test/language/expressions/assignment/target-cover-newtarget.js  | 1 +
 test/language/expressions/assignment/target-newtarget.js        | 1 +
 test/language/expressions/new.target/value-via-call.js          | 1 +
 test/language/expressions/new.target/value-via-fpapply.js       | 1 +
 test/language/expressions/new.target/value-via-fpcall.js        | 1 +
 test/language/expressions/new.target/value-via-member.js        | 1 +
 test/language/expressions/new.target/value-via-new.js           | 1 +
 test/language/expressions/new.target/value-via-reflect-apply.js | 2 +-
 .../expressions/new.target/value-via-reflect-construct.js       | 2 +-
 test/language/expressions/new.target/value-via-super-call.js    | 2 +-
 .../language/expressions/new.target/value-via-super-property.js | 2 +-
 .../expressions/new.target/value-via-tagged-template.js         | 2 +-
 .../expressions/postfix-decrement/target-cover-newtarget.js     | 1 +
 test/language/expressions/postfix-decrement/target-newtarget.js | 1 +
 .../expressions/postfix-increment/target-cover-newtarget.js     | 1 +
 test/language/expressions/postfix-increment/target-newtarget.js | 1 +
 .../expressions/prefix-decrement/target-cover-newtarget.js      | 1 +
 test/language/expressions/prefix-decrement/target-newtarget.js  | 1 +
 .../expressions/prefix-increment/target-cover-newtarget.js      | 1 +
 test/language/expressions/prefix-increment/target-newtarget.js  | 1 +
 test/language/expressions/super/call-construct-invocation.js    | 2 +-
 test/language/global-code/new.target-arrow.js                   | 2 +-
 test/language/global-code/new.target.js                         | 1 +
 test/language/module-code/early-new-target.js                   | 1 +
 34 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/src/class-fields/eval-err-contains-newtarget.case b/src/class-fields/eval-err-contains-newtarget.case
index 28688867af..e396fb4fa1 100644
--- a/src/class-fields/eval-err-contains-newtarget.case
+++ b/src/class-fields/eval-err-contains-newtarget.case
@@ -16,7 +16,7 @@ info: |
   ScriptBody:StatementList
 
     It is a Syntax Error if StatementList Contains NewTarget.
-features: [class, class-fields-public]
+features: [class, class-fields-public, new.target]
 template: initializer-eval-newtarget
 ---*/
 
diff --git a/test/built-ins/Proxy/construct/trap-is-null.js b/test/built-ins/Proxy/construct/trap-is-null.js
index fdd4852738..c5b915adaf 100644
--- a/test/built-ins/Proxy/construct/trap-is-null.js
+++ b/test/built-ins/Proxy/construct/trap-is-null.js
@@ -21,7 +21,7 @@ info: |
     ...
     3. If func is either undefined or null, return undefined.
     ...
-features: [Proxy, Reflect, Reflect.construct]
+features: [Proxy, Reflect, Reflect.construct, new.target]
 ---*/
 
 var calls = 0;
diff --git a/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js b/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js
index a6472c1ab3..8b19128db0 100644
--- a/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js
+++ b/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js
@@ -10,7 +10,7 @@ info: |
 
     7. If trap is undefined, then
         b. Return Construct(target, argumentsList, newTarget).
-features: [Proxy, Reflect, Reflect.construct]
+features: [Proxy, Reflect, Reflect.construct, new.target]
 ---*/
 
 var calls = 0;
diff --git a/test/built-ins/Proxy/construct/trap-is-undefined.js b/test/built-ins/Proxy/construct/trap-is-undefined.js
index 7c17356267..0dd7b2e4b1 100644
--- a/test/built-ins/Proxy/construct/trap-is-undefined.js
+++ b/test/built-ins/Proxy/construct/trap-is-undefined.js
@@ -21,7 +21,7 @@ info: |
     ...
     3. If func is either undefined or null, return undefined.
     ...
-features: [Proxy, Reflect, Reflect.construct]
+features: [Proxy, Reflect, Reflect.construct, new.target]
 ---*/
 
 var calls = 0;
diff --git a/test/language/eval-code/direct/new.target-arrow.js b/test/language/eval-code/direct/new.target-arrow.js
index 2eb465b7a5..a3a52faab5 100644
--- a/test/language/eval-code/direct/new.target-arrow.js
+++ b/test/language/eval-code/direct/new.target-arrow.js
@@ -11,7 +11,7 @@ info: |
     code containing NewTarget is eval code that is being processed by a direct
     eval that is contained in function code that is not the function code of an
     ArrowFunction.
-features: [arrow-function]
+features: [arrow-function, new.target]
 ---*/
 
 var caught;
diff --git a/test/language/eval-code/direct/new.target-fn.js b/test/language/eval-code/direct/new.target-fn.js
index e09e9462df..c494d08b4f 100644
--- a/test/language/eval-code/direct/new.target-fn.js
+++ b/test/language/eval-code/direct/new.target-fn.js
@@ -11,7 +11,7 @@ info: |
     code containing NewTarget is eval code that is being processed by a direct
     eval that is contained in function code that is not the function code of an
     ArrowFunction.
-features: [arrow-function]
+features: [new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/eval-code/direct/new.target.js b/test/language/eval-code/direct/new.target.js
index 8d308ac904..90604c9e81 100644
--- a/test/language/eval-code/direct/new.target.js
+++ b/test/language/eval-code/direct/new.target.js
@@ -9,6 +9,7 @@ info: |
     code containing NewTarget is eval code that is being processed by a direct
     eval that is contained in function code that is not the function code of an
     ArrowFunction.
+features: [new.target]
 ---*/
 
 var caught;
diff --git a/test/language/eval-code/indirect/new.target.js b/test/language/eval-code/indirect/new.target.js
index 5c938c70f2..5172ff2493 100644
--- a/test/language/eval-code/indirect/new.target.js
+++ b/test/language/eval-code/indirect/new.target.js
@@ -10,6 +10,7 @@ info: |
     code containing NewTarget is eval code that is being processed by a direct
     eval that is contained in function code that is not the function code of an
     ArrowFunction.
+features: [new.target]
 ---*/
 
 var caught;
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
index cbe64efe1d..7cd9d43bf4 100644
--- a/test/language/expressions/arrow-function/lexical-new.target-closure-returned.js
+++ b/test/language/expressions/arrow-function/lexical-new.target-closure-returned.js
@@ -14,6 +14,7 @@ description: >
     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.
+features: [new.target]
 ---*/
 
 function F() {
diff --git a/test/language/expressions/arrow-function/lexical-new.target.js b/test/language/expressions/arrow-function/lexical-new.target.js
index ef76c6bd83..400779bf34 100644
--- a/test/language/expressions/arrow-function/lexical-new.target.js
+++ b/test/language/expressions/arrow-function/lexical-new.target.js
@@ -14,6 +14,7 @@ description: >
     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.
+features: [new.target]
 ---*/
 
 var functionInvocationCount = 0;
diff --git a/test/language/expressions/assignment/target-cover-newtarget.js b/test/language/expressions/assignment/target-cover-newtarget.js
index 03ba2e29f4..34ab263b49 100644
--- a/test/language/expressions/assignment/target-cover-newtarget.js
+++ b/test/language/expressions/assignment/target-cover-newtarget.js
@@ -21,6 +21,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/assignment/target-newtarget.js b/test/language/expressions/assignment/target-newtarget.js
index 822d6a9fb9..1c14fee0f3 100644
--- a/test/language/expressions/assignment/target-newtarget.js
+++ b/test/language/expressions/assignment/target-newtarget.js
@@ -21,6 +21,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/new.target/value-via-call.js b/test/language/expressions/new.target/value-via-call.js
index 40fdf41352..9bd85d05a3 100644
--- a/test/language/expressions/new.target/value-via-call.js
+++ b/test/language/expressions/new.target/value-via-call.js
@@ -9,6 +9,7 @@ info: |
 
   [...]
   8. Return ? EvaluateDirectCall(func, thisValue, Arguments, tailCall).
+features: [new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-fpapply.js b/test/language/expressions/new.target/value-via-fpapply.js
index a1b3c1e8ee..7fab5ee16b 100644
--- a/test/language/expressions/new.target/value-via-fpapply.js
+++ b/test/language/expressions/new.target/value-via-fpapply.js
@@ -7,6 +7,7 @@ description: Value when invoked via `Function.prototype.apply`
 info: |
   [...]
   5. Return ? Call(func, thisArg, argList).
+features: [new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-fpcall.js b/test/language/expressions/new.target/value-via-fpcall.js
index 7f4d89b51f..5c32d8f3bd 100644
--- a/test/language/expressions/new.target/value-via-fpcall.js
+++ b/test/language/expressions/new.target/value-via-fpcall.js
@@ -7,6 +7,7 @@ description: Value when invoked via `Function.prototype.call`
 info: |
   [...]
   5. Return ? Call(func, thisArg, argList).
+features: [new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-member.js b/test/language/expressions/new.target/value-via-member.js
index 2ba06cf2a3..baaedf8e14 100644
--- a/test/language/expressions/new.target/value-via-member.js
+++ b/test/language/expressions/new.target/value-via-member.js
@@ -18,6 +18,7 @@ info: |
 
   1. Let exprRef be the result of evaluating Expression.
   2. Return ? GetValue(exprRef).
+features: [new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-new.js b/test/language/expressions/new.target/value-via-new.js
index 5715b5becb..06af2631d9 100644
--- a/test/language/expressions/new.target/value-via-new.js
+++ b/test/language/expressions/new.target/value-via-new.js
@@ -21,6 +21,7 @@ info: |
   7.3.13 Construct (F [ , argumentsList [ , newTarget ]])
 
   1. If newTarget was not passed, let newTarget be F.
+features: [new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-reflect-apply.js b/test/language/expressions/new.target/value-via-reflect-apply.js
index a9b27cb9ce..ed8d37efd6 100644
--- a/test/language/expressions/new.target/value-via-reflect-apply.js
+++ b/test/language/expressions/new.target/value-via-reflect-apply.js
@@ -7,7 +7,7 @@ description: Value when invoked via `Reflect.apply`
 info: |
   [...]
   5. Return ? Call(target, thisArgument, args).
-features: [Reflect]
+features: [Reflect, new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-reflect-construct.js b/test/language/expressions/new.target/value-via-reflect-construct.js
index a5240d5694..513ce97d2f 100644
--- a/test/language/expressions/new.target/value-via-reflect-construct.js
+++ b/test/language/expressions/new.target/value-via-reflect-construct.js
@@ -9,7 +9,7 @@ info: |
   2. If newTarget is not present, let newTarget be target.
   [...]
   5. Return ? Construct(target, args, newTarget).
-features: [Reflect]
+features: [Reflect, new.target]
 ---*/
 
 var customNewTarget = function() {};
diff --git a/test/language/expressions/new.target/value-via-super-call.js b/test/language/expressions/new.target/value-via-super-call.js
index b1a482d3bd..a582c08d00 100644
--- a/test/language/expressions/new.target/value-via-super-call.js
+++ b/test/language/expressions/new.target/value-via-super-call.js
@@ -11,7 +11,7 @@ info: |
   [...]
   6. Let result be ? Construct(func, argList, newTarget).
   [...]
-features: [class]
+features: [class, new.target]
 ---*/
 
 var baseNewTarget, parentNewTarget;
diff --git a/test/language/expressions/new.target/value-via-super-property.js b/test/language/expressions/new.target/value-via-super-property.js
index 18eaffbe74..379c3f0dca 100644
--- a/test/language/expressions/new.target/value-via-super-property.js
+++ b/test/language/expressions/new.target/value-via-super-property.js
@@ -11,7 +11,7 @@ info: |
   [...]
   6. Let result be ? Construct(func, argList, newTarget).
   [...]
-features: [class]
+features: [class, new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/new.target/value-via-tagged-template.js b/test/language/expressions/new.target/value-via-tagged-template.js
index 62242916b9..b6dfa72843 100644
--- a/test/language/expressions/new.target/value-via-tagged-template.js
+++ b/test/language/expressions/new.target/value-via-tagged-template.js
@@ -9,7 +9,7 @@ info: |
 
    [...]
    4. Return ? EvaluateCall(tagRef, TemplateLiteral, tailCall).
-features: [template]
+features: [template, new.target]
 ---*/
 
 var newTarget = null;
diff --git a/test/language/expressions/postfix-decrement/target-cover-newtarget.js b/test/language/expressions/postfix-decrement/target-cover-newtarget.js
index c7c3112ecc..f99504b159 100644
--- a/test/language/expressions/postfix-decrement/target-cover-newtarget.js
+++ b/test/language/expressions/postfix-decrement/target-cover-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/postfix-decrement/target-newtarget.js b/test/language/expressions/postfix-decrement/target-newtarget.js
index f134d1872b..8d3e98b407 100644
--- a/test/language/expressions/postfix-decrement/target-newtarget.js
+++ b/test/language/expressions/postfix-decrement/target-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/postfix-increment/target-cover-newtarget.js b/test/language/expressions/postfix-increment/target-cover-newtarget.js
index 359b0fc4b4..84747a21b4 100644
--- a/test/language/expressions/postfix-increment/target-cover-newtarget.js
+++ b/test/language/expressions/postfix-increment/target-cover-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/postfix-increment/target-newtarget.js b/test/language/expressions/postfix-increment/target-newtarget.js
index a84c784e96..81db503c0d 100644
--- a/test/language/expressions/postfix-increment/target-newtarget.js
+++ b/test/language/expressions/postfix-increment/target-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/prefix-decrement/target-cover-newtarget.js b/test/language/expressions/prefix-decrement/target-cover-newtarget.js
index 40ae5349a6..c67f787715 100644
--- a/test/language/expressions/prefix-decrement/target-cover-newtarget.js
+++ b/test/language/expressions/prefix-decrement/target-cover-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/prefix-decrement/target-newtarget.js b/test/language/expressions/prefix-decrement/target-newtarget.js
index c2dadc17bc..4d1b8b06d6 100644
--- a/test/language/expressions/prefix-decrement/target-newtarget.js
+++ b/test/language/expressions/prefix-decrement/target-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/prefix-increment/target-cover-newtarget.js b/test/language/expressions/prefix-increment/target-cover-newtarget.js
index 0a91e7bd10..fc7295a5e6 100644
--- a/test/language/expressions/prefix-increment/target-cover-newtarget.js
+++ b/test/language/expressions/prefix-increment/target-cover-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/prefix-increment/target-newtarget.js b/test/language/expressions/prefix-increment/target-newtarget.js
index cbf7a4e9c7..5bb720df9d 100644
--- a/test/language/expressions/prefix-increment/target-newtarget.js
+++ b/test/language/expressions/prefix-increment/target-newtarget.js
@@ -22,6 +22,7 @@ info: |
 negative:
   phase: parse
   type: ReferenceError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/expressions/super/call-construct-invocation.js b/test/language/expressions/super/call-construct-invocation.js
index 4b31ec43fc..4966d0ce3d 100644
--- a/test/language/expressions/super/call-construct-invocation.js
+++ b/test/language/expressions/super/call-construct-invocation.js
@@ -8,7 +8,7 @@ info: |
   [...]
   6. Let result be ? Construct(func, argList, newTarget).
   [...]
-features: [class, Reflect]
+features: [class, Reflect, new.target]
 ---*/
 
 var expectedNewTarget = function() {};
diff --git a/test/language/global-code/new.target-arrow.js b/test/language/global-code/new.target-arrow.js
index 1c9c7c9bfa..a39139a6aa 100644
--- a/test/language/global-code/new.target-arrow.js
+++ b/test/language/global-code/new.target-arrow.js
@@ -24,7 +24,7 @@ info: |
   NOTE Normally, Contains does not look inside most function forms. However,
        Contains is used to detect new.target, this, and super usage within an
        ArrowFunction.
-features: [arrow-function]
+features: [arrow-function, new.target]
 negative:
   phase: parse
   type: SyntaxError
diff --git a/test/language/global-code/new.target.js b/test/language/global-code/new.target.js
index 85a5fdb71b..881c35a61e 100644
--- a/test/language/global-code/new.target.js
+++ b/test/language/global-code/new.target.js
@@ -12,6 +12,7 @@ info: |
 negative: 
   phase: parse
   type: SyntaxError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
diff --git a/test/language/module-code/early-new-target.js b/test/language/module-code/early-new-target.js
index ac47e65b31..9acafb7fdc 100644
--- a/test/language/module-code/early-new-target.js
+++ b/test/language/module-code/early-new-target.js
@@ -8,6 +8,7 @@ flags: [module]
 negative:
   phase: parse
   type: SyntaxError
+features: [new.target]
 ---*/
 
 throw "Test262: This statement should not be evaluated.";
-- 
GitLab