diff --git a/.changeset/eleven-humans-kneel.md b/.changeset/eleven-humans-kneel.md
new file mode 100644
index 000000000000..bb721a83be7e
--- /dev/null
+++ b/.changeset/eleven-humans-kneel.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: cleanup non-branch effects created inside block effects
diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js
index 2a159724a687..d7ff4a020d78 100644
--- a/packages/svelte/src/internal/client/runtime.js
+++ b/packages/svelte/src/internal/client/runtime.js
@@ -418,6 +418,22 @@ export function destroy_effect_children(signal, remove_dom = false) {
}
}
+/**
+ * @param {Effect} signal
+ * @returns {void}
+ */
+export function destroy_block_effect_children(signal) {
+ var effect = signal.first;
+
+ while (effect !== null) {
+ var next = effect.next;
+ if ((effect.f & BRANCH_EFFECT) === 0) {
+ destroy_effect(effect);
+ }
+ effect = next;
+ }
+}
+
/**
* @param {Effect} effect
* @returns {void}
@@ -443,7 +459,9 @@ export function update_effect(effect) {
}
try {
- if ((flags & BLOCK_EFFECT) === 0) {
+ if ((flags & BLOCK_EFFECT) !== 0) {
+ destroy_block_effect_children(effect);
+ } else {
destroy_effect_children(effect);
}
diff --git a/packages/svelte/tests/runtime-runes/samples/clean-block-inner-effects/_config.js b/packages/svelte/tests/runtime-runes/samples/clean-block-inner-effects/_config.js
new file mode 100644
index 000000000000..6e42ebeadfbd
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/clean-block-inner-effects/_config.js
@@ -0,0 +1,13 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ async test({ assert, target, instance, logs }) {
+ const button = target.querySelector('button');
+ assert.deepEqual(logs, ['effect', 1]);
+ flushSync(() => {
+ button?.click();
+ });
+ assert.deepEqual(logs, ['effect', 1, 'clean', 1, 'effect', 2]);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/clean-block-inner-effects/main.svelte b/packages/svelte/tests/runtime-runes/samples/clean-block-inner-effects/main.svelte
new file mode 100644
index 000000000000..cd46715a7e2a
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/clean-block-inner-effects/main.svelte
@@ -0,0 +1,18 @@
+
+
+{#if track(count)}
+{/if}
+
+