Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
pvdz opened this issue Sep 13, 2019 · 4 comments · Fixed by #10455
Closed

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

pvdz opened this issue Sep 13, 2019 · 4 comments · Fixed by #10455
Labels
Has PR i: bug outdated A closed issue/PR that is archived due to age. Recommended to make a new issue pkg: parser

Comments

@pvdz
Copy link

pvdz commented Sep 13, 2019

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

@babel-bot
Copy link
Collaborator

Hey @pvdz! We really appreciate you taking the time to report an issue. The collaborators on this project attempt to help as many people as possible, but we're a limited number of volunteers, so it's possible this won't be addressed swiftly.

If you need any help, or just have general Babel or JavaScript questions, we have a vibrant Slack community that typically always has someone willing to help. You can sign-up here for an invite.

@bakkot
Copy link
Contributor

bakkot commented Sep 13, 2019

The tests are only a month old and have not yet been upstreamed into this project (the last update was six months ago).

@pvdz
Copy link
Author

pvdz commented Sep 13, 2019

@bakkot hah, fair enough. I didn't check their age :)

@pvdz
Copy link
Author

pvdz commented Sep 19, 2019

Nice :)

@lock lock bot added the outdated A closed issue/PR that is archived due to age. Recommended to make a new issue label Dec 19, 2019
@lock lock bot locked as resolved and limited conversation to collaborators Dec 19, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Has PR i: bug outdated A closed issue/PR that is archived due to age. Recommended to make a new issue pkg: parser
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants