Skip to content

Commit

Permalink
[[FIX]] Report early reference with warning
Browse files Browse the repository at this point in the history
The situation described by this condition does not constitute
syntactically invalid code, so it should be reported with a warning.
  • Loading branch information
jugglinmike committed Mar 1, 2021
1 parent e831188 commit 2c1a5f8
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 142 deletions.
5 changes: 3 additions & 2 deletions src/scope-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -538,8 +538,9 @@ var scopeManager = function(state, predefined, exported, declared) {
if (usage["(onlyUsedSubFunction)"]) {
_latedefWarning(type, bindingName, token);
} else {
// this is a clear illegal usage for block scoped variables
warning("E056", token, bindingName, type);
// this is a clear illegal usage, but not a syntax error, so emit a
// warning and not an error
warning("W003", token, bindingName);
}
}
},
Expand Down
130 changes: 0 additions & 130 deletions tests/test262/expectations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,6 @@ test/language/arguments-object/10.6-13-c-1-s.js(strict mode)
test/language/arguments-object/10.6-2gs.js(strict mode)
test/language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement-else-statement.js(strict mode)
test/language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement.js(strict mode)
test/language/destructuring/binding/syntax/array-elements-with-initializer.js(default)
test/language/destructuring/binding/syntax/array-elements-with-initializer.js(strict mode)
test/language/module-code/early-export-global.js(default)
test/language/module-code/early-export-global.js(strict mode)
test/language/module-code/early-export-unresolvable.js(default)
Expand Down Expand Up @@ -1061,78 +1059,14 @@ test/annexB/built-ins/escape/escape-above-astral.js(strict mode)


# Async functions
test/language/expressions/async-arrow-function/dflt-params-ref-later.js(default)
test/language/expressions/async-arrow-function/dflt-params-ref-later.js(strict mode)
test/language/expressions/async-arrow-function/dflt-params-ref-self.js(default)
test/language/expressions/async-arrow-function/dflt-params-ref-self.js(strict mode)
test/language/expressions/async-function/named-dflt-params-ref-later.js(default)
test/language/expressions/async-function/named-dflt-params-ref-later.js(strict mode)
test/language/expressions/async-function/named-dflt-params-ref-self.js(default)
test/language/expressions/async-function/named-dflt-params-ref-self.js(strict mode)
test/language/expressions/async-function/nameless-dflt-params-ref-later.js(default)
test/language/expressions/async-function/nameless-dflt-params-ref-later.js(strict mode)
test/language/expressions/async-function/nameless-dflt-params-ref-self.js(default)
test/language/expressions/async-function/nameless-dflt-params-ref-self.js(strict mode)
test/language/statements/async-function/dflt-params-ref-later.js(default)
test/language/statements/async-function/dflt-params-ref-later.js(strict mode)
test/language/statements/async-function/dflt-params-ref-self.js(default)
test/language/statements/async-function/dflt-params-ref-self.js(strict mode)
test/language/statements/async-generator/dflt-params-ref-later.js(default)
test/language/statements/async-generator/dflt-params-ref-later.js(strict mode)
test/language/statements/async-generator/dflt-params-ref-self.js(default)
test/language/statements/async-generator/dflt-params-ref-self.js(strict mode)

test/language/expressions/generators/dflt-params-ref-later.js(default)
test/language/expressions/generators/dflt-params-ref-later.js(strict mode)
test/language/expressions/generators/dflt-params-ref-self.js(default)
test/language/expressions/generators/dflt-params-ref-self.js(strict mode)
test/language/expressions/async-generator/dflt-params-ref-later.js(default)
test/language/expressions/async-generator/dflt-params-ref-later.js(strict mode)
test/language/expressions/async-generator/dflt-params-ref-self.js(default)
test/language/expressions/async-generator/dflt-params-ref-self.js(strict mode)
test/language/expressions/async-generator/named-dflt-params-ref-later.js(default)
test/language/expressions/async-generator/named-dflt-params-ref-later.js(strict mode)
test/language/expressions/async-generator/named-dflt-params-ref-self.js(default)
test/language/expressions/async-generator/named-dflt-params-ref-self.js(strict mode)
test/language/expressions/function/dflt-params-ref-later.js(default)
test/language/expressions/function/dflt-params-ref-later.js(strict mode)
test/language/expressions/function/dflt-params-ref-self.js(default)
test/language/expressions/function/dflt-params-ref-self.js(strict mode)
test/language/expressions/object/accessor-name-literal-string-unicode-escape.js(default)
test/language/expressions/object/accessor-name-literal-string-unicode-escape.js(strict mode)
test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-later.js(default)
test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-self.js(default)
test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/object/method-definition/async-meth-dflt-params-ref-later.js(default)
test/language/expressions/object/method-definition/async-meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/object/method-definition/async-meth-dflt-params-ref-self.js(default)
test/language/expressions/object/method-definition/async-meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-later.js(default)
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-self.js(default)
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/object/method-definition/meth-dflt-params-ref-later.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/object/method-definition/meth-dflt-params-ref-self.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/arrow-function/dflt-params-ref-later.js(default)
test/language/expressions/arrow-function/dflt-params-ref-later.js(strict mode)
test/language/expressions/arrow-function/dflt-params-ref-self.js(default)
test/language/expressions/arrow-function/dflt-params-ref-self.js(strict mode)

# Async iteration
test/language/expressions/async-generator/early-errors-expression-yield-star-after-newline.js(default)
test/language/expressions/async-generator/early-errors-expression-yield-star-after-newline.js(strict mode)

test/language/statements/function/dflt-params-ref-later.js(default)
test/language/statements/function/dflt-params-ref-later.js(strict mode)
test/language/statements/function/dflt-params-ref-self.js(default)
test/language/statements/function/dflt-params-ref-self.js(strict mode)
test/language/statements/generators/dflt-params-ref-later.js(default)
test/language/statements/generators/dflt-params-ref-later.js(strict mode)
test/language/statements/generators/dflt-params-ref-self.js(default)
test/language/statements/generators/dflt-params-ref-self.js(strict mode)

test/language/export/escaped-as-export-specifier.js(default)
test/language/export/escaped-as-export-specifier.js(strict mode)
Expand Down Expand Up @@ -1672,22 +1606,6 @@ test/language/expressions/class/accessor-name-inst/literal-string-unicode-escape
test/language/expressions/class/accessor-name-inst/literal-string-unicode-escape.js(strict mode)
test/language/expressions/class/accessor-name-static/literal-string-unicode-escape.js(default)
test/language/expressions/class/accessor-name-static/literal-string-unicode-escape.js(strict mode)
test/language/expressions/class/async-gen-method/dflt-params-ref-later.js(default)
test/language/expressions/class/async-gen-method/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/async-gen-method/dflt-params-ref-self.js(default)
test/language/expressions/class/async-gen-method/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/async-gen-method-static/dflt-params-ref-later.js(default)
test/language/expressions/class/async-gen-method-static/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/async-gen-method-static/dflt-params-ref-self.js(default)
test/language/expressions/class/async-gen-method-static/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/async-method/dflt-params-ref-later.js(default)
test/language/expressions/class/async-method/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/async-method/dflt-params-ref-self.js(default)
test/language/expressions/class/async-method/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/async-method-static/dflt-params-ref-later.js(default)
test/language/expressions/class/async-method-static/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/async-method-static/dflt-params-ref-self.js(default)
test/language/expressions/class/async-method-static/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-close.js(default)
test/language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-close.js(strict mode)
test/language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-no-close.js(default)
Expand Down Expand Up @@ -4554,22 +4472,6 @@ test/language/expressions/class/elements/wrapped-in-sc-static-private-methods.js
test/language/expressions/class/elements/wrapped-in-sc-static-private-methods.js(strict mode)
test/language/expressions/class/elements/wrapped-in-sc-string-literal-names.js(default)
test/language/expressions/class/elements/wrapped-in-sc-string-literal-names.js(strict mode)
test/language/expressions/class/gen-method/dflt-params-ref-later.js(default)
test/language/expressions/class/gen-method/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/gen-method/dflt-params-ref-self.js(default)
test/language/expressions/class/gen-method/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/gen-method-static/dflt-params-ref-later.js(default)
test/language/expressions/class/gen-method-static/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/gen-method-static/dflt-params-ref-self.js(default)
test/language/expressions/class/gen-method-static/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/method/dflt-params-ref-later.js(default)
test/language/expressions/class/method/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/method/dflt-params-ref-self.js(default)
test/language/expressions/class/method/dflt-params-ref-self.js(strict mode)
test/language/expressions/class/method-static/dflt-params-ref-later.js(default)
test/language/expressions/class/method-static/dflt-params-ref-later.js(strict mode)
test/language/expressions/class/method-static/dflt-params-ref-self.js(default)
test/language/expressions/class/method-static/dflt-params-ref-self.js(strict mode)
test/language/expressions/dynamic-import/assignment-expression/additive-expr.js(default)
test/language/expressions/dynamic-import/assignment-expression/additive-expr.js(strict mode)
test/language/expressions/dynamic-import/assignment-expression/array-literal.js(default)
Expand Down Expand Up @@ -5190,22 +5092,6 @@ test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.
test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.js(strict mode)
test/language/statements/class/accessor-name-static/literal-string-unicode-escape.js(default)
test/language/statements/class/accessor-name-static/literal-string-unicode-escape.js(strict mode)
test/language/statements/class/async-gen-method/dflt-params-ref-later.js(default)
test/language/statements/class/async-gen-method/dflt-params-ref-later.js(strict mode)
test/language/statements/class/async-gen-method/dflt-params-ref-self.js(default)
test/language/statements/class/async-gen-method/dflt-params-ref-self.js(strict mode)
test/language/statements/class/async-gen-method-static/dflt-params-ref-later.js(default)
test/language/statements/class/async-gen-method-static/dflt-params-ref-later.js(strict mode)
test/language/statements/class/async-gen-method-static/dflt-params-ref-self.js(default)
test/language/statements/class/async-gen-method-static/dflt-params-ref-self.js(strict mode)
test/language/statements/class/async-method/dflt-params-ref-later.js(default)
test/language/statements/class/async-method/dflt-params-ref-later.js(strict mode)
test/language/statements/class/async-method/dflt-params-ref-self.js(default)
test/language/statements/class/async-method/dflt-params-ref-self.js(strict mode)
test/language/statements/class/async-method-static/dflt-params-ref-later.js(default)
test/language/statements/class/async-method-static/dflt-params-ref-later.js(strict mode)
test/language/statements/class/async-method-static/dflt-params-ref-self.js(default)
test/language/statements/class/async-method-static/dflt-params-ref-self.js(strict mode)
test/language/statements/class/dstr/async-private-gen-meth-ary-init-iter-close.js(default)
test/language/statements/class/dstr/async-private-gen-meth-ary-init-iter-close.js(strict mode)
test/language/statements/class/dstr/async-private-gen-meth-ary-init-iter-no-close.js(default)
Expand Down Expand Up @@ -8112,22 +7998,6 @@ test/language/statements/class/elements/wrapped-in-sc-static-private-methods.js(
test/language/statements/class/elements/wrapped-in-sc-static-private-methods.js(strict mode)
test/language/statements/class/elements/wrapped-in-sc-string-literal-names.js(default)
test/language/statements/class/elements/wrapped-in-sc-string-literal-names.js(strict mode)
test/language/statements/class/gen-method/dflt-params-ref-later.js(default)
test/language/statements/class/gen-method/dflt-params-ref-later.js(strict mode)
test/language/statements/class/gen-method/dflt-params-ref-self.js(default)
test/language/statements/class/gen-method/dflt-params-ref-self.js(strict mode)
test/language/statements/class/gen-method-static/dflt-params-ref-later.js(default)
test/language/statements/class/gen-method-static/dflt-params-ref-later.js(strict mode)
test/language/statements/class/gen-method-static/dflt-params-ref-self.js(default)
test/language/statements/class/gen-method-static/dflt-params-ref-self.js(strict mode)
test/language/statements/class/method/dflt-params-ref-later.js(default)
test/language/statements/class/method/dflt-params-ref-later.js(strict mode)
test/language/statements/class/method/dflt-params-ref-self.js(default)
test/language/statements/class/method/dflt-params-ref-self.js(strict mode)
test/language/statements/class/method-static/dflt-params-ref-later.js(default)
test/language/statements/class/method-static/dflt-params-ref-later.js(strict mode)
test/language/statements/class/method-static/dflt-params-ref-self.js(default)
test/language/statements/class/method-static/dflt-params-ref-self.js(strict mode)
test/language/statements/for-of/dstr/array-elem-iter-rtrn-close-err.js(default)
test/language/statements/for-of/dstr/array-elem-iter-rtrn-close-err.js(strict mode)
test/language/statements/for-of/dstr/array-elem-iter-thrw-close-err.js(default)
Expand Down
20 changes: 10 additions & 10 deletions tests/unit/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -1746,19 +1746,19 @@ exports.testDefaultArguments = function (test) {
var src = fs.readFileSync(__dirname + "/fixtures/default-arguments.js", "utf8");
TestRun(test)
.addError(14, 39, "'bar' is not defined.")
.addError(14, 32, "'num3' was used before it was declared, which is illegal for 'param' variables.")
.addError(15, 32, "'num4' was used before it was declared, which is illegal for 'param' variables.")
.addError(14, 32, "'num3' was used before it was defined.")
.addError(15, 32, "'num4' was used before it was defined.")
.addError(18, 41, "Regular parameters should not come after default parameters.")
.addError(27, 10, "'c' is not defined.")
.addError(33, 4, "'d' was used before it was defined.")
.addError(36, 16, "'e' was used before it was declared, which is illegal for 'param' variables.")
.addError(36, 16, "'e' was used before it was defined.")
.test(src, { esnext: true, undef: true, latedef: true });

TestRun(test)
.addError(14, 32, "'num3' was used before it was declared, which is illegal for 'param' variables.")
.addError(15, 32, "'num4' was used before it was declared, which is illegal for 'param' variables.")
.addError(14, 32, "'num3' was used before it was defined.")
.addError(15, 32, "'num4' was used before it was defined.")
.addError(18, 41, "Regular parameters should not come after default parameters.")
.addError(36, 16, "'e' was used before it was declared, which is illegal for 'param' variables.")
.addError(36, 16, "'e' was used before it was defined.")
.test(src, { moz: true });

TestRun(test)
Expand All @@ -1768,25 +1768,25 @@ exports.testDefaultArguments = function (test) {
.addError(12, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(13, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(14, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(14, 32, "'num3' was used before it was declared, which is illegal for 'param' variables.")
.addError(14, 32, "'num3' was used before it was defined.")
.addError(15, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(15, 32, "'num4' was used before it was declared, which is illegal for 'param' variables.")
.addError(15, 32, "'num4' was used before it was defined.")
.addError(18, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(18, 41, "Regular parameters should not come after default parameters.")
.addError(26, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(31, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(33, 6, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(35, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(36, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').")
.addError(36, 16, "'e' was used before it was declared, which is illegal for 'param' variables.")
.addError(36, 16, "'e' was used before it was defined.")
.test(src, { });

test.done();
};

exports.testEarlyCatchParam = function (test) {
TestRun(test)
.addError(2, 18, "'y' was used before it was declared, which is illegal for 'exception' variables.")
.addError(2, 18, "'y' was used before it was defined.")
.test([
"try {",
"} catch ([x = y, y]) {",
Expand Down

0 comments on commit 2c1a5f8

Please sign in to comment.