From ef6a87cdfb8c59094724451d9cff3aa88a154237 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 24 Sep 2014 08:52:02 -0700 Subject: [PATCH] use operator token when checking unary expressions in strict mode --- src/compiler/parser.ts | 4 +- .../deleteOperatorInStrictMode.errors.txt | 9 +++ .../reference/parserStrictMode15.errors.txt | 5 +- .../baselines/reference/parserStrictMode15.js | 7 --- .../reference/parserStrictMode7.errors.txt | 5 +- .../baselines/reference/parserStrictMode7.js | 7 --- .../unaryOperatorsInStrictMode.errors.txt | 62 +++++++++++++++++++ .../compiler/deleteOperatorInStrictMode.ts | 3 + .../compiler/unaryOperatorsInStrictMode.ts | 10 +++ 9 files changed, 94 insertions(+), 18 deletions(-) create mode 100644 tests/baselines/reference/deleteOperatorInStrictMode.errors.txt delete mode 100644 tests/baselines/reference/parserStrictMode15.js delete mode 100644 tests/baselines/reference/parserStrictMode7.js create mode 100644 tests/baselines/reference/unaryOperatorsInStrictMode.errors.txt create mode 100644 tests/cases/compiler/deleteOperatorInStrictMode.ts create mode 100644 tests/cases/compiler/unaryOperatorsInStrictMode.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 7aedd585a7e..7ea82597af0 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2174,10 +2174,10 @@ module ts { // The identifier eval or arguments may not appear as the LeftHandSideExpression of an // Assignment operator(11.13) or of a PostfixExpression(11.3) or as the UnaryExpression // operated upon by a Prefix Increment(11.4.4) or a Prefix Decrement(11.4.5) operator - if ((token === SyntaxKind.PlusPlusToken || token === SyntaxKind.MinusMinusToken) && isEvalOrArgumentsIdentifier(operand)) { + if ((operator === SyntaxKind.PlusPlusToken || operator === SyntaxKind.MinusMinusToken) && isEvalOrArgumentsIdentifier(operand)) { reportInvalidUseInStrictMode(operand); } - else if (token === SyntaxKind.DeleteKeyword && operand.kind === SyntaxKind.Identifier) { + else if (operator === SyntaxKind.DeleteKeyword && operand.kind === SyntaxKind.Identifier) { // When a delete operator occurs within strict mode code, a SyntaxError is thrown if its // UnaryExpression is a direct reference to a variable, function argument, or function name grammarErrorOnNode(operand, Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode); diff --git a/tests/baselines/reference/deleteOperatorInStrictMode.errors.txt b/tests/baselines/reference/deleteOperatorInStrictMode.errors.txt new file mode 100644 index 00000000000..5952d8b8296 --- /dev/null +++ b/tests/baselines/reference/deleteOperatorInStrictMode.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/deleteOperatorInStrictMode.ts(3,8): error TS1102: 'delete' cannot be called on an identifier in strict mode. + + +==== tests/cases/compiler/deleteOperatorInStrictMode.ts (1 errors) ==== + "use strict" + var a; + delete a; + ~ +!!! error TS1102: 'delete' cannot be called on an identifier in strict mode. \ No newline at end of file diff --git a/tests/baselines/reference/parserStrictMode15.errors.txt b/tests/baselines/reference/parserStrictMode15.errors.txt index 6b650cf1aae..0bcaaf33786 100644 --- a/tests/baselines/reference/parserStrictMode15.errors.txt +++ b/tests/baselines/reference/parserStrictMode15.errors.txt @@ -1,8 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode15.ts(2,8): error TS1102: 'delete' cannot be called on an identifier in strict mode. tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode15.ts(2,8): error TS2304: Cannot find name 'a'. -==== tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode15.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode15.ts (2 errors) ==== "use strict"; delete a; ~ +!!! error TS1102: 'delete' cannot be called on an identifier in strict mode. + ~ !!! error TS2304: Cannot find name 'a'. \ No newline at end of file diff --git a/tests/baselines/reference/parserStrictMode15.js b/tests/baselines/reference/parserStrictMode15.js deleted file mode 100644 index 5fcf91bbddf..00000000000 --- a/tests/baselines/reference/parserStrictMode15.js +++ /dev/null @@ -1,7 +0,0 @@ -//// [parserStrictMode15.ts] -"use strict"; -delete a; - -//// [parserStrictMode15.js] -"use strict"; -delete a; diff --git a/tests/baselines/reference/parserStrictMode7.errors.txt b/tests/baselines/reference/parserStrictMode7.errors.txt index fa4bd066599..6ee6ca43042 100644 --- a/tests/baselines/reference/parserStrictMode7.errors.txt +++ b/tests/baselines/reference/parserStrictMode7.errors.txt @@ -1,8 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode7.ts(2,3): error TS1100: Invalid use of 'eval' in strict mode. tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode7.ts(2,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. -==== tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode7.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/StrictMode/parserStrictMode7.ts (2 errors) ==== "use strict"; ++eval; ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + ~~~~ !!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. \ No newline at end of file diff --git a/tests/baselines/reference/parserStrictMode7.js b/tests/baselines/reference/parserStrictMode7.js deleted file mode 100644 index fafd603da65..00000000000 --- a/tests/baselines/reference/parserStrictMode7.js +++ /dev/null @@ -1,7 +0,0 @@ -//// [parserStrictMode7.ts] -"use strict"; -++eval; - -//// [parserStrictMode7.js] -"use strict"; -++eval; diff --git a/tests/baselines/reference/unaryOperatorsInStrictMode.errors.txt b/tests/baselines/reference/unaryOperatorsInStrictMode.errors.txt new file mode 100644 index 00000000000..34fb760e320 --- /dev/null +++ b/tests/baselines/reference/unaryOperatorsInStrictMode.errors.txt @@ -0,0 +1,62 @@ +tests/cases/compiler/unaryOperatorsInStrictMode.ts(3,3): error TS1100: Invalid use of 'eval' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(4,3): error TS1100: Invalid use of 'eval' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(5,3): error TS1100: Invalid use of 'arguments' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(6,3): error TS1100: Invalid use of 'arguments' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(7,1): error TS1100: Invalid use of 'eval' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(8,1): error TS1100: Invalid use of 'eval' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(9,1): error TS1100: Invalid use of 'arguments' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(10,1): error TS1100: Invalid use of 'arguments' in strict mode. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(3,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(4,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(5,3): error TS2304: Cannot find name 'arguments'. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(6,3): error TS2304: Cannot find name 'arguments'. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(7,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(8,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(9,1): error TS2304: Cannot find name 'arguments'. +tests/cases/compiler/unaryOperatorsInStrictMode.ts(10,1): error TS2304: Cannot find name 'arguments'. + + +==== tests/cases/compiler/unaryOperatorsInStrictMode.ts (16 errors) ==== + "use strict" + + ++eval; + ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + ~~~~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + --eval; + ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + ~~~~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + ++arguments; + ~~~~~~~~~ +!!! error TS1100: Invalid use of 'arguments' in strict mode. + ~~~~~~~~~ +!!! error TS2304: Cannot find name 'arguments'. + --arguments; + ~~~~~~~~~ +!!! error TS1100: Invalid use of 'arguments' in strict mode. + ~~~~~~~~~ +!!! error TS2304: Cannot find name 'arguments'. + eval++; + ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + ~~~~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + eval--; + ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + ~~~~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + arguments++; + ~~~~~~~~~ +!!! error TS1100: Invalid use of 'arguments' in strict mode. + ~~~~~~~~~ +!!! error TS2304: Cannot find name 'arguments'. + arguments--; + ~~~~~~~~~ +!!! error TS1100: Invalid use of 'arguments' in strict mode. + ~~~~~~~~~ +!!! error TS2304: Cannot find name 'arguments'. + \ No newline at end of file diff --git a/tests/cases/compiler/deleteOperatorInStrictMode.ts b/tests/cases/compiler/deleteOperatorInStrictMode.ts new file mode 100644 index 00000000000..48fcd6535be --- /dev/null +++ b/tests/cases/compiler/deleteOperatorInStrictMode.ts @@ -0,0 +1,3 @@ +"use strict" +var a; +delete a; \ No newline at end of file diff --git a/tests/cases/compiler/unaryOperatorsInStrictMode.ts b/tests/cases/compiler/unaryOperatorsInStrictMode.ts new file mode 100644 index 00000000000..1114fd7b7a1 --- /dev/null +++ b/tests/cases/compiler/unaryOperatorsInStrictMode.ts @@ -0,0 +1,10 @@ +"use strict" + +++eval; +--eval; +++arguments; +--arguments; +eval++; +eval--; +arguments++; +arguments--;