diff --git a/src/ast/nodes/ForOfStatement.ts b/src/ast/nodes/ForOfStatement.ts index b3e9e63244b..ea4f40795c1 100644 --- a/src/ast/nodes/ForOfStatement.ts +++ b/src/ast/nodes/ForOfStatement.ts @@ -3,7 +3,7 @@ import { NO_SEMICOLON, type RenderOptions } from '../../utils/renderHelpers'; import type { InclusionContext } from '../ExecutionContext'; import BlockScope from '../scopes/BlockScope'; import type Scope from '../scopes/Scope'; -import { EMPTY_PATH } from '../utils/PathTracker'; +import { EMPTY_PATH, UNKNOWN_PATH } from '../utils/PathTracker'; import type MemberExpression from './MemberExpression'; import type * as NodeType from './NodeType'; import type VariableDeclaration from './VariableDeclaration'; @@ -60,6 +60,7 @@ export default class ForOfStatement extends StatementBase { protected applyDeoptimizations(): void { this.deoptimized = true; this.left.deoptimizePath(EMPTY_PATH); + this.right.deoptimizePath(UNKNOWN_PATH); this.context.requestTreeshakingPass(); } } diff --git a/test/function/samples/deoptimize-loop-element/_config.js b/test/function/samples/deoptimize-loop-element/_config.js new file mode 100644 index 00000000000..0e0cd6ac573 --- /dev/null +++ b/test/function/samples/deoptimize-loop-element/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'deoptimizes the loop element when it is reassigned' +}; diff --git a/test/function/samples/deoptimize-loop-element/main.js b/test/function/samples/deoptimize-loop-element/main.js new file mode 100644 index 00000000000..a5a0d0d5edb --- /dev/null +++ b/test/function/samples/deoptimize-loop-element/main.js @@ -0,0 +1,7 @@ +const foo = [{ value: 1 }]; + +for (const item of foo) { + item.value = 0; +} + +assert.ok(foo[0].value === 0 ? true : false);