Skip to content

[parser] unicode escape in ident key of objlit should not throw keyword error #10438

@pvdz

Description

@pvdz

Bug Report

Current Behavior

Identifiers can have unicode escapes in them. An object literal can have keywords as their properties. An object literal can have a key that has a unicode escape in it. The spec uses the canonical value regardless.

Babel (and Acorn) throw errors for cases that ought to be valid.

Input Code

var y = { bre\u0061k: x } = { break: 42 };

Expected behavior/code

Should not throw an error.

This snippet is creating a binding for x and y. It does not create a binding for break.

Environment

Babel 7.5.5

Possible Solution

Make sure the heuristics properly check whether the ident is actually a binding before throwing the error.

Additional context/Screenshots

There's a slew of (new) test262 cases failing because of this. It is, however, a minor edge case that is low prio to fix :)

test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-break-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-case-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-catch-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-class-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-const-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-continue-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-debugger-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-default-escaped-ext.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-default-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-delete-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-do-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-else-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-export-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-extends-escaped-ext.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-extends-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-finally-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-for-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-function-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-if-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-import-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-in-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-instanceof-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-new-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-return-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-super-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-switch-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-this-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-throw-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-try-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-typeof-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-var-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-void-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-while-escaped.js
test262/test/language/expressions/assignment/dstr/ident-name-prop-name-literal-with-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-break-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-case-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-catch-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-class-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-const-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-continue-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-debugger-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-default-escaped-ext.js
test262/test/language/expressions/assignment/member-expr-ident-name-default-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-delete-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-do-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-else-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-export-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-extends-escaped-ext.js
test262/test/language/expressions/assignment/member-expr-ident-name-extends-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-finally-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-for-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-function-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-if-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-import-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-in-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-instanceof-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-new-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-return-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-super-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-switch-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-this-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-throw-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-try-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-typeof-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-var-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-void-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-while-escaped.js
test262/test/language/expressions/assignment/member-expr-ident-name-with-escaped.js
test262/test/language/expressions/class/ident-name-method-def-break-escaped.js
test262/test/language/expressions/class/ident-name-method-def-case-escaped.js
test262/test/language/expressions/class/ident-name-method-def-catch-escaped.js
test262/test/language/expressions/class/ident-name-method-def-class-escaped.js
test262/test/language/expressions/class/ident-name-method-def-const-escaped.js
test262/test/language/expressions/class/ident-name-method-def-continue-escaped.js
test262/test/language/expressions/class/ident-name-method-def-debugger-escaped.js
test262/test/language/expressions/class/ident-name-method-def-default-escaped-ext.js
test262/test/language/expressions/class/ident-name-method-def-default-escaped.js
test262/test/language/expressions/class/ident-name-method-def-delete-escaped.js
test262/test/language/expressions/class/ident-name-method-def-do-escaped.js
test262/test/language/expressions/class/ident-name-method-def-else-escaped.js
test262/test/language/expressions/class/ident-name-method-def-export-escaped.js
test262/test/language/expressions/class/ident-name-method-def-extends-escaped-ext.js
test262/test/language/expressions/class/ident-name-method-def-extends-escaped.js
test262/test/language/expressions/class/ident-name-method-def-finally-escaped.js
test262/test/language/expressions/class/ident-name-method-def-for-escaped.js
test262/test/language/expressions/class/ident-name-method-def-function-escaped.js
test262/test/language/expressions/class/ident-name-method-def-if-escaped.js
test262/test/language/expressions/class/ident-name-method-def-import-escaped.js
test262/test/language/expressions/class/ident-name-method-def-in-escaped.js
test262/test/language/expressions/class/ident-name-method-def-instanceof-escaped.js
test262/test/language/expressions/class/ident-name-method-def-new-escaped.js
test262/test/language/expressions/class/ident-name-method-def-return-escaped.js
test262/test/language/expressions/class/ident-name-method-def-super-escaped.js
test262/test/language/expressions/class/ident-name-method-def-switch-escaped.js
test262/test/language/expressions/class/ident-name-method-def-this-escaped.js
test262/test/language/expressions/class/ident-name-method-def-throw-escaped.js
test262/test/language/expressions/class/ident-name-method-def-try-escaped.js
test262/test/language/expressions/class/ident-name-method-def-typeof-escaped.js
test262/test/language/expressions/class/ident-name-method-def-var-escaped.js
test262/test/language/expressions/class/ident-name-method-def-void-escaped.js
test262/test/language/expressions/class/ident-name-method-def-while-escaped.js
test262/test/language/expressions/class/ident-name-method-def-with-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-break-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-case-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-catch-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-class-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-const-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-continue-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-debugger-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-default-escaped-ext.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-default-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-delete-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-do-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-else-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-export-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-extends-escaped-ext.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-extends-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-finally-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-for-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-function-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-if-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-import-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-in-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-instanceof-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-new-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-return-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-super-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-switch-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-this-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-throw-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-try-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-typeof-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-var-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-void-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-while-escaped.js
test262/test/language/expressions/object/covered-ident-name-prop-name-literal-with-escaped.js
test262/test/language/expressions/object/ident-name-method-def-break-escaped.js
test262/test/language/expressions/object/ident-name-method-def-case-escaped.js
test262/test/language/expressions/object/ident-name-method-def-catch-escaped.js
test262/test/language/expressions/object/ident-name-method-def-class-escaped.js
test262/test/language/expressions/object/ident-name-method-def-const-escaped.js
test262/test/language/expressions/object/ident-name-method-def-continue-escaped.js
test262/test/language/expressions/object/ident-name-method-def-debugger-escaped.js
test262/test/language/expressions/object/ident-name-method-def-default-escaped-ext.js
test262/test/language/expressions/object/ident-name-method-def-default-escaped.js
test262/test/language/expressions/object/ident-name-method-def-delete-escaped.js
test262/test/language/expressions/object/ident-name-method-def-do-escaped.js
test262/test/language/expressions/object/ident-name-method-def-else-escaped.js
test262/test/language/expressions/object/ident-name-method-def-export-escaped.js
test262/test/language/expressions/object/ident-name-method-def-extends-escaped-ext.js
test262/test/language/expressions/object/ident-name-method-def-extends-escaped.js
test262/test/language/expressions/object/ident-name-method-def-finally-escaped.js
test262/test/language/expressions/object/ident-name-method-def-for-escaped.js
test262/test/language/expressions/object/ident-name-method-def-function-escaped.js
test262/test/language/expressions/object/ident-name-method-def-if-escaped.js
test262/test/language/expressions/object/ident-name-method-def-import-escaped.js
test262/test/language/expressions/object/ident-name-method-def-in-escaped.js
test262/test/language/expressions/object/ident-name-method-def-instanceof-escaped.js
test262/test/language/expressions/object/ident-name-method-def-new-escaped.js
test262/test/language/expressions/object/ident-name-method-def-return-escaped.js
test262/test/language/expressions/object/ident-name-method-def-super-escaped.js
test262/test/language/expressions/object/ident-name-method-def-switch-escaped.js
test262/test/language/expressions/object/ident-name-method-def-this-escaped.js
test262/test/language/expressions/object/ident-name-method-def-throw-escaped.js
test262/test/language/expressions/object/ident-name-method-def-try-escaped.js
test262/test/language/expressions/object/ident-name-method-def-typeof-escaped.js
test262/test/language/expressions/object/ident-name-method-def-var-escaped.js
test262/test/language/expressions/object/ident-name-method-def-void-escaped.js
test262/test/language/expressions/object/ident-name-method-def-while-escaped.js
test262/test/language/expressions/object/ident-name-method-def-with-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-break-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-case-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-catch-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-class-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-const-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-continue-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-debugger-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-default-escaped-ext.js
test262/test/language/expressions/object/ident-name-prop-name-literal-default-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-delete-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-do-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-else-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-export-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-extends-escaped-ext.js
test262/test/language/expressions/object/ident-name-prop-name-literal-extends-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-finally-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-for-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-function-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-if-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-import-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-in-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-instanceof-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-new-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-return-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-super-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-switch-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-this-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-throw-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-try-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-typeof-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-var-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-void-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-while-escaped.js
test262/test/language/expressions/object/ident-name-prop-name-literal-with-escaped.js
test262/test/language/statements/class/ident-name-method-def-break-escaped.js
test262/test/language/statements/class/ident-name-method-def-case-escaped.js
test262/test/language/statements/class/ident-name-method-def-catch-escaped.js
test262/test/language/statements/class/ident-name-method-def-class-escaped.js
test262/test/language/statements/class/ident-name-method-def-const-escaped.js
test262/test/language/statements/class/ident-name-method-def-continue-escaped.js
test262/test/language/statements/class/ident-name-method-def-debugger-escaped.js
test262/test/language/statements/class/ident-name-method-def-default-escaped-ext.js
test262/test/language/statements/class/ident-name-method-def-default-escaped.js
test262/test/language/statements/class/ident-name-method-def-delete-escaped.js
test262/test/language/statements/class/ident-name-method-def-do-escaped.js
test262/test/language/statements/class/ident-name-method-def-else-escaped.js
test262/test/language/statements/class/ident-name-method-def-export-escaped.js
test262/test/language/statements/class/ident-name-method-def-extends-escaped-ext.js
test262/test/language/statements/class/ident-name-method-def-extends-escaped.js
test262/test/language/statements/class/ident-name-method-def-finally-escaped.js
test262/test/language/statements/class/ident-name-method-def-for-escaped.js
test262/test/language/statements/class/ident-name-method-def-function-escaped.js
test262/test/language/statements/class/ident-name-method-def-if-escaped.js
test262/test/language/statements/class/ident-name-method-def-import-escaped.js
test262/test/language/statements/class/ident-name-method-def-in-escaped.js
test262/test/language/statements/class/ident-name-method-def-instanceof-escaped.js
test262/test/language/statements/class/ident-name-method-def-new-escaped.js
test262/test/language/statements/class/ident-name-method-def-return-escaped.js
test262/test/language/statements/class/ident-name-method-def-super-escaped.js
test262/test/language/statements/class/ident-name-method-def-switch-escaped.js
test262/test/language/statements/class/ident-name-method-def-this-escaped.js
test262/test/language/statements/class/ident-name-method-def-throw-escaped.js
test262/test/language/statements/class/ident-name-method-def-try-escaped.js
test262/test/language/statements/class/ident-name-method-def-typeof-escaped.js
test262/test/language/statements/class/ident-name-method-def-var-escaped.js
test262/test/language/statements/class/ident-name-method-def-void-escaped.js
test262/test/language/statements/class/ident-name-method-def-while-escaped.js
test262/test/language/statements/class/ident-name-method-def-with-escaped.js

Metadata

Metadata

Assignees

No one assigned

    Labels

    Has PRoutdatedA closed issue/PR that is archived due to age. Recommended to make a new issuepkg: parser

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions