diff --git a/.changeset/cool-garlics-fail.md b/.changeset/cool-garlics-fail.md
new file mode 100644
index 0000000000..cabff1840d
--- /dev/null
+++ b/.changeset/cool-garlics-fail.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: place instance-level snippets inside async body
diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js
index 940d6a9e00..bdd7eb3f17 100644
--- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js
+++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js
@@ -362,12 +362,12 @@ export function client_component(analysis, options) {
store_init,
...store_setup,
...legacy_reactive_declarations,
- ...group_binding_declarations,
- ...state.instance_level_snippets
+ ...group_binding_declarations
]);
if (analysis.instance.has_await) {
const body = b.block([
+ ...state.instance_level_snippets,
.../** @type {ESTree.Statement[]} */ (instance.body),
b.if(b.call('$.aborted'), b.return()),
.../** @type {ESTree.Statement[]} */ (template.body)
@@ -375,7 +375,10 @@ export function client_component(analysis, options) {
component_block.body.push(b.stmt(b.call(`$.async_body`, b.arrow([], body, true))));
} else {
- component_block.body.push(.../** @type {ESTree.Statement[]} */ (instance.body));
+ component_block.body.push(
+ ...state.instance_level_snippets,
+ .../** @type {ESTree.Statement[]} */ (instance.body)
+ );
if (!analysis.runes && analysis.needs_context) {
component_block.body.push(b.stmt(b.call('$.init', analysis.immutable ? b.true : undefined)));
diff --git a/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js
new file mode 100644
index 0000000000..b3b2f272f1
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js
@@ -0,0 +1,9 @@
+import { tick } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ async test({ assert, target }) {
+ await tick();
+ assert.htmlEqual(target.innerHTML, 'value');
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte
new file mode 100644
index 0000000000..27b29cfe50
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte
@@ -0,0 +1,9 @@
+
+
+{#snippet valueSnippet()}
+ {value}
+{/snippet}
+
+{@render valueSnippet()}
\ No newline at end of file
diff --git a/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte
new file mode 100644
index 0000000000..c251a5645b
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte
@@ -0,0 +1,8 @@
+
+
+ {#snippet pending()}
+ {/snippet}
+
+
\ No newline at end of file