Skip to content

Commit

Permalink
[[FIX]] Disallow fn declarations in stmt positions
Browse files Browse the repository at this point in the history
  • Loading branch information
jugglinmike authored and rwaldron committed Dec 20, 2018
1 parent 529ba2d commit a0e0305
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 28 deletions.
13 changes: 10 additions & 3 deletions src/jshint.js
Expand Up @@ -1803,14 +1803,21 @@ var JSHINT = (function() {
warning("W116", state.tokens.next, "{", state.tokens.next.value);
}

// JSHint observes Annex B of the ECMAScript specification by default,
// where function declarations are permitted in the statement positions
// of IfStatements.
var supportsFnDecl = state.funct["(verb)"] === "if" ||
state.tokens.curr.id === "else";

state.tokens.next.inBracelessBlock = true;
indent += state.option.indent;
// test indentation only if statement is in new line
a = [statement()];
indent -= state.option.indent;

if (a[0] && a[0].declaration) {
error("E048", a[0], a[0].id === "const" ? "Const" : "Let");
if (a[0] && a[0].declaration &&
!(supportsFnDecl && a[0].id === "function")) {
error("E048", a[0], a[0].id[0].toUpperCase() + a[0].id.slice(1));
}

state.funct["(scope)"].unstack();
Expand Down Expand Up @@ -3914,7 +3921,7 @@ var JSHINT = (function() {
error("E039");
}
return this;
});
}).declaration = true;

prefix("function", function() {
var generator = false;
Expand Down
25 changes: 0 additions & 25 deletions tests/test262/expectations.txt
Expand Up @@ -477,11 +477,8 @@ test/language/literals/regexp/u-surrogate-pairs.js(default)
test/language/literals/regexp/u-surrogate-pairs.js(strict mode)
test/language/literals/regexp/u-unicode-esc.js(default)
test/language/literals/regexp/u-unicode-esc.js(strict mode)
test/language/block-scope/syntax/function-declarations/in-statement-position-do-statement-while-expression.js(strict mode)
test/language/block-scope/syntax/function-declarations/in-statement-position-for-statement.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/block-scope/syntax/function-declarations/in-statement-position-while-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/computed-property-names/class/method/constructor-can-be-getter.js(default)
Expand Down Expand Up @@ -1094,16 +1091,8 @@ test/language/statements/continue/12.7-1.js(default)
test/language/statements/continue/12.7-1.js(strict mode)
test/language/statements/do-while/decl-cls.js(default)
test/language/statements/do-while/decl-cls.js(strict mode)
test/language/statements/do-while/decl-fun.js(default)
test/language/statements/do-while/decl-fun.js(strict mode)
test/language/statements/do-while/decl-gen.js(default)
test/language/statements/do-while/decl-gen.js(strict mode)
test/language/statements/for-in/decl-cls.js(default)
test/language/statements/for-in/decl-cls.js(strict mode)
test/language/statements/for-in/decl-fun.js(default)
test/language/statements/for-in/decl-fun.js(strict mode)
test/language/statements/for-in/decl-gen.js(default)
test/language/statements/for-in/decl-gen.js(strict mode)
test/language/statements/for-in/dstr-array-rest-init.js(default)
test/language/statements/for-in/dstr-array-rest-init.js(strict mode)
test/language/statements/for-in/head-const-bound-names-fordecl-tdz.js(default)
Expand All @@ -1114,10 +1103,6 @@ test/language/statements/for-in/head-lhs-let.js(default)
test/language/statements/for-in/head-var-bound-names-let.js(default)
test/language/statements/for/decl-cls.js(default)
test/language/statements/for/decl-cls.js(strict mode)
test/language/statements/for/decl-fun.js(default)
test/language/statements/for/decl-fun.js(strict mode)
test/language/statements/for/decl-gen.js(default)
test/language/statements/for/decl-gen.js(strict mode)
test/language/statements/for/dstr-const-ary-init-iter-close.js(default)
test/language/statements/for/dstr-const-ary-init-iter-close.js(strict mode)
test/language/statements/for/dstr-const-ary-init-iter-get-err.js(default)
Expand Down Expand Up @@ -1445,10 +1430,6 @@ test/language/statements/return/S12.9_A1_T9.js(default)
test/language/statements/return/S12.9_A1_T9.js(strict mode)
test/language/statements/for-of/decl-cls.js(default)
test/language/statements/for-of/decl-cls.js(strict mode)
test/language/statements/for-of/decl-fun.js(default)
test/language/statements/for-of/decl-fun.js(strict mode)
test/language/statements/for-of/decl-gen.js(default)
test/language/statements/for-of/decl-gen.js(strict mode)
test/language/statements/for-of/dstr-array-elem-init-simple-no-strict.js(default)
test/language/statements/for-of/dstr-array-elem-init-yield-ident-valid.js(default)
test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-err.js(default)
Expand Down Expand Up @@ -1595,10 +1576,6 @@ test/language/statements/switch/S12.11_A2_T1.js(default)
test/language/statements/switch/S12.11_A2_T1.js(strict mode)
test/language/statements/while/decl-cls.js(default)
test/language/statements/while/decl-cls.js(strict mode)
test/language/statements/while/decl-fun.js(default)
test/language/statements/while/decl-fun.js(strict mode)
test/language/statements/while/decl-gen.js(default)
test/language/statements/while/decl-gen.js(strict mode)
test/language/statements/variable/dstr-ary-ptrn-rest-ary-elem.js(default)
test/language/statements/variable/dstr-ary-ptrn-rest-ary-elem.js(strict mode)
test/language/statements/variable/dstr-ary-ptrn-rest-ary-elision.js(default)
Expand Down Expand Up @@ -1634,8 +1611,6 @@ test/language/statements/try/early-catch-lex.js(strict mode)
test/language/statements/try/early-catch-var.js(default)
test/language/statements/try/early-catch-var.js(strict mode)
test/language/statements/with/decl-cls.js(default)
test/language/statements/with/decl-fun.js(default)
test/language/statements/with/decl-gen.js(default)
test/language/statements/const/block-local-use-before-initialization-in-declaration-statement.js(default)
test/language/statements/const/block-local-use-before-initialization-in-declaration-statement.js(strict mode)
test/language/statements/const/block-local-use-before-initialization-in-prior-statement.js(default)
Expand Down

0 comments on commit a0e0305

Please sign in to comment.