From 89e15ce814d2f9ba6f5fe46d38e575f025cf4dcb Mon Sep 17 00:00:00 2001
From: Daniel Ehrenberg <microdan@gmail.com>
Date: Thu, 13 Apr 2017 17:06:16 +0200
Subject: [PATCH] Test to block legacy hoisting for `function arguments() {}`
 (#970)

Ref https://github.com/tc39/ecma262/issues/815
Ref https://github.com/tc39/ecma262/pull/889

This is testing the current semantics of the specs, rather than the semantics in the proposed referenced issue.
---
 .../block-decl-func-skip-arguments.js         | 54 +++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 test/annexB/language/function-code/block-decl-func-skip-arguments.js

diff --git a/test/annexB/language/function-code/block-decl-func-skip-arguments.js b/test/annexB/language/function-code/block-decl-func-skip-arguments.js
new file mode 100644
index 0000000000..3c41abddd7
--- /dev/null
+++ b/test/annexB/language/function-code/block-decl-func-skip-arguments.js
@@ -0,0 +1,54 @@
+/*---
+description: Functions named 'arguments' have legacy hoisting semantics
+esid: sec-web-compat-functiondeclarationinstantiation
+flags: [noStrict]
+info: |
+    FunctionDeclarationInstantiation ( _func_, _argumentsList_ )
+
+    [...]
+    7. Let _parameterNames_ be the BoundNames of _formals_.
+    [...]
+    22. If argumentsObjectNeeded is true, then
+      f. Append "arguments" to parameterNames.
+
+    Changes to FunctionDeclarationInstantiation
+
+    [...]
+    ii. If replacing the |FunctionDeclaration| _f_ with a |VariableStatement| that has _F_
+        as a |BindingIdentifier| would not produce any Early Errors for _func_ and _F_ is
+        not an element of _parameterNames_, then
+      [...]
+---*/
+
+// Simple parameters
+(function() {
+  assert.sameValue(arguments.toString(), "[object Arguments]");
+  {
+    assert.sameValue(arguments(), undefined);
+    function arguments() {}
+    assert.sameValue(arguments(), undefined);
+  }
+  assert.sameValue(arguments.toString(), "[object Arguments]");
+}());
+
+// Single named parameter
+(function(x) {
+  assert.sameValue(arguments.toString(), "[object Arguments]");
+  {
+    assert.sameValue(arguments(), undefined);
+    function arguments() {}
+    assert.sameValue(arguments(), undefined);
+  }
+  assert.sameValue(arguments.toString(), "[object Arguments]");
+}());
+
+// Non-simple parameters
+(function(..._) {
+  assert.sameValue(arguments.toString(), "[object Arguments]");
+  {
+    assert.sameValue(arguments(), undefined);
+    function arguments() {}
+    assert.sameValue(arguments(), undefined);
+  }
+  assert.sameValue(arguments.toString(), "[object Arguments]");
+}());
-- 
GitLab