diff --git a/.changeset/sharp-spies-live.md b/.changeset/sharp-spies-live.md
new file mode 100644
index 0000000000..0ddbde97ed
--- /dev/null
+++ b/.changeset/sharp-spies-live.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: error on `bind:this` to each block parameter
diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js
index eda5ed42b0..296104b050 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/validation.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js
@@ -385,33 +385,31 @@ const validation = {
const binding = context.state.scope.get(left.name);
- if (
- assignee.type === 'Identifier' &&
- node.name !== 'this' // bind:this also works for regular variables
- ) {
+ if (assignee.type === 'Identifier') {
// reassignment
if (
- !binding ||
- (binding.kind !== 'state' &&
- binding.kind !== 'frozen_state' &&
- binding.kind !== 'prop' &&
- binding.kind !== 'bindable_prop' &&
- binding.kind !== 'each' &&
- binding.kind !== 'store_sub' &&
- !binding.mutated)
+ node.name !== 'this' && // bind:this also works for regular variables
+ (!binding ||
+ (binding.kind !== 'state' &&
+ binding.kind !== 'frozen_state' &&
+ binding.kind !== 'prop' &&
+ binding.kind !== 'bindable_prop' &&
+ binding.kind !== 'each' &&
+ binding.kind !== 'store_sub' &&
+ !binding.mutated))
) {
e.bind_invalid_value(node.expression);
}
- if (binding.kind === 'derived') {
+ if (binding?.kind === 'derived') {
e.constant_binding(node.expression, 'derived state');
}
- if (context.state.analysis.runes && binding.kind === 'each') {
+ if (context.state.analysis.runes && binding?.kind === 'each') {
e.each_item_invalid_assignment(node);
}
- if (binding.kind === 'snippet') {
+ if (binding?.kind === 'snippet') {
e.snippet_parameter_assignment(node);
}
}
diff --git a/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/_config.js b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/_config.js
new file mode 100644
index 0000000000..524c2f161c
--- /dev/null
+++ b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/_config.js
@@ -0,0 +1,9 @@
+import { test } from '../../test';
+
+export default test({
+ error: {
+ code: 'each_item_invalid_assignment',
+ message:
+ 'Cannot reassign or bind to each block argument in runes mode. Use the array and index variables instead (e.g. `array[i] = value` instead of `entry = value`)'
+ }
+});
diff --git a/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/main.svelte b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/main.svelte
new file mode 100644
index 0000000000..f6d887d048
--- /dev/null
+++ b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/main.svelte
@@ -0,0 +1,11 @@
+
+
+{#each array as { id, element } (id)}
+
+{/each}