diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 5a8dcb5af89..3a173c891bc 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1608,7 +1608,7 @@ namespace ts { * If `node` is a BinaryExpression, adds it to the local work stack, otherwise recursively binds it */ function maybeBind(node: Node) { - if (node && isBinaryExpression(node)) { + if (node && isBinaryExpression(node) && !isDestructuringAssignment(node)) { stackIndex++; workStacks.expr[stackIndex] = node; workStacks.state[stackIndex] = BindBinaryExpressionFlowState.BindThenBindChildren; diff --git a/tests/baselines/reference/controlFlowAssignmentPatternOrder.symbols b/tests/baselines/reference/controlFlowAssignmentPatternOrder.symbols index b3b7d3ba4c4..cc3aa5e3509 100644 --- a/tests/baselines/reference/controlFlowAssignmentPatternOrder.symbols +++ b/tests/baselines/reference/controlFlowAssignmentPatternOrder.symbols @@ -1,70 +1,218 @@ === tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts === // https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363 +declare function f(): void; +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) { let a: 0 | 1 = 0; ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7)) let b: 0 | 1 | 9; ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7)) [{ [(a = 1)]: b } = [9, a] as const] = []; ->[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 4, 6)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7)) +>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 5, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7)) const bb: 0 = b; ->bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 5, 9)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7)) +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 6, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7)) } { let a: 0 | 1 = 1; ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7)) let b: 0 | 1 | 9; ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7)) [{ [a]: b } = [9, a = 0] as const] = []; ->[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 10, 6)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7)) +>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 11, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7)) const bb: 9 = b; ->bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 11, 9)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7)) +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 12, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7)) } { let a: 0 | 1 = 0; ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7)) let b: 0 | 1 | 8 | 9; ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7)) [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const]; ->[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 16, 6)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7)) +>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 17, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7)) const bb: 0 | 8 = b; ->bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 17, 9)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7)) +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 18, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7)) } { let a: 0 | 1 = 1; ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7)) let b: 0 | 1 | 8 | 9; ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7)) [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const]; ->[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 22, 6)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7)) ->a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7)) +>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 23, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7)) const bb: 0 | 8 = b; ->bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 23, 9)) ->b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7)) +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 24, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7)) +} +// same as above but on left of a binary expression +{ + let a: 0 | 1 = 0; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7)) + + let b: 0 | 1 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7)) + + [{ [(a = 1)]: b } = [9, a] as const] = [], f(); +>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 30, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7)) +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) + + const bb: 0 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 31, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7)) +} +{ + let a: 0 | 1 = 1; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7)) + + let b: 0 | 1 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7)) + + [{ [a]: b } = [9, a = 0] as const] = [], f(); +>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 36, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7)) +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) + + const bb: 9 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 37, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7)) +} +{ + let a: 0 | 1 = 0; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7)) + + let b: 0 | 1 | 8 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7)) + + [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f(); +>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 42, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7)) +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) + + const bb: 0 | 8 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 43, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7)) +} +{ + let a: 0 | 1 = 1; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7)) + + let b: 0 | 1 | 8 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7)) + + [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f(); +>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 48, 6)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7)) +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) + + const bb: 0 | 8 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 49, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7)) +} +// same as above but on right of a binary expression +{ + let a: 0 | 1 = 0; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7)) + + let b: 0 | 1 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7)) + + f(), [{ [(a = 1)]: b } = [9, a] as const] = []; +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) +>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 55, 11)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7)) + + const bb: 0 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 56, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7)) +} +{ + let a: 0 | 1 = 1; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7)) + + let b: 0 | 1 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7)) + + f(), [{ [a]: b } = [9, a = 0] as const] = []; +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) +>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 61, 11)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7)) + + const bb: 9 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 62, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7)) +} +{ + let a: 0 | 1 = 0; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7)) + + let b: 0 | 1 | 8 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7)) + + f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const]; +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) +>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 67, 11)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7)) + + const bb: 0 | 8 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 68, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7)) +} +{ + let a: 0 | 1 = 1; +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7)) + + let b: 0 | 1 | 8 | 9; +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7)) + + f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const]; +>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0)) +>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 73, 11)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7)) +>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7)) + + const bb: 0 | 8 = b; +>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 74, 9)) +>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7)) } diff --git a/tests/baselines/reference/controlFlowAssignmentPatternOrder.types b/tests/baselines/reference/controlFlowAssignmentPatternOrder.types index 0df2eda9106..d0802ee9228 100644 --- a/tests/baselines/reference/controlFlowAssignmentPatternOrder.types +++ b/tests/baselines/reference/controlFlowAssignmentPatternOrder.types @@ -1,5 +1,7 @@ === tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts === // https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363 +declare function f(): void; +>f : () => void { let a: 0 | 1 = 0; >a : 0 | 1 @@ -122,3 +124,273 @@ >bb : 0 | 8 >b : 0 | 8 } +// same as above but on left of a binary expression +{ + let a: 0 | 1 = 0; +>a : 0 | 1 +>0 : 0 + + let b: 0 | 1 | 9; +>b : 0 | 1 | 9 + + [{ [(a = 1)]: b } = [9, a] as const] = [], f(); +>[{ [(a = 1)]: b } = [9, a] as const] = [], f() : void +>[{ [(a = 1)]: b } = [9, a] as const] = [] : [] +>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]] +>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0] +>{ [(a = 1)]: b } : { 1: 0 | 1 | 9; } +>[(a = 1)] : 0 | 1 | 9 +>(a = 1) : 1 +>a = 1 : 1 +>a : 0 | 1 +>1 : 1 +>b : 0 | 1 | 9 +>[9, a] as const : readonly [9, 0] +>[9, a] : readonly [9, 0] +>9 : 9 +>a : 0 +>[] : [] +>f() : void +>f : () => void + + const bb: 0 = b; +>bb : 0 +>b : 0 +} +{ + let a: 0 | 1 = 1; +>a : 0 | 1 +>1 : 1 + + let b: 0 | 1 | 9; +>b : 0 | 1 | 9 + + [{ [a]: b } = [9, a = 0] as const] = [], f(); +>[{ [a]: b } = [9, a = 0] as const] = [], f() : void +>[{ [a]: b } = [9, a = 0] as const] = [] : [] +>[{ [a]: b } = [9, a = 0] as const] : [readonly [9, 0]] +>{ [a]: b } = [9, a = 0] as const : readonly [9, 0] +>{ [a]: b } : { 0: 0 | 1 | 9; } +>[a] : 0 | 1 | 9 +>a : 0 +>b : 0 | 1 | 9 +>[9, a = 0] as const : readonly [9, 0] +>[9, a = 0] : readonly [9, 0] +>9 : 9 +>a = 0 : 0 +>a : 0 | 1 +>0 : 0 +>[] : [] +>f() : void +>f : () => void + + const bb: 9 = b; +>bb : 9 +>b : 9 +} +{ + let a: 0 | 1 = 0; +>a : 0 | 1 +>0 : 0 + + let b: 0 | 1 | 8 | 9; +>b : 0 | 1 | 9 | 8 + + [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f(); +>[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f() : void +>[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const] : [readonly [9, 8]] +>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]] +>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0] +>{ [(a = 1)]: b } : { 1: 0 | 1 | 9 | 8; } +>[(a = 1)] : 0 | 1 | 9 | 8 +>(a = 1) : 1 +>a = 1 : 1 +>a : 0 | 1 +>1 : 1 +>b : 0 | 1 | 9 | 8 +>[9, a] as const : readonly [9, 0] +>[9, a] : readonly [9, 0] +>9 : 9 +>a : 0 +>[[9, 8] as const] : [readonly [9, 8]] +>[9, 8] as const : readonly [9, 8] +>[9, 8] : readonly [9, 8] +>9 : 9 +>8 : 8 +>f() : void +>f : () => void + + const bb: 0 | 8 = b; +>bb : 0 | 8 +>b : 0 | 8 +} +{ + let a: 0 | 1 = 1; +>a : 0 | 1 +>1 : 1 + + let b: 0 | 1 | 8 | 9; +>b : 0 | 1 | 9 | 8 + + [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f(); +>[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f() : void +>[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const] : [readonly [8, 9]] +>[{ [a]: b } = [a = 0, 9] as const] : [readonly [0, 9]] +>{ [a]: b } = [a = 0, 9] as const : readonly [0, 9] +>{ [a]: b } : { 0: 0 | 1 | 9 | 8; } +>[a] : 0 | 1 | 9 | 8 +>a : 0 +>b : 0 | 1 | 9 | 8 +>[a = 0, 9] as const : readonly [0, 9] +>[a = 0, 9] : readonly [0, 9] +>a = 0 : 0 +>a : 0 | 1 +>0 : 0 +>9 : 9 +>[[8, 9] as const] : [readonly [8, 9]] +>[8, 9] as const : readonly [8, 9] +>[8, 9] : readonly [8, 9] +>8 : 8 +>9 : 9 +>f() : void +>f : () => void + + const bb: 0 | 8 = b; +>bb : 0 | 8 +>b : 0 | 8 +} +// same as above but on right of a binary expression +{ + let a: 0 | 1 = 0; +>a : 0 | 1 +>0 : 0 + + let b: 0 | 1 | 9; +>b : 0 | 1 | 9 + + f(), [{ [(a = 1)]: b } = [9, a] as const] = []; +>f(), [{ [(a = 1)]: b } = [9, a] as const] = [] : [] +>f() : void +>f : () => void +>[{ [(a = 1)]: b } = [9, a] as const] = [] : [] +>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]] +>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0] +>{ [(a = 1)]: b } : { 1: 0 | 1 | 9; } +>[(a = 1)] : 0 | 1 | 9 +>(a = 1) : 1 +>a = 1 : 1 +>a : 0 | 1 +>1 : 1 +>b : 0 | 1 | 9 +>[9, a] as const : readonly [9, 0] +>[9, a] : readonly [9, 0] +>9 : 9 +>a : 0 +>[] : [] + + const bb: 0 = b; +>bb : 0 +>b : 0 +} +{ + let a: 0 | 1 = 1; +>a : 0 | 1 +>1 : 1 + + let b: 0 | 1 | 9; +>b : 0 | 1 | 9 + + f(), [{ [a]: b } = [9, a = 0] as const] = []; +>f(), [{ [a]: b } = [9, a = 0] as const] = [] : [] +>f() : void +>f : () => void +>[{ [a]: b } = [9, a = 0] as const] = [] : [] +>[{ [a]: b } = [9, a = 0] as const] : [readonly [9, 0]] +>{ [a]: b } = [9, a = 0] as const : readonly [9, 0] +>{ [a]: b } : { 0: 0 | 1 | 9; } +>[a] : 0 | 1 | 9 +>a : 0 +>b : 0 | 1 | 9 +>[9, a = 0] as const : readonly [9, 0] +>[9, a = 0] : readonly [9, 0] +>9 : 9 +>a = 0 : 0 +>a : 0 | 1 +>0 : 0 +>[] : [] + + const bb: 9 = b; +>bb : 9 +>b : 9 +} +{ + let a: 0 | 1 = 0; +>a : 0 | 1 +>0 : 0 + + let b: 0 | 1 | 8 | 9; +>b : 0 | 1 | 9 | 8 + + f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const]; +>f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const] : [readonly [9, 8]] +>f() : void +>f : () => void +>[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const] : [readonly [9, 8]] +>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]] +>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0] +>{ [(a = 1)]: b } : { 1: 0 | 1 | 9 | 8; } +>[(a = 1)] : 0 | 1 | 9 | 8 +>(a = 1) : 1 +>a = 1 : 1 +>a : 0 | 1 +>1 : 1 +>b : 0 | 1 | 9 | 8 +>[9, a] as const : readonly [9, 0] +>[9, a] : readonly [9, 0] +>9 : 9 +>a : 0 +>[[9, 8] as const] : [readonly [9, 8]] +>[9, 8] as const : readonly [9, 8] +>[9, 8] : readonly [9, 8] +>9 : 9 +>8 : 8 + + const bb: 0 | 8 = b; +>bb : 0 | 8 +>b : 0 | 8 +} +{ + let a: 0 | 1 = 1; +>a : 0 | 1 +>1 : 1 + + let b: 0 | 1 | 8 | 9; +>b : 0 | 1 | 9 | 8 + + f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const]; +>f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const] : [readonly [8, 9]] +>f() : void +>f : () => void +>[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const] : [readonly [8, 9]] +>[{ [a]: b } = [a = 0, 9] as const] : [readonly [0, 9]] +>{ [a]: b } = [a = 0, 9] as const : readonly [0, 9] +>{ [a]: b } : { 0: 0 | 1 | 9 | 8; } +>[a] : 0 | 1 | 9 | 8 +>a : 0 +>b : 0 | 1 | 9 | 8 +>[a = 0, 9] as const : readonly [0, 9] +>[a = 0, 9] : readonly [0, 9] +>a = 0 : 0 +>a : 0 | 1 +>0 : 0 +>9 : 9 +>[[8, 9] as const] : [readonly [8, 9]] +>[8, 9] as const : readonly [8, 9] +>[8, 9] : readonly [8, 9] +>8 : 8 +>9 : 9 + + const bb: 0 | 8 = b; +>bb : 0 | 8 +>b : 0 | 8 +} diff --git a/tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts b/tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts index 2c8fcaf16c3..d18f2ca7106 100644 --- a/tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts +++ b/tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts @@ -2,6 +2,7 @@ // @noEmit: true // https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363 +declare function f(): void; { let a: 0 | 1 = 0; let b: 0 | 1 | 9; @@ -25,4 +26,54 @@ let b: 0 | 1 | 8 | 9; [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const]; const bb: 0 | 8 = b; +} +// same as above but on left of a binary expression +{ + let a: 0 | 1 = 0; + let b: 0 | 1 | 9; + [{ [(a = 1)]: b } = [9, a] as const] = [], f(); + const bb: 0 = b; +} +{ + let a: 0 | 1 = 1; + let b: 0 | 1 | 9; + [{ [a]: b } = [9, a = 0] as const] = [], f(); + const bb: 9 = b; +} +{ + let a: 0 | 1 = 0; + let b: 0 | 1 | 8 | 9; + [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f(); + const bb: 0 | 8 = b; +} +{ + let a: 0 | 1 = 1; + let b: 0 | 1 | 8 | 9; + [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f(); + const bb: 0 | 8 = b; +} +// same as above but on right of a binary expression +{ + let a: 0 | 1 = 0; + let b: 0 | 1 | 9; + f(), [{ [(a = 1)]: b } = [9, a] as const] = []; + const bb: 0 = b; +} +{ + let a: 0 | 1 = 1; + let b: 0 | 1 | 9; + f(), [{ [a]: b } = [9, a = 0] as const] = []; + const bb: 9 = b; +} +{ + let a: 0 | 1 = 0; + let b: 0 | 1 | 8 | 9; + f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const]; + const bb: 0 | 8 = b; +} +{ + let a: 0 | 1 = 1; + let b: 0 | 1 | 8 | 9; + f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const]; + const bb: 0 | 8 = b; } \ No newline at end of file