diff --git a/src/jshint.js b/src/jshint.js index 732d5734f1..efd2767149 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -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(); @@ -3914,7 +3921,7 @@ var JSHINT = (function() { error("E039"); } return this; - }); + }).declaration = true; prefix("function", function() { var generator = false; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 0e15c6c0d0..14a884e308 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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)