Bug 212886 - Redeclaration of a function* inside a block definition
Summary: Redeclaration of a function* inside a block definition
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: Other
Hardware: PC Linux
: P2 Normal
Assignee: Nobody
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2020-06-07 14:58 PDT by Jefferson Junior
Modified: 2020-09-08 09:26 PDT (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jefferson Junior 2020-06-07 14:58:50 PDT
Hi everyone,
I found a case of redeclaration of a generator function inside a block definition.

version: 262693
OS: Linux Ubuntu 19.10 x64

steps to reproduce:

{ 
    function* f() { yield 1 }
    function f() { print(2) }
}
f()
Actual results:
2

Expected results:
SyntaxError: Identifier 'f' has already been declared

V8, SpiderMonkey works as expected.

cinfuzz
Comment 1 Radar WebKit Bug Importer 2020-06-09 17:39:53 PDT
<rdar://problem/64188468>
Comment 2 Rick Waldron 2020-09-08 09:25:05 PDT
This bug affects every combination with a lexical declaration in a block, in non-strict mode code (strict mode code is correct). 


{ async function f() {} async function f() {} }

{ async function f() {} async function* f() {} }

{ async function* f() {} async function f() {} }

{ async function* f() {} async function* f() {} }

{ async function f() {} class f {} }

{ async function* f() {} class f {} }

{ async function f() {} const f = 0 }

{ async function* f() {} const f = 0 }

{ async function f() {} function f() {} }

{ async function* f() {} function f() {} }

{ async function f() {} function* f() {} }

{ async function* f() {} function* f() {} }

{ async function f() {} let f }

{ async function* f() {} let f }

{ async function f() {} var f }

{ async function* f() {} var f }

{ class f {} async function f() {} }

{ class f {} async function* f() {} }

{ class f {} function f() {} }

{ class f {} function* f() {} }

{ const f = 0; async function f() {} }

{ const f = 0; async function* f() {} }

{ const f = 0; function f() {} }

{ const f = 0; function* f() {} }

{ function f() {} async function f() {} }

{ function f() {} async function* f() {} }

{ function f() {} class f {} }

{ function f() {} const f = 0 }

{ function f() {} function* f() {} }

{ function f() {} let f }

{ function f() {} var f }

{ function* f() {} async function f() {} }

{ function* f() {} async function* f() {} }

{ function* f() {} class f {} }

{ function* f() {} const f = 0 }

{ function* f() {} function f() {} }

{ function* f() {} function* f() {} }

{ function* f() {} let f }

{ function* f() {} var f }

{ async function f() {}; { var f; } }

{ async function* f() {}; { var f; } }

{ function f() {} { var f; } }

{ function* f() {}; { var f; } }

{ let f; async function f() {} }

{ let f; async function* f() {} }

{ let f; function f() {} }

{ let f; function* f() {} }

{ var f; async function f() {} }

{ var f; async function* f() {} }

{ var f; function f() {} }

{ var f; function* f() {} }

{ async function f() {}; var f; }

{ async function* f() {}; var f; }

{ function f() {}; var f; }

{ function* f() {}; var f; }




These fail in both strict mode code and non-strict mode code: 


{ { var f; } async function f() {}; }

{ { var f; } async function* f() {}; }

{ { var f; } function f() {} }

{ { var f; } function* f() {}; }

{ var f; async function f() {} }

{ var f; async function* f() {} }

{ var f; function f() {} }

{ var f; function* f() {} }



In all cases show here, a SyntaxError exception should be thrown at parse time.
Comment 3 Rick Waldron 2020-09-08 09:26:16 PDT
Fixing this issue would bring JSC into 100% interop with V8 and SpiderMonkey