Properly disallow yield in bodyless arrows (#61976)

This commit is contained in:
Mateusz Burzyński 2025-06-30 23:52:49 +02:00 committed by GitHub
parent b70d4d7e4b
commit 1ea1809e16
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 77 additions and 0 deletions

View File

@ -5559,12 +5559,15 @@ namespace Parser {
return parseFunctionBlock(SignatureFlags.IgnoreMissingOpenBrace | (isAsync ? SignatureFlags.Await : SignatureFlags.None));
}
const savedYieldContext = inYieldContext();
setYieldContext(false);
const savedTopLevel = topLevel;
topLevel = false;
const node = isAsync
? doInAwaitContext(() => parseAssignmentExpressionOrHigher(allowReturnTypeInArrowFunction))
: doOutsideOfAwaitContext(() => parseAssignmentExpressionOrHigher(allowReturnTypeInArrowFunction));
topLevel = savedTopLevel;
setYieldContext(savedYieldContext);
return node;
}

View File

@ -0,0 +1,12 @@
YieldExpression20_es6.ts(3,8): error TS1163: A 'yield' expression is only allowed in a generator body.
==== YieldExpression20_es6.ts (1 errors) ====
function* test() {
return () => ({
b: yield 2, // error
~~~~~
!!! error TS1163: A 'yield' expression is only allowed in a generator body.
});
}

View File

@ -0,0 +1,16 @@
//// [tests/cases/conformance/es6/yieldExpressions/YieldExpression20_es6.ts] ////
//// [YieldExpression20_es6.ts]
function* test() {
return () => ({
b: yield 2, // error
});
}
//// [YieldExpression20_es6.js]
function* test() {
return () => ({
b: yield 2, // error
});
}

View File

@ -0,0 +1,13 @@
//// [tests/cases/conformance/es6/yieldExpressions/YieldExpression20_es6.ts] ////
=== YieldExpression20_es6.ts ===
function* test() {
>test : Symbol(test, Decl(YieldExpression20_es6.ts, 0, 0))
return () => ({
b: yield 2, // error
>b : Symbol(b, Decl(YieldExpression20_es6.ts, 1, 17))
});
}

View File

@ -0,0 +1,26 @@
//// [tests/cases/conformance/es6/yieldExpressions/YieldExpression20_es6.ts] ////
=== YieldExpression20_es6.ts ===
function* test() {
>test : () => Generator<never, () => { b: any; }, unknown>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return () => ({
>() => ({ b: yield 2, // error }) : () => { b: any; }
> : ^^^^^^^^^^^^^^^^^
>({ b: yield 2, // error }) : { b: any; }
> : ^^^^^^^^^^^
>{ b: yield 2, // error } : { b: any; }
> : ^^^^^^^^^^^
b: yield 2, // error
>b : any
> : ^^^
>yield 2 : any
> : ^^^
>2 : 2
> : ^
});
}

View File

@ -0,0 +1,7 @@
// @target: es6
function* test() {
return () => ({
b: yield 2, // error
});
}